您的位置:首页 > 数据库 > Redis

Redis入门 -学习笔记(1)

2016-08-15 22:19 661 查看

1.Redis入门

官网地址

中文文档地址

centos7 Redis安装教程 (我用的腾讯云学生机参考的这个)

简介

开源,高性能,键值对(key-value)存储的缓存系统

存储在内存中,所以速度快。异步存储到硬盘中,不影响服务。

每个键设置生存时间TTL —->缓存。

安装(略)

启动和停止

redis-server            redis服务器
redis-cli               redis客户端
redis-cli shutdown      redis关闭


1.遇到的问题及解决

我在使用redis-cli执行ping命令时候无响应,原因其实是启动redis-server 时候 按了
ctrl+z
导致redis服务挂起,所以shutdown 和 ping 都无响应

解决办法:

用终止进程的方法,执行命令

ps -ef |grep redis  #查询正在运行的redis进程 找到PID 号


之后执行

kill -9 PID         #PID是你查到的进程号


之后重启redis-server

redis-server &      #&表示在后台运行


不要按ctrl+z。。。。

等一会。。。

一会。。。

好。。。

ctrl-c 是发送SIGINT信号,终止一个进程;
ctrl-z 是发送 SIGSTOP信号,挂起一个进程;
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。
可以通过jobs查看当前有多少在后台运行的命令;
通过fg命令将后台中的命令调至前台继续运行;
也可以用bg将一个在后台暂停的命令,变成继续执行 (在后台执行)


2. redis 默认使用6379 port

redis-server --port 6400        自定义端口


3. redis-cli PING 命令来检测客户端是否与Redis连接正常(也可以在交互模式下执行PING)

PONG #回复这个表示连接正常


4. redis-cli info 命令 可用来监控

# Server
redis_version:3.0.0         #redis版本
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:17f78a051f40b183
redis_mode:standalone
os:Linux 3.10.0-123.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5           #gcc版本
process_id:21941            #当前redis进程号 kill的就是这个!
run_id:d0cd9b6915b1bbe4c60d0a00cf8fff438a7f389b
tcp_port:6379               #端口号
uptime_in_seconds:1026      #启动后运行的时间
uptime_in_days:0
hz:10
lru_clock:11309124
config_file:

# Clients                   #客户端
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
...


5. 多数据库

Redis默认支持16个数据库,客户端可以指定把数据存在哪一个数据库里面

127.0.0.1:6379[1]> SELECT 0     #默认就是选择0号数据库
OK
127.0.0.1:6379> GET menduo      #上面存过的键值对
"21"                            #得到结果
127.0.0.1:6379> SELECT 1        #切换到1号数据库
OK
127.0.0.1:6379[1]> GET menduo
(nil)                           #由于没有menduo这个键值对返回空


2.key相关基本操作(更多请参考文档)

127.0.0.1:6379> keys *                  #取到所有key
1) "posts:count"
...
6) "k1"
7) "car"
8) "k3"
9) "k2"
10) "wangergou"
11) "num"
127.0.0.1:6379> DEL key k1 k2 k3        #删除指定的key 可以一个也可以删除多个
(integer) 3
127.0.0.1:6379> KEYS *
1) "posts:count"
...
6) "car"
7) "wangergou"
8) "num"


127.0.0.1:6379> type menduo             #返回指定key的类型
string


127.0.0.1:6379> exists java             #检查对应类型是否存在
(integer) 1                             #存在返回1
127.0.0.1:6379> exists javaa            #不存在返回0
(integer) 0


127.0.0.1:6379> set time 5
OK
127.0.0.1:6379> expire time 5           #设置对应key的过期时间
(integer) 1
127.0.0.1:6379> get time
"5"
127.0.0.1:6379> get time                #5秒后 取对应key的值,不存在了。
(nil)


127.0.0.1:6379> set time 5
OK
127.0.0.1:6379> expire time 3600
(integer) 1
127.0.0.1:6379> PTTL time           #返回剩余的毫秒数,相应的还有TTL命令返回剩余秒数
(integer) 3581276
127.0.0.1:6379> PERSIST time            #删除key的过期时间
(integer) 1
127.0.0.1:6379> TTL time                #删除后过期时间为-1
(integer) -1


127.0.0.1:6379> MOVE java 1             #移动key到 另一数据库(前面说过redis数据库是编号的,默认是0。这里将key移动到1号)
(integer) 1
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> GET java
"I LOVE YOU,BUT PHP..."
127.0.0.1:6379[1]> SELECT 0             #再回到0号 对应key不存在了返回0
OK
127.0.0.1:6379> GET java
(nil)


127.0.0.1:6379[1]> RENAME java php      #重命名key
OK
127.0.0.1:6379[1]> GET php
"I LOVE YOU,BUT PHP..."


3. 基本类型

redis一共有五种基本类型 分别是
Strings
(字符串)、
Lists
(列表)、
Hashes
(哈希)、
Sets
(集合)、
Sorted Sets
(有序集合)

Strings 字符串类型

一个字符串类型的值最多能存储512M字节的内容。

基本指令

