Redis实战管理

Redis数据类型

  • String 字符串类型

  • Hash 哈希类型(最接近数据库表的类型)

  • List 列表类型(消息队列)

  • Set 集合类型

  • Sorted set 有序集合

通用操作

## key的查询操作 ls
# 查询所有key
127.0.0.1:6379> KEYS *
1) "name"
# 判断指定key是否存在
127.0.0.1:6379> KEYS name
1) "name"
## redis的库操作
redis总共16个库:0-15
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> 
## 判断key
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> EXISTS age 
(integer) 1
127.0.0.1:6379> EXISTS age name
(integer) 2
127.0.0.1:6379>
## 修改key名字
127.0.0.1:6379> KEYS *
1) "name"
2) "age"
127.0.0.1:6379> RENAME name test
OK
127.0.0.1:6379> KEYS *
1) "test"
2) "age"
## 查看key的类型
127.0.0.1:6379> TYPE test
string
## 删除key
127.0.0.1:6379> DEL test
(integer) 1
## 生存时间(秒)
127.0.0.1:6379> EXPIRE age 100
(integer) 1
## 查看生存时间
127.0.0.1:6379> TTL age
(integer) 91
127.0.0.1:6379> TTL age
(integer) 90
# key不存在或者key生存周期到了
127.0.0.1:6379> TTL age
(integer) -2
# key存在,并且没有生存周期
127.0.0.1:6379> TTL name
(integer) -1
## 生存时间(毫秒)
127.0.0.1:6379> PEXPIRE name 100000000
(integer) 1
## 取消生存时间
127.0.0.1:6379> PERSIST name
(integer) 1

String类型操作

应用场景:

常规计数:微博数、粉丝数、直播平台

## 增
# 创建一个key
127.0.0.1:6379> set name hg
OK
# 创建一个key并设置生存时间
127.0.0.1:6379> set age 18 ex 100
OK
127.0.0.1:6379> ttl age
(integer) 97
# 创建多个key
127.0.0.1:6379> mset name hg age 19 gender m
OK
127.0.0.1:6379> KEYS *
1) "name"
2) "gender"
3) "age"
# 先查看某个key的值然后修改如果不存在就创建
127.0.0.1:6379> GETSET name hg
"csg"
127.0.0.1:6379> get name
"hg"
127.0.0.1:6379> GETSET abc hg
(nil)
127.0.0.1:6379> get abc
"hg"
# 计数器 递增(默认步长1)
127.0.0.1:6379> incr hg_fens
# 计数器 递减(默认步长1)
127.0.0.1:6379> decr hg_fens
# 计数器 指定步长 递增
127.0.0.1:6379> incrby hg_fens 10000
(integer) 10083
# 计数器 指定步长 递减
127.0.0.1:6379> decrby hg_fens 100
# 计数器 浮点型 递增
127.0.0.1:6379> incrbyfloat hg_fens 1.1

127.0.0.1:6379> del aaa
(integer) 1

127.0.0.1:6379> set name nsbss
OK
## 根据下标修改字符串内容
127.0.0.1:6379> SETRANGE name 1 p
(integer) 5
127.0.0.1:6379> get name
"npbss"
127.0.0.1:6379> SETRANGE name 3 p
(integer) 5
127.0.0.1:6379> get name
"npbps"
## 字符串追加拼接
127.0.0.1:6379> set name lanquan
OK
127.0.0.1:6379> get name
"lanquan"
127.0.0.1:6379> APPEND name xsd
(integer) 10
127.0.0.1:6379> get name
"lanquanxsd"

## 查看key的值
127.0.0.1:6379> get name
"lanquanxsd"
## 查看字符串长度
127.0.0.1:6379> STRLEN name
(integer) 10
## 查看字符串类型
127.0.0.1:6379> type name
string
## 查看多个key的值
127.0.0.1:6379> mget name age
1) "lanquanxsd"
2) "18"
## 查看name第四位到最后一位
127.0.0.1:6379> GETRANGE name 3 -1
"quanxsd"
## 查看生存时间(秒)
127.0.0.1:6379> EXPIRE name 100
(integer) 1
127.0.0.1:6379> ttl name
(integer) 98
## 查看生存时间(毫秒)
127.0.0.1:6379> pttl name
(integer) 71233
## 优化内存使用率(去世小技巧)
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> flushall
OK

