Redis实战管理
目录
Redis 实战管理
Redis 数据类型
- String: 字符串类型
- Hash: 哈希类型 (最接近数据库表的类型)
- List: 列表类型 (消息队列)
- Set: 集合类型
- Sorted set: 有序集合类型
Redis 通用操作
# key的查询操作
## 查询所有key
127.0.0.1:6379> KEYS *
## 判断指定key是否存在
127.0.0.1:6379> KEYS 指定key名
# redis的库操作
redis总共16个库:0-15
127.0.0.1:6379[1]> SELECT 15(库数字)
# 判断key是否存在
127.0.0.1:6379> EXISTS 指定key名
## 如果有就显示1,无就显示0
127.0.0.1:6379> EXISTS haha
(integer) 1
127.0.0.1:6379> EXISTS liuliu
(integer) 0
# 修改key名称
127.0.0.1:6379> RENAME key(现在的key名) newkey(新的key名)
# 查看key的类型
127.0.0.1:6379> TYPE key(key名)
# 删除key(可以选多个key)
127.0.0.1:6379> DEl key [key ...]
# 设置key的生存时间(单位为秒)
127.0.0.1:6379> EXPIRE key seconds [NX|XX|GT|LT]
127.0.0.1:6379> EXPIRE name 60
# 查看key生存时间(单位为秒,只支持整型)
127.0.0.1:6379> TTL key
## 只要不存在的key或者key生存周期到了就会显示-2
## 只要没有设置生存周期就会显示-1
# 设置key的生存时间(单位为毫秒,用作例1.5秒的生存时间设置)
127.0.0.1:6379> PEXPIRE key 1000
# 取消生存时间
127.0.0.1:6379> PERSIST key
strings(字符)类型操作
应用场景:
常规计数:微博数、粉丝数、直播平台
增
# 创建key/修改key(如果已存在时会修改)
127.0.0.1:6379> set name ljy
OK
# 创建多个key
127.0.0.1:6379> mset name ljy age 18 sex m
OK
# 先查看某个key的值然后修改(如果不存在就创建)
127.0.0.1:6379> GETSET name ljy
(nil)
127.0.0.1:6379> GET name
"ljy"
# 设置值同时设置生存时间
127.0.0.1:6379> set name ljy ex 10
OK
#数量递归增加(计数器 默认情况下步长是1)
127.0.0.1:6379> incr num
(integer) 1
#指定增加数值
127.0.0.1:6379> incrby num 2
(integer) 8
#数量递减
127.0.0.1:6379> DECR num
(integer) -1
#指定递减数值
127.0.0.1:6379> DECRBY num 2
(integer) -3
#浮点递增
127.0.0.1:6379> incrbyfloat float 0.6
"0.6"
删
#删除已有key
127.0.0.1:6379> DEL num
#清空当前数据库的所有数据
127.0.0.1:6379> flushdb
#清空所有数据库的所有数据
127.0.0.1:6379> flushall
改
# 追加(若该键不存在,则创建)
127.0.0.1:6379> APPEND name bgx
(integer) 6
# 查看追加内容
127.0.0.1:6379> get name
"ljybgx"
# 根据下标修改字符串内容(超过内容位数则会在最后面写上)
127.0.0.1:6379> SETRANGE name 3 a
(integer) 6
# 查看结果
127.0.0.1:6379> get name
"ljabgx"
查
#获取key值
127.0.0.1:6379> get name
"ljy"
#查看string(字符串)类型的长度
127.0.0.1:6379> STRLEN name
(integer) 6
# 查看string(字符串)类型
127.0.0.1:6379> TYPE name
string
#查看指定长度的string类型
127.0.0.1:6379> GETRANGE name 0 4 #(截取0到4位数的内容)
"ljysq"
127.0.0.1:6379> GETRANGE name 3 -1 #(截取5到最后一位数的内容)
"sqafhgjh"
#以秒查询key剩余生存时间
127.0.0.1:6379> ttl name
(integer) 8
#以毫秒查询key剩余生存时间
127.0.0.1:6379> pttl name
(integer) 44016
#获取多个key值
127.0.0.1:6379> mget name age sex
1) "ljy"
2) "18"
3) "m"
hash(字典)类型操作
应用场景:
存储部分变更的数据,如用户信息,商品信息等。
最接近表结构的一种类型。
增
#创建car的price值
127.0.0.1:6379> hset car price 500
(integer) 1
#创建car的name值(新版本可以添加多个值)
127.0.0.1:6379> hset car name BMW
(integer) 1
#设置多个哈希key(类似于MySQL的一个表中的一行数据)
127.0.0.1:6379> hmset teacher name ljy age 18 sex m
OK
127.0.0.1:6379> hmset stu_1 name ljy age 18 agent "NB"
OK
删
#删除hash类型中的一个值
127.0.0.1:6379> HDEL teacher name
(integer) 1
#删除整个hash类型key
127.0.0.1:6379> DEL teacher
(integer) 1
改
#修改hash类型值 增加1 (hash类型计数器)
127.0.0.1:6379> hincrby myhash num 1
(integer) 1
#创建car的date值(有值就修改,无值就添加)
127.0.0.1:6379> hset car date 1982
(integer) 1
查
#获取car的name值
127.0.0.1:6379> hget car name
"BMW"
#获取key的全部value和值(运维常用)
127.0.0.1:6379> hgetall stu_1
1) "name"
2) "ljy"
3) "age"
4) "18"
5) "agent"
6) "NB"
#获取key中指定字段(多个)
127.0.0.1:6379> hmget stu_1 name agent
1) "ljy"
2) "NB"
List(列表)类型操作
应用场景:
消息队列系统
比如 sina 微博:在 redis 中我们的最新微博 ID 使用了常驻缓存,这是一直更新的。
但是做了限制不能超过 5000 个 ID,因此获取 ID 的函数会一只询问 redis。
系统不会像传统方式那样 “刷新” 缓存,redis 实例中的信息永远是一致的。
SQL 数据库(或是硬盘上的其他类型数据)只是在用户需要获取 “很远” 的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
队列:先进的先出(扶梯)
lpush nginx 1 2 3 4 5
rpop nginx
堆栈:先进的后出(电梯)
lpush nginx 1 2 3 4 5
lpop nginx
增
#将一个值或者多个值插入列表的表头(若key不存在,则添加key并依次添加){生产者}
##类似于针筒,后面添加的排在后面注射进去,后输入的会把先前输入的往下推
127.0.0.1:6379> lpush list ljy
(integer) 1
127.0.0.1:6379> lpush list bgx
(integer) 2
127.0.0.1:6379> lpush list oldboy
(integer) 3
127.0.0.1:6379> lpush list alex
(integer) 4
127.0.0.1:6379> lpush list a b c d e
(integer) 9
127.0.0.1:6379> LRANGE list 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
6) "alex"
7) "oldboy"
8) "bgx"
9) "ljy"
#一行添加
127.0.0.1:6379> lpush teacher ljy bgx oldboy alex
(integer) 4
#追加一个value值,若key不存在,则不创建
127.0.0.1:6379> LPUSHX teacher1 ljy
(integer) 0
#在bgx上面添加ljy(插入数据在指定位置)
127.0.0.1:6379> linsert teacher before bgx ljy
(integer) 6
#在尾部添加key (生产者)
127.0.0.1:6379> rpush teacher wang5
(integer) 7
#将teacher的尾部元素弹出,再插入到teacher1的头部
127.0.0.1:6379> rpoplpush teacher teacher1
"wang5"
删
#删除key
127.0.0.1:6379> del teacher
(integer) 1
#从头部开始找,按先后顺序,值为a的元素,删除数量为2个,若存在第3个,则不删除
127.0.0.1:6379> lrem teacher 2 a
(integer) 2
#从头开始,索引为0,1,2的3个元素,其余全部删除改
127.0.0.1:6379> ltrim teacher 0 2
OK
改
#从头开始, 将索引为1的元素值,设置为新值,若索引越界,则返回错误信息
127.0.0.1:6379> lset teacher 1 test
OK
#将 teacher 中的尾部元素移到其头部
127.0.0.1:6379> rpoplpush teacher teacher
"oldboy"
查
#列表头部弹出,弹一行少一行(消费)
127.0.0.1:6379> lpop teacher
"ljy"
#列表尾部弹出,弹一行少一行(消费)
127.0.0.1:6379> rpop teacher
"wang5"
#查询指定行数索引(头部开始)
127.0.0.1:6379> lindex list 0
"bgx"
#查询指定行数索引(尾部第一个)
127.0.0.1:6379> lindex list -1
"alex"
#范围查询索引
127.0.0.1:6379> lrange list 0 1
1) "bgx"
2) "oldboy"
#查看一个列表内有多少行
127.0.0.1:6379> llen list
(integer) 4
Set(集合)类型操作
应用场景:
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
Redis 还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
增
#若key不存在,创建该键及与其关联的set,依次插入bgx、lidao、xiaomimei若key存在,则插入value中,若bgx在zls_fans中已经存在,则插入了lidao和xiaomimei两个新成员。
127.0.0.1:6379> sadd ljy_fans bgx lidao xiaomimei
(integer) 3
删
#随机弹出一个元素
127.0.0.1:6379> spop bingji
"paojie"
127.0.0.1:6379> smembers bingji
1) "wyd"
2) "wyk"
3) "chuleyuanli"
4) "hhh"
#指定弹出并返回弹出的数量
127.0.0.1:6379> srem bingji wyd hhh
(integer) 1
改
#将paojie从 zls_stu 移到 tls_stu
127.0.0.1:6379> smove zls_stu tls_stu paojie
(integer) 1
127.0.0.1:6379> smembers tls_stu
1) "wyd"
2) "chuleyuanli"
3) "hhh"
4) "paojie"
127.0.0.1:6379> smembers zls_stu
1) "wyd"
2) "wyk"
3) "chuleyuanli"
查
#判断xiaomimei是否已经存在,返回值为 1 表示存在
127.0.0.1:6379> SISMEMBER zls_fans xiaomimei
(integer) 0
127.0.0.1:6379> SISMEMBER bgx_fans xiaomimei
(integer) 1
#查看集合中的所有内容
127.0.0.1:6379> SMEMBERS zls_fans
1) "xiaomimei"
2) "bgx"
3) "lidao"
#获取Set 集合中元素的数量
127.0.0.1:6379> scard zls_fans
(integer) 0
127.0.0.1:6379> scard bgx_fans
(integer) 1
#随机的返回某一成员
127.0.0.1:6379> srandmember zls_stu
"xiaomimei"
## 随机抽取N名幸运观众
127.0.0.1:6379> srandmember zls_stu N
## 前面集合有后面集合没有的元素
127.0.0.1:6379> sdiff zls_stu tls_stu
1) "wyk"
2) "paojie"
127.0.0.1:6379> sdiff tls_stu zls_stu
1) "hhh"
## 查看集合的成员数量
127.0.0.1:6379> scard zls_stu
(integer) 4
127.0.0.1:6379> scard tls_stu
(integer) 3
## 判断一个成员是否在集合中
127.0.0.1:6379> sismember zls_stu hhh
(integer) 0
127.0.0.1:6379> sismember zls_stu wyd
(integer) 1
#获得2个集合中都有的元素(交集=>共同好友)
127.0.0.1:6379> sinter zls_stu tls_stu
1) "wyd"
2) "chuleyuanli"
#获取集合中的成员的并集
127.0.0.1:6379> sunion zls_stu tls_stu
1) "wyd"
2) "wyk"
3) "paojie"
4) "chuleyuanli"
5) "hhh"
## 取出第一个集合有第二个集合没有的数据存到disanzhe集合中
127.0.0.1:6379> sdiffstore disanzhe tls_stu zls_stu
## 取出交集放入第三个集合中
127.0.0.1:6379> sinterstore jiaoji tls_stu zls_stu
## 取出并集放入第三个集合
127.0.0.1:6379> sunionstore bingji zls_stu tls_stu
Sorted-Set(有序集合)类型操作
应用场景:
排行榜应用,取 TOP N 操作 这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的 sorted set 出马了,将你要排序的值设置成 sorted set 的 score,将具体的数据设置成相应的 value,每次只需要执行一条 ZADD 命令即可。
增
127.0.0.1:6379> zadd key score member [score member ...]
score:分数
member:成员
## 创建有序集合
127.0.0.1:6379> zadd linux_chengji 98 wyd 100 hhh 60 haige
(integer) 3
删
#删除多个成员变量,返回删除的数量
127.0.0.1:6379> zrem linux_chengji wyd hhh
(integer) 2
改
#将成员 hhh 的分数增加 101,并返回该成员更新后的分数201
127.0.0.1:6379> zincrby linux_chengji 101 hhh
"201"
查
## 查看所有成员
127.0.0.1:6379> zrange linux_chengji 0 -1
1) "haige"
2) "wyd"
3) "hhh"
## 查看所有成员和他们的分数
127.0.0.1:6379> zrange linux_chengji 0 -1 withscores
1) "haige"
2) "60"
3) "wyd"
4) "98"
5) "hhh"
6) "100"
rev:reverse 翻转,倒序
127.0.0.1:6379> zrange linux_chengji 0 -1 rev withscores
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"
## 查看指定成员的索引index
127.0.0.1:6379> zrank linux_chengji hhh
(integer) 2
127.0.0.1:6379> zrank linux_chengji hhh withscore
1) (integer) 2
2) "100"
## 查看有序集合中的成员个数
127.0.0.1:6379> zcard linux_chengji
(integer) 3
## 查看分数在指定范围内的成员个数
127.0.0.1:6379> zcount linux_chengji 60 99
(integer) 2
127.0.0.1:6379> zcount linux_chengji 61 99
(integer) 1
## 查看指定成员的分数
127.0.0.1:6379> zscore linux_chengji hhh
"100"
## 查看指定范围分数的成员名字
127.0.0.1:6379> zrangebyscore linux_chengji 60 99
1) "haige"
2) "wyd"
## 按照偏移量取出指定数量的成员
127.0.0.1:6379> zrangebyscore linux_chengji -inf +inf limit 0 1
1) "haige"
127.0.0.1:6379> zrangebyscore linux_chengji -inf +inf limit 0 2
1) "haige"
2) "wyd"
127.0.0.1:6379> zrangebyscore linux_chengji -inf +inf limit 0 3
1) "haige"
2) "wyd"
3) "hhh"
## 删除指定分数的成员
127.0.0.1:6379> zremrangebyscore linux_chengji 60 99
(integer) 2
## 根据索引删除成员
127.0.0.1:6379> zremrangebyrank linux_chengji 0 1
## 指定索引倒序排序
127.0.0.1:6379> zrevrange linux_chengji 0 -1 withscores
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"
## 指定分数倒序排序
127.0.0.1:6379> zrevrangebyscore linux_chengji 100 60
1) "hhh"
2) "wyd"
3) "haige"
127.0.0.1:6379> zrevrangebyscore linux_chengji 100 60 withscores
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"
## 指定分数倒序排序 看top10
127.0.0.1:6379> zrevrangebyscore linux_chengji 100 60 withscores limit 0 10
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"