127.0.0.1:6379> SET java "I LOVE YOU"   #设置对应key的value值
OK
127.0.0.1:6379> GET java                #根据key取到value
"I LOVE YOU"
127.0.0.1:6379> APPEND java ",BUT PHP..."   #像对应key尾部追加字符串
(integer) 21
127.0.0.1:6379> GET java                    #结果
"I LOVE YOU,BUT PHP..."
127.0.0.1:6379> STRLEN java                 #得到对应key 字符串长度
(integer) 21

127.0.0.1:6379[1]> SETNX php ...        #当key存在时,不执行设置命令并返回0
(integer) 0
127.0.0.1:6379[1]> SETNX php2 ...       #当key不存在,进行设置返回1
(integer) 1
127.0.0.1:6379[1]> keys *
1) "php2"
2) "php"

127.0.0.1:6379[1]> GET php
"I LOVE YOU,BUT PHP..."
127.0.0.1:6379[1]> GETRANGE php 0 5         #getrange 用于截取字符串
"I LOVE"

MGET MSET #这两个命令是用来获取/设置 多个key的value
GETBIT key 数字 #获取对用应数字位的值 0或1 。数字叫offset 偏移量


INCR
命令 递增.如果redis没有这个字段,则创建并且初始化1,下次在调用则为2

127.0.0.1:6379> INCR num   #原来没有 所以为1
(integer) 1
127.0.0.1:6379> GET num
"1"
127.0.0.1:6379> INCR num    #现在递增后为2
(integer) 2
127.0.0.1:6379> GET num
"2"


当然,只能对数字进行递增操作,如果对字符串操作会报错

127.0.0.1:6379> SET wangergou niu
OK
127.0.0.1:6379> INCR wangergou
(error) ERR value is not an integer or out of range


127.0.0.1:6379> GET num
"2"
127.0.0.1:6379> DECR num            #递减1
(integer) 1
127.0.0.1:6379> GET num
"1"
127.0.0.1:6379> INCRBY num 5        #递增指定数字
(integer) 6
127.0.0.1:6379> GET num
"6"
127.0.0.1:6379> DECRBY num 5        #递减指定数字
(integer) 1
127.0.0.1:6379> GET num
"1"


Lists 列表类型

list是一个有序列表,而且是双向的(内部实现是双向链表)。因此可以向两端添加元素。

把链表想象成一个队列,会有 左L(头部) 右R(尾部) 两边操作

一个列表可以包含2^31-1个元素

操作两端的元素相对于操作中间要快

127.0.0.1:6379[1]> LPUSH list a     #从左边向list加入一个元素
(integer) 1
127.0.0.1:6379[1]> LPUSH list b c d #可以加入多个
(integer) 4
127.0.0.1:6379[1]> LRANGE list 0 4  #取到第一个数字到第二数字的元素的值
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379[1]> RPUSH list z     #从右边加入元素
(integer) 5
127.0.0.1:6379[1]> RPUSH list y x   #从右边加入多个
(integer) 7
127.0.0.1:6379[1]> LRANGE list 0 7
1) "d"
2) "c"
3) "b"
4) "a"
5) "z"
6) "y"
7) "x"
127.0.0.1:6379[1]> LRANGE list -3 -1    #可以是反方向坐标。左边0开始 右边则从-1开始
1) "z"
2) "y"
3) "x"

127.0.0.1:6379[1]> LLEN list    #获取list的长度
(integer) 7

127.0.0.1:6379[1]> LINDEX list 4    #根据坐标获取元素值
"z"
127.0.0.1:6379[1]> LINDEX list -4   #负坐标
"a"


127.0.0.1:6379[1]> LPOP list    #从坐标弹出一个元素
"d"
127.0.0.1:6379[1]> RPOP list    #从右边弹出一个元素
"x"
127.0.0.1:6379[1]> LLEN list
(integer) 5
127.0.0.1:6379[1]> LRANGE list 0 5
1) "c"
2) "b"
3) "a"
4) "z"
5) "y"


127.0.0.1:6379[1]> LREM list 0 c    #移除指定index的元素
(integer) 1
127.0.0.1:6379[1]> LREM list -1 y   #成功返回0
(integer) 1
127.0.0.1:6379[1]> LREM list -1 y   #上面移除过了,所以移除失败返回0
(integer) 0


127.0.0.1:6379[1]> LRANGE list 0 2
1) "b"
2) "a"
3) "z"
127.0.0.1:6379[1]> LTRIM list  1 2  #对指定list进行修剪,留下现对于原来的指定范围
OK
127.0.0.1:6379[1]> LRANGE list 0 1
1) "a"
2) "z"

127.0.0.1:6379[1]> LSET list 0 y    #设置指定位置元素的值
OK


Hashes 散列类型

是一个可以用来表示对象的类型

127.0.0.1:6379[1]> HSET blog title redis        # 设置对应key 的 属性的值
(integer) 1
127.0.0.1:6379[1]> HGET blog title              #取到对应key属性的值
"redis"
127.0.0.1:6379[1]> HMSET blog time 2016 content blablabla   #设置多个属性
OK
127.0.0.1:6379[1]> HMGET blog title time content    #取到多个属性
1) "redis"
2) "2016"
3) "blablabla"


