010、Redis的集合(set)数据类型的应用场景
本文最后更新于 66 天前,其中的信息可能已经过时,如有错误请发送邮件到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还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,

    温馨提示:
        集合中的元素是去重且无序的!
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