hash数据类型(字典类型)

应用场景:

存储部分变更的数据,如用户信息,商品信息等。

最接近表结构的一种类型。

# 创建hash类型数据
127.0.0.1:6379> hset ms_1 name lanquan age 18
(integer) 2
127.0.0.1:6379> keys *
1) "ms_1"
127.0.0.1:6379> hmset ms_2 name xiazi age 18
OK
127.0.0.1:6379> keys *
1) "ms_2"
2) "ms_1"

## 删key
127.0.0.1:6379> del ms_2
(integer) 1
127.0.0.1:6379> keys *
1) "ms_1"
## 删除指定字段
127.0.0.1:6379> HDEL ms_1 name
(integer) 1
127.0.0.1:6379> hgetall ms_1
1) "age"
2) "18"

## 修改,如果没有相同字段,则追加,有相同字段,则修改
127.0.0.1:6379> hset ms_1 gender f
(integer) 1
127.0.0.1:6379> hgetall ms_1
1) "age"
2) "18"
3) "gender"
4) "f"
## hash类型计数器
127.0.0.1:6379> hincrby myhash guanzhu 1
(integer) 1
127.0.0.1:6379> keys *
1) "myhash"
2) "ms_1"
127.0.0.1:6379> HGETALL myhash
1) "guanzhu"
2) "1"
127.0.0.1:6379> hincrby myhash guanzhu 1
(integer) 2
127.0.0.1:6379> HGETALL myhash
1) "guanzhu"
2) "2"

## 查看单个字段
127.0.0.1:6379> hset ms_2 name xiazi age 18 qiangdu xiaoshuidao 
(integer) 3
127.0.0.1:6379> hget ms_2 name
"xiazi"
127.0.0.1:6379> hget ms_2 age
"18"
127.0.0.1:6379> hget ms_2 qiangdu
"xiaoshuidao"
## 查看所有字段
127.0.0.1:6379> hgetall ms_2
1) "name"
2) "xiazi"
3) "age"
4) "18"
5) "qiangdu"
6) "xiaoshuidao"
## 查看指定字段(多个)
127.0.0.1:6379> hmget ms_2 name age
1) "xiazi"
2) "18"

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

## 左边创建列表类型(生产者)
127.0.0.1:6379> lpush nginx test
(integer) 1
## 右边创建列表类型(生产者)
127.0.0.1:6379> rpush nginx 1 2 3 
(integer) 4
127.0.0.1:6379> LRANGE nginx 0 -1
1) "test"
2) "1"
3) "2"
4) "3"
## 写入队列(该key必须存在)
127.0.0.1:6379> lpushx apache 6
(integer) 0
127.0.0.1:6379> lpushx nginx 4
(integer) 6
## 插入数据到指定为止
127.0.0.1:6379> LRANGE nginx 0 -1
1) "4"
2) "6"
3) "test"
4) "1"
5) "2"
6) "3"
127.0.0.1:6379> LINSERT nginx before 1 0
(integer) 7
127.0.0.1:6379> LINSERT nginx after test mn
(integer) 8
127.0.0.1:6379> LRANGE nginx 0 -1
1) "4"
2) "6"
3) "test"
4) "mn"
5) "0"
6) "1"
7) "2"
8) "3"
## 从指定列表的右边消费数据,写入后边列表的左边
127.0.0.1:6379> lpush men yidaun
(integer) 1
127.0.0.1:6379> lpush men naima
(integer) 2
127.0.0.1:6379> LRANGE men 0 -1
1) "naima"
2) "yidaun"
127.0.0.1:6379> RPOPLPUSH nginx men   
"3"
## ↑将列表"nginx"的右侧元素弹出,并将其推送到列表"men"的左侧。返回值为"3",表示操作成功。
127.0.0.1:6379> LRANGE men 0 -1
1) "3"
2) "naima"
3) "yidaun"