#同样和String一样 有 HSETNX 不存在时赋值命令


127.0.0.1:6379[1]> HDEL blog time   #删除属性
(integer) 1
127.0.0.1:6379[1]> HGET blog time
(nil)


127.0.0.1:6379[1]> HEXISTS  blog  title #判断属性是否存在,存在为1
(integer) 1
127.0.0.1:6379[1]> HEXISTS  blog  time  #不存在为0
(integer) 0
127.0.0.1:6379[1]> HGETALL blog     #取出全部的域和值
1) "title"
2) "redis"
3) "content"
4) "blablabla"


127.0.0.1:6379[1]> HSET blog time 2016
(integer) 1
127.0.0.1:6379[1]> HINCRBY blog time 1  ##指定对象的属性 递增 指定数字
(integer) 2017


127.0.0.1:6379[1]> HKEYS blog   #返回对应key的全部属性
1) "title"
2) "content"
3) "time"
127.0.0.1:6379[1]> HVALS blog   #返回对应key的全部属性的value
1) "redis"
2) "blablabla"
3) "2017"
127.0.0.1:6379[1]> HLEN blog    #返回对应key的属性数量
(integer) 3


Sets 集合类型

与list列表 相似,但是它是无序,且唯一的

127.0.0.1:6379[1]> SADD set a   #像指定集合中插入元素
(integer) 1
127.0.0.1:6379[1]> SADD set a   #插入同一个,返回0插入失败。因为set唯一
(integer) 0
127.0.0.1:6379[1]> SREM set a   #移除元素
(integer) 1
127.0.0.1:6379[1]> SADD set  a b c  #插入多个
(integer) 3
127.0.0.1:6379[1]> SMEMBERS set     #返回全元素的值
1) "c"
2) "b"
3) "a"
127.0.0.1:6379[1]> SCARD set    #返回集合元素数量
(integer) 3
127.0.0.1:6379[1]> SISMEMBER set a  # s is member 命令判断 a是否在集合set中
(integer) 1         #在 返回1
127.0.0.1:6379[1]> SISMEMBER set x
(integer) 0         #不在 返回0


127.0.0.1:6379[1]> SADD set1 a
(integer) 1
127.0.0.1:6379[1]> SADD set1 b
(integer) 1
127.0.0.1:6379[1]> SADD set1 c
(integer) 1
127.0.0.1:6379[1]> SADD set2 b c d
(integer) 3
127.0.0.1:6379[1]> SDIFF set1 set2      #返回set1 相对后面指定的key中不存在的元素 后面指定的key 可以一个也可以多个    (差集set1-set2)
1) "a"
127.0.0.1:6379[1]> SDIFFSTORE set3 set1 set2    #把sdiff产生的结果存入另一个集合(set3)
(integer) 1
127.0.0.1:6379[1]> SMEMBERS set3
1) "a"


127.0.0.1:6379[1]> SINTER set1 set2 #返回交集
1) "c"
2) "b"
127.0.0.1:6379[1]> SINTERSTORE set4 set1 set2   #将结果存入目的集合
(integer) 2
127.0.0.1:6379[1]> SMEMBERS set4
1) "c"
2) "b"


127.0.0.1:6379[1]> SUNION set1 set2 #取并集
1) "b"
2) "a"
3) "c"
4) "d"
127.0.0.1:6379[1]> SUNIONSTORE set5 set1 set2   #将并集存入目标集合
(integer) 4
127.0.0.1:6379[1]> SMEMBERS set5
1) "b"
2) "a"
3) "c"
4) "d"


SPOP key [count]    #  !!随机!!弹出key中指定数量的元素

127.0.0.1:6379[1]> SPOP set1
"a"
127.0.0.1:6379[1]> SPOP set1
"c"

127.0.0.1:6379[1]> SMOVE set2 set1 b    #移动前一个set的元素b 到后一个set集合
(integer) 1


Sorted Sets 有序集合类型

有序的集合!

O(lg(N))完成添加删除更新

相比list(也是有序的)更耗内存

ZADD  key score(可以是整数,也可是浮点数) member

127.0.0.1:6379[1]> ZADD zset 10 a  #添加一个元素
(integer) 1
127.0.0.1:6379[1]> ZADD zset 100 b 98 c #添加多个
(integer) 2

127.0.0.1:6379[1]> ZCARD zset   #统计集合一共多少元素
(integer) 3
127.0.0.1:6379[1]> ZCOUNT zset  99 100  #返回指定范围元素数量
(integer) 1

127.0.0.1:6379[1]> ZSCORE zset b    #获取指定元素的评分
"100"
127.0.0.1:6379[1]> ZRANK zset b     #从小到大的排名
(integer) 3
127.0.0.1:6379[1]> ZREVRANK zset b  #返回从大到小的排名
(integer) 0


127.0.0.1:6379[1]> ZADD zset 30 d
(integer) 1
127.0.0.1:6379[1]> ZINCRBY zset 35 d    #指定元素增加评分score,返回增加后的结果
"65"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis