第24章 Redis入门必备:快速上手常用命令与应用示例【有序集合和无序集合】

1,855 阅读7分钟

引言

Redis是一种高性能的键值存储数据库,以其快速的读取和写入速度受到广泛欢迎。由于其简单易用的特性,Redis不仅适用于缓存、会话管理,还可以用于消息队列、实时分析等多种场景。本文旨在为Redis入门者提供一个实用的指南,通过介绍常用命令和应用实例,帮助读者快速上手并掌握Redis的基本操作,无论是开发新项目还是优化现有系统,Redis都将成为您不可或缺的利器。让我们一起探索Redis的强大功能,开启高效数据管理的旅程!

无序集合操作

集合特性:无序性、唯一性、确定性

字符串的无序集合,不允许存在重复的成员。

多个集合类型之间可以进行并集、交集和差集运算。

图解交、并、差集:

sadd 往集合添加成员

sadd key value1 value2 ...
# 往集合key中增加成员
# 增加相同成员时只会添加一个(唯一性)

# 示例实现
127.0.0.1:6379> sadd letters a 
(integer) 1
127.0.0.1:6379> sadd letters a b c
(integer) 2
127.0.0.1:6379> smembers letters
1"c"
2"b"
3"a"
127.0.0.1:6379> sadd setA 1 3 5 7
(integer) 4
127.0.0.1:6379> sadd setB 2 3 4 5
(integer) 4
127.0.0.1:6379> sdiff setB setA
1"2"
2"4"
127.0.0.1:6379> sadd setA setB
1"1"
2"7"

srem 删除集合成员

srem key value1 value2 ...
# 删除集合中为value1 value2...成员
# 返回真正删除掉的成员个数(不包括不存在的成员)

# 示例
127.0.0.1:6379> sadd names zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> srem names zhangsan lisi
(integer) 2
127.0.0.1:6379> smembers names
1) "wangwu"

spop 随机删除集合一个成员

spop key
# 随机删除集合key中的一个成员
# 应用场景:抽奖,抽中的人已经排除,不可能会被再次抽中了

# 示例
127.0.0.1:6379> sadd letters A B C D E F
(integer) 6
127.0.0.1:6379> spop letters
"A"
127.0.0.1:6379> spop letters
"F"
127.0.0.1:6379> spop letters
"B"
127.0.0.1:6379> spop letters
"D"

srandmember 随机获取集合成员

srandmember key [count]
# 随机获取集合key的count个成员,默认count是1

# 示例
127.0.0.1:6379> srandmember letters
"C"
127.0.0.1:6379> srandmember letters 2
1) "E"
2) "B"
127.0.0.1:6379> srandmember letters 3
1) "D"
2) "C"
3) "E"

smembers 获取集合所有的成员

smembers key
# 返回集合所有的成员
# 返回值的顺序不一定是添加成员的顺序(无序性)

# 示例
127.0.0.1:6379> sadd names zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> smembers names
1) "lisi"
2) "wangwu"
3) "zhangsan"

sismember 判断成员是否存在集合中

sismember key value
# 判断value是否存在集合key中,存在返回1,不存在返回0

# 示例
127.0.0.1:6379> sadd names zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> sismember names lisi
(integer) 1
127.0.0.1:6379> sismember names zhaoliu
(integer) 0

scard 获取集合成员的个数

scard key
# 获取集合成员的个数

# 示例
127.0.0.1:6379> sadd letters A B C D 
(integer) 4
127.0.0.1:6379> sadd letters E F
(integer) 2
127.0.0.1:6379> scard letters
(integer) 6

smove 把一个集合中成员移动到另一个集合

smove <source> <dest> value
# 把集合source中的value删除,并添加到集合dest中

# 示例
127.0.0.1:6379> sadd letters A B C
(integer) 3
127.0.0.1:6379> sadd num 1 2 3
(integer) 3
127.0.0.1:6379> smove letters num A
(integer) 1
127.0.0.1:6379> smembers letters
1) "C"
2) "B"
127.0.0.1:6379> smembers num
1) "3"
2) "1"
3) "A"
4) "2"