## 从左边删除nginx的一个6
127.0.0.1:6379> lrange nginx 0 -1
1) "4"
2) "6"
3) "test"
4) "mn"
5) "0"
6) "1"
7) "2"
127.0.0.1:6379> LREM nginx 1 6
(integer) 1
127.0.0.1:6379> lrange nginx 0 -1
1) "4"
2) "test"
3) "mn"
4) "0"
5) "1"
6) "2"
## 按照索引保留数据,其他都删除
127.0.0.1:6379> lrange nginx 0 -1
1) "4"
2) "test"
3) "mn"
4) "0"
5) "1"
6) "2"
127.0.0.1:6379> ltrim nginx 0 2
OK
127.0.0.1:6379> lrange nginx 0 -1
1) "4"
2) "test"
3) "mn"

## 按照索引修改数据
127.0.0.1:6379> lrange nginx 0 -1
1) "4"
2) "test"
3) "mn"
127.0.0.1:6379> LSET nginx 1 txt
OK
127.0.0.1:6379> lrange nginx 0 -1
1) "4"
2) "txt"
3) "mn"

## 从左边取出数据
127.0.0.1:6379> lrange nginx 0 -1
1) "4"
2) "txt"
3) "mn"
127.0.0.1:6379> lpop nginx
"4"
## 从右边取出数据
127.0.0.1:6379> lrange nginx 0 -1
1) "txt"
2) "mn"
127.0.0.1:6379> rpop nginx
"mn"
## 查看指定索引
127.0.0.1:6379> lpush nginx 1 2 3 4 5 6 7
(integer) 8
127.0.0.1:6379> lrange nginx 0 -1
1) "7"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
8) "txt"
127.0.0.1:6379> LINDEX nginx 0
"7"
127.0.0.1:6379> LINDEX nginx 1
"6"
## 按指定范围查看
127.0.0.1:6379> LRANGE nginx 0 5
1) "7"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
127.0.0.1:6379> LRANGE nginx 0 -1
1) "7"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
8) "txt"
## 查看列表长度
127.0.0.1:6379> LLEN nginx
(integer) 8

Set集合数据类型

应用场景:

在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

集合:1 2 3 4 5
集合:1 3 5 7 9

交集:1 3 5
并集:1 2 3 4 5 7 9
差集:2 4 7 9

## 创建集合
127.0.0.1:6379> sadd yixian_c naiba naima xiaomonv
(integer) 3
127.0.0.1:6379> sadd yixian_nai naiba honggou siling
(integer) 3

## 随机踢出一名幸运观众
127.0.0.1:6379> SPOP bingji
"xiaomonv"
127.0.0.1:6379> SMEMBERS bingji
1) "naiba"
2) "naima"
3) "honggou"
4) "siling"
## 指定删除一名幸运观众
127.0.0.1:6379> SREM bingji naiba honggou
(integer) 2

## 移动一个到另一个
127.0.0.1:6379> SMOVE yixian_nai yixian_c siling
(integer) 1
127.0.0.1:6379> SMEMBERS yixian_c
1) "naiba"
2) "naima"
3) "xiaomonv"
4) "siling"
127.0.0.1:6379> SMEMBERS yixian_nai
1) "naiba"
2) "honggou"

## 查看集合中的所有成员
127.0.0.1:6379> SMEMBERS yixian_c
1) "naiba"
2) "naima"
3) "xiaomonv"
## 前面集合有后面集合没有的元素
127.0.0.1:6379> sdiff yixian_c yixian_nai
1) "naima"
2) "xiaomonv"
127.0.0.1:6379> sdiff yixian_nai yixian_c
1) "honggou"
2) "siling"
## 交集(共同好友)
127.0.0.1:6379> SINTER yixian_c yixian_nai
1) "naiba"
## 并集
127.0.0.1:6379> SUNION yixian_c yixian_nai
1) "naiba"
2) "naima"
3) "xiaomonv"
4) "honggou"
5) "siling"
## 判断一个成员是否在集合中
127.0.0.1:6379> SCARD yixian_c
(integer) 3
127.0.0.1:6379> SCARD yixian_nai
(integer) 3
## 随机抽取一名幸运观众
127.0.0.1:6379> SRANDMEMBER yixian_c
"naiba"
## 随机抽取N名幸运观众
127.0.0.1:6379> SRANDMEMBER yixian_c 2
1) "naima"
2) "xiaomonv"
## 取出第一个集合有第二个集合没有的数据存到chaoyixian集合中
127.0.0.1:6379> SDIFFSTORE xianmu yixian_c yixian_nai
(integer) 2
## 取出交集放入第三个集合中
127.0.0.1:6379> SINTERSTORE chaoyixian yixian_c yixian_nai
(integer) 1
## 取出并集放入第三个集合
127.0.0.1:6379> SUNIONSTORE bingji yixian_c yixian_nai
(integer) 5

