本文最后更新于 319 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
Redis的集合(set)数据类型的应用场景
一.集合(SET)的增加指令
1.使用"SADD"指令为集合添加元素。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SADD bigdata hadoop storm hive # 当KEY不存在时,SADD指令会自动创建KEY,并将元素添加到集合中,但并不会记录添加的顺序,因为集合的其中一个特性就是"无序"。
3
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> KEYS *
bigdata
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata # 查看集合中的所有元素。
hadoop
hive
storm
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> TYPE bigdata
set
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SADD bigdata hadoop storm spark flink # 值得注意的是,原集合中若有已存在的运算,则该元素将不会被添加到集合中,因为集合的另一个特性就是"去重"。
2
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata
hadoop
spark
hive
storm
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
二.集合的查看指令
1.使用"SMEMBERS"指令查看KEY中所有的数据
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SADD bigdata hadoop storm hive # 注意观察我添加时的顺序
3
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> KEYS *
bigdata
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata # 注意观察我查看的顺序,和插入时的顺序并不一致!这是因为集合的特点之一就是无序的。
hadoop
hive
storm
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"SISMEMBER"指令判断KEY中某个元素是否存在,若不存在则返回0,若存在则返回1。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
bigdata
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata
hadoop
spark
hive
storm
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SISMEMBER bigdata hadoop
1
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SISMEMBER bigdata spark
1
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SISMEMBER bigdata flink
1
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SISMEMBER bigdata docker
0
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SISMEMBER bigdata k8s
0
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SISMEMBER bigdata ceph
0
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]#
3.使用"SCARD"指令查看KEY中存在的元素数量
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
bigdata
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata
spark
storm
hive
hadoop
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SCARD bigdata # 查看集合的KEY中存在的元素数量
5
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
4.使用"SRANDMEMBER"指令随机返回KEY中某一个元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
bigdata
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata
spark
storm
hive
hadoop
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
spark
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
hadoop
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
spark
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
hadoop
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
hive
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SRANDMEMBER bigdata
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
5.使用"SDIFF"指令比较KEY中的差集
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> KEYS *
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SADD dev os linux windows python java c++
6
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SADD op os linux windows python java nginx lvs haproxy kafka elk mysql
11
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SADD test os linux windows
3
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> KEYS *
test
op
dev
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SDIFF dev test # 比较dev和test这两个KEY的不同的元素,很明显,会将dev比test多余的元素列举出来
c++
python
java
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SDIFF dev test op # 从左到右开始比较,dev和test的结果为"c++","python"和"java"。但是op的KEY中并不存在"c++"这个元素。
c++
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
6.使用"SDIFFSTORE"指令可以将KEY中的差集结果存储在一个新的集合中。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
test
op
dev
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SDIFF dev test
c++
python
java
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SDIFF dev test op
c++
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SDIFFSTORE key01 dev test
3
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SDIFFSTORE key02 dev test op
1
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS key01
c++
python
java
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS key02
c++
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]#
7.使用"SINTER"指令比较KEY中的交集
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
test
dev
key02
op
key01
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS test
linux
windows
os
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
os
elk
python
haproxy
linux
mysql
lvs
windows
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS dev
linux
windows
os
python
java
c++
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SINTER test op dev # 获取3个KEY的交集
linux
windows
os
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
8.使用"SINTERSTORE"指令可以将KEY中的交集结果存储在一个新的集合中。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
test
dev
key02
op
key01
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS dev
python
java
linux
c++
os
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS test
linux
windows
os
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
os
elk
python
haproxy
linux
mysql
lvs
windows
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SINTER test op dev
linux
windows
os
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SINTERSTORE key03 test dev op # 将交集的比较结果存储在一个新的集合中。
3
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> KEYS *
test
dev
key02
key03
op
key01
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS key03
linux
os
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
9.使用"SUNION"指令可以查看KEY中的并集
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
test
dev
key02
key03
op
key01
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS dev
python
java
linux
c++
os
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS test
linux
windows
os
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
os
elk
python
haproxy
linux
mysql
lvs
windows
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SUNION dev test op
java
nginx
os
haproxy
python
elk
mysql
linux
lvs
c++
kafka
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
10.使用"SUNIONSTORE"指令可以将KEY中的并集集结果存储在一个新的集合中。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
test
dev
key02
key03
op
key01
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS dev
python
java
linux
c++
os
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS test
linux
windows
os
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
os
elk
python
haproxy
linux
mysql
lvs
windows
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SUNION dev test op
java
nginx
os
haproxy
python
elk
mysql
linux
lvs
c++
kafka
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SUNIONSTORE key05 dev test op
12
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> KEYS *
test
dev
key02
key03
key05
op
key01
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS key05
java
nginx
os
haproxy
python
elk
mysql
linux
lvs
c++
kafka
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
三.集合的修改指令
1.使用"SMOVE source destination member"指令将"source"集合中的"member"元素移动到"destination"集合中
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
os
elk
python
haproxy
linux
mysql
lvs
windows
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS dev
python
java
linux
c++
os
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMOVE op dev elk # 将OP集合中的elk元素移动到dev集合中。
1
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMOVE op dev mysql # 将OP集合中的mysql元素移动到dev集合中。
1
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
os
python
haproxy
linux
lvs
windows
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS dev
elk
python
java
mysql
linux
c++
os
windows
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
四.集合的删除指令
1.使用"SPOP"指令随机移除KEY中的元素,可以指定随机移除的元素的个数。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> KEYS *
bigdata
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata
spark
storm
hive
hadoop
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SPOP bigdata # 随机从指定的KEY中移除一个元素,若不指定个数,默认只移除一个元素。
spark
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SPOP bigdata
flink
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SPOP bigdata
hadoop
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata
storm
hive
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SPOP bigdata 2 # 随机从只当的KEY中移除2个元素,若不指定个数,默认只移除一个元素。
hive
storm
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS bigdata
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"SREM"指令移除集合中指定的元素,若元素在指定集合中不存在则不做任何操作。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 12 --raw
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
os
python
haproxy
linux
lvs
windows
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SREM op linux os windows python # 我们移除的4个元素在集合中是存在的,因此会成功移除4个元素!
4
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
nginx
haproxy
lvs
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SREM op haproxy nginx golang c++ javascript # 值得注意的是,此处我们要移除5个元素,但仅有2个元素在集合中,因此最终只有2个元素会被移除成功哟~
2
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
lvs
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SREM op python elk
0
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> SMEMBERS op
java
lvs
kafka
127.0.0.1:6379[12]>
127.0.0.1:6379[12]> QUIT
[root@redis201.oldboyedu.com ~]#
五.集合的应用场景
1.使用集合实现共同好友等功能
(1)创建测试数据,添加"XiaoFeng","DuanYu","XuZhu"这三个集合
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SADD XiaoFeng 阿紫 阿朱 段誉
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SADD DuanYu 阿紫 阿朱 萧峰 虚竹 王语嫣
5
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SADD XuZhu 段誉 梦姑 萧峰
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> KEYS *
DuanYu
XuZhu
XiaoFeng
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SMEMBERS XiaoFeng
段誉
阿紫
阿朱
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SMEMBERS DuanYu
虚竹
萧峰
阿紫
阿朱
王语嫣
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SMEMBERS XuZhu
段誉
萧峰
梦姑
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
(2)找出"XiaoFeng","DuanYu","XuZhu"这3个人的所有好友,换句话说就是找并集。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
DuanYu
XuZhu
XiaoFeng
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SUNION XiaoFeng DuanYu XuZhu
王语嫣
阿紫
段誉
虚竹
萧峰
梦姑
阿朱
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
(3)找出"XiaoFeng","DuanYu"的共同好友,换句话说就是找交集。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
DuanYu
XuZhu
XiaoFeng
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SINTER XiaoFeng DuanYu
阿紫
阿朱
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
(4)找出"DuanYu"有,但"XuZhu"没有的朋友,换句话说就是找差集。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
DuanYu
XuZhu
XiaoFeng
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SDIFF DuanYu XuZhu
王语嫣
虚竹
阿紫
阿朱
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
(5)找出"XuZhu"有,但"DuanYu"没有的朋友,换句话说就是找差集。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
DuanYu
XuZhu
XiaoFeng
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> SDIFF XuZhu DuanYu
段誉
梦姑
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
2.Redis应用场景案例总结
案例:
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,
温馨提示:
集合中的元素是去重且无序的!