sunion 获取多个集合的并集

sunion key1 key2 ...
# 获取多个集合的并集

# 示例
127.0.0.1:6379> sadd zhangsan A E G
(integer) 3
127.0.0.1:6379> sadd lisi B E F
(integer) 3
127.0.0.1:6379> sadd wangwu C D E
(integer) 3
127.0.0.1:6379> sunion zhangsan lisi wangwu
1) "B"
2) "G"
3) "D"
4) "C"
5) "E"
6) "F"
7) "A"

sdiff 获取多个集合的差集

sdiff key1 key2 ...
# 获取key1与key2...的差集
# 即key1-key2...(key1有其他集合没有的成员)

# 示例
127.0.0.1:6379> sadd zhangsan A B C
(integer) 3
127.0.0.1:6379> sadd lisi B D E
(integer) 3
127.0.0.1:6379> sadd wangwu C E F
(integer) 3
127.0.0.1:6379> sdiff zhangsan lisi wangwu
1) "A"

sinterstore 获取多个集合的交集并储存

sinterstore dest key1 key2 ...
# 求出key1 key2 ...集合中的交集,并赋给dest

# 示例
127.0.0.1:6379> sadd zhangsan A C D
(integer) 3
127.0.0.1:6379> sadd lisi B D E
(integer) 3
127.0.0.1:6379> sadd wangwu D E G
(integer) 3
127.0.0.1:6379> sinterstore class zhangsan lisi wangwu
(integer) 1
127.0.0.1:6379> smembers class
1) "D"

有序集合

在集合类型的基础上添加了排序的功能。

例如点击量排序

zadd 往有序集合添加成员

zadd key score1 key2 score2 key2 ...
# 往有序集合key添加成员

# 示例
127.0.0.1:6379> zadd ages 28 zhangsan 24 lisi 26 wangwu
(integer) 0
127.0.0.1:6379> zrange ages 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"

zrange 按名次取成员

zrange key start stop [WITHSCORES]
# 把集合排序后,返回名次[start,stop]的成员按名次取成员
# 默认是升续排列,withscores 是把score也打印出来

# 示例
127.0.0.1:6379> zrange ages 0 -1 withscores
1) "lisi"
2) "24"
3) "wangwu"
4) "26"
5) "zhangsan"
6) "28"

zrangebyscore 按分数取成员

zrangebyscore  key min max [withscores] limit offset N
# 集合(升序)排序后,取score在[min,max]内的成员,并跳过offset个,取出N个,按分数取成员

# 示例
127.0.0.1:6379> zadd ages 28 zhangsan 24 lisi 26 wangwu
(integer) 3
127.0.0.1:6379> zrangebyscore ages 25 30
1) "wangwu"
2) "zhangsan"
127.0.0.1:6379> zrangebyscore ages 25 30 limit 1 1
1) "zhangsan"

zscore 获取指定成员的分数

ZSCORE key member
# 获取指定成员的分数

# 示例
127.0.0.1:6379> zadd height 175 zhangsan 167 lisi 185 wangwu
(integer) 3
127.0.0.1:6379> zscore height lisi
"167"

zcount 计算分数区间成员个数

zcount key min max
# 计算[min,max]区间内成员的数量

# 示例
127.0.0.1:6379> zadd height 175 zhangsan 167 lisi 185 wangwu
(integer) 3
127.0.0.1:6379> zcount height 170 180
(integer) 1

zrank/zrevrank 获取成员升序/降序的排名

zrank/zrevrank key member
# 查询member的升序/降序排名,名次从0开始

# 示例
127.0.0.1:6379> zadd ages 28 zhangsan 24 lisi 26 wangwu
(integer) 0
127.0.0.1:6379> zrange ages 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> zrank ages zhangsan
(integer) 2
127.0.0.1:6379> zrevrank ages zhangsan
(integer) 0

zrem 删除有序集合成员

zrem key value1 value2 ..
# 删除集合中的成员

# 示例
127.0.0.1:6379> zrem ages wangwu
(integer) 1
127.0.0.1:6379> zrange ages 0 -1
1) "lisi"
2) "zhangsan"