Sorted-Set有序集合

应用场景:

排行榜应用,取TOP N操作

这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

## zadd key score member [score member ...]
score:分数
member:成员
## 创建有序集合
127.0.0.1:6379> zadd zhiye_paihangbang 100 naiba 90 naima 80 xiaomonv
(integer) 3

#删除或多个成员变量,返回删除的数量
127.0.0.1:6379> ZREM zhiye_paihangbang naiba 
(integer) 1
127.0.0.1:6379> ZREM zhiye_paihangbang naima xiaomonv
(integer) 2

#将成员 hhh 的分数增加 101,并返回该成员更新后的分数201
127.0.0.1:6379> ZINCRBY zhiye_paihangbang 10 naiba
"110"

## 查看所有成员
127.0.0.1:6379> ZRANGE zhiye_paihangbang 0 -1 
1) "xiaomonv"
2) "naima"
3) "naiba"
## 查看所有成员和他们的分数
127.0.0.1:6379> ZRANGE zhiye_paihangbang 0 -1 withscores
1) "xiaomonv"
2) "80"
3) "naima"
4) "90"
5) "naiba"
6) "100"
## rev:reverse 翻转,倒序
127.0.0.1:6379> ZRANGE zhiye_paihangbang 0 -1 rev withscores
1) "naiba"
2) "100"
3) "naima"
4) "90"
5) "xiaomonv"
6) "80"
## 查看指定成员的索引index
127.0.0.1:6379> zrank zhiye_paihangbang naima
(integer) 1
127.0.0.1:6379> zrank zhiye_paihangbang naima withscore
1) (integer) 1
2) "90"
## 查看有序集合中的成员个数
127.0.0.1:6379> ZCARD zhiye_paihangbang
(integer) 3
## 查看分数在指定范围内的成员个数
127.0.0.1:6379> ZCOUNT zhiye_paihangbang 80 89
(integer) 1
127.0.0.1:6379> ZCOUNT zhiye_paihangbang 89 100
(integer) 2
## 查看指定成员的分数
127.0.0.1:6379> ZSCORE zhiye_paihangbang naiba
"100"
## 查看指定范围分数的成员名字
127.0.0.1:6379> ZRANGEBYSCORE zhiye_paihangbang 80 90
1) "xiaomonv"
2) "naima"
## 按照偏移量取出指定数量的成员
127.0.0.1:6379> ZRANGEBYSCORE zhiye_paihangbang -inf +inf limit 0 1
1) "xiaomonv"
127.0.0.1:6379> ZRANGEBYSCORE zhiye_paihangbang -inf +inf limit 0 2
1) "xiaomonv"
2) "naima"
127.0.0.1:6379> ZRANGEBYSCORE zhiye_paihangbang -inf +inf limit 0 3
1) "xiaomonv"
2) "naima"
3) "naiba"
## 指定索引倒序排序
127.0.0.1:6379> ZREVRANGE zhiye_paihangbang 0 -1 withscores
1) "naiba"
2) "100"
3) "naima"
4) "90"
5) "xiaomonv"
6) "80"
## 指定分数倒序排序
127.0.0.1:6379> ZREVRANGEBYSCORE zhiye_paihangbang 100 80
1) "naiba"
2) "naima"
3) "xiaomonv"
127.0.0.1:6379> ZREVRANGEBYSCORE zhiye_paihangbang 100 80 withscores
1) "naiba"
2) "100"
3) "naima"
4) "90"
5) "xiaomonv"
6) "80"
## 指定分数倒序排序 看top10
127.0.0.1:6379> ZREVRANGEBYSCORE zhiye_paihangbang 100 80 withscores limit 0 10
1) "naiba"
2) "100"
3) "naima"
4) "90"
5) "xiaomonv"
6) "80"