zremrangebyrank 按排名删除成员

zremrangebyrank key start end
# 按排名删除成员,删除名次在[start,end]之间的

# 示例
127.0.0.1:6379> zadd height 175 zhangsan 167 lisi 185 wangwu 178 zhaoliu
(integer) 1
127.0.0.1:6379> zremrangebyrank height 0 1
(integer) 2
127.0.0.1:6379> zrange height 0 -1
1) "zhaoliu"
2) "wangwu"

zremrangebyscore 按分数删除成员

zremrangebyscore key min max
# 按照socre来删除成员,删除score在[min,max]之间的

# 示例
127.0.0.1:6379> zadd height 175 zhangsan 167 lisi 185 wangwu 178 zhaoliu
(integer) 2
127.0.0.1:6379> zremrangebyscore height 170 180
(integer) 2
127.0.0.1:6379> zrange height 0 -1
1) "lisi"
2) "wangwu"

zinterstore 求交集再计算

zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
# 求key1、key2...的交集,key1、key2...的权重分别是 weight1、weight2...
# 聚合方法用: sum|min|max
# 聚合的结果保存在destination集合内

# 示例
127.0.0.1:6379> zadd zhangsan 5 iphone6s 7 galaxyS7 6 huaweiP9
(integer) 3
127.0.0.1:6379> zadd lisi 3 iphone6s 9 galaxyS7 4 huaweiP9 2 HTC10
(integer) 4
127.0.0.1:6379> zinterstore result 2 zhangsan lisi
(integer) 3
127.0.0.1:6379> zrange result 0 -1 withscores
1) "iphone6s"
2) "8"
3) "huaweiP9"
4) "10"
5) "galaxyS7"
6) "16"
127.0.0.1:6379> zinterstore result 2 zhangsan lisi aggregate max
(integer) 3
127.0.0.1:6379> zrange result 0 -1 withscores
1) "iphone6s"
2) "5"
3) "huaweiP9"
4) "6"
5) "galaxyS7"
6) "9"

zunionstore 求并集再计算

zunionstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
# 求key1、key2...的并集,key1、key2...的权重分别是 weight1、weight2...
# 聚合方法用: sum|min|max
# 聚合的结果保存在destination集合内

# 示例
127.0.0.1:6379> zadd zhangsan 4 iphone6s 6 huaweiP9 8 xiaomi5
(integer) 3
127.0.0.1:6379> zadd lisi 2 iphone6s 8 galaxS7 5 meizu6
(integer) 3
127.0.0.1:6379> zunionstore result 2 zhangsan lisi
(integer) 5
127.0.0.1:6379> zrange result 0 -1 withscores
 1) "meizu6"
 2) "5"
 3) "huaweiP9"
 4) "6"
 5) "iphone6s"
 6) "6"
 7) "galaxS7"
 8) "8"
 9) "xiaomi5"
10) "8"
127.0.0.1:6379> zunionstore result 2 zhangsan lisi aggregate max
(integer) 5
127.0.0.1:6379> zrange result 0 -1 withscores
 1) "iphone6s"
 2) "4"
 3) "meizu6"
 4) "5"
 5) "huaweiP9"
 6) "6"
 7) "galaxS7"
 8) "8"
 9) "xiaomi5"
10) "8"

实验实训

Redis集合综合实践练习 set应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

  • 1.向key为学生student1中添加赵一,钱二,张三,李四,王五,马六,郑七,周八,孙九九位同学

  • 2.查询key为学生student1的所有集合元素

  • 3.判断指定key为student1对应set中是否包含李四

  • 4.删除key为student1对应set中的马六和王五同学

  • 5.随机删除指定key为studen1t对应set中的1个学生

  • 6.随机获取指定key为student1对应set中的取2个学生

  • 7.将指定key为student1对应set中的学生为“赵一”移动到另一个key为student2对应的set中

  • 8.查询指定key为student1对应set和key为student2对应set的差集

  • 9.查询指定key为student1对应set和key为student2对应set的交集

  • 10.查询指定key为student1对应set和key为student2对应set的并集