一、介绍
Redis的Set结构与Java中的HashSet类似,而HashSet底层其实是由HashMap来实现的,因此可以看做是一个value为null的HashMap。既然是HashMap,那底层肯定也是一个hash表,只不过这次我们不关心它的value了,而只关心它的key,此时它就变成了一个set了。
因此它具备与HashSet类似的特征:
- 无序(每一个元素都会使用hash算法来计算它插入的角标,因此数据的存储顺序和我们插入的顺序是无关的)
- 元素不可重复
- 查找快(根据哈希表做查找,时间复杂度是比较低的,因此速度是非常快的)
但是相比于Java中的HashSet,它多了一些功能
- 支持交集、并集、差集等功能。
这些功能它就可以非常方便的实现:好友列表、共同好友、关注等功能。因此在交友型的应用中使用还是非常广泛的。
二、Set类型的常见命令
1)对单个集合增删改查的操作
参数key
:集合名称
参数member
:插入进去的元素
...
:省略号表示可以一次插入 / 移除多个
- SADD key member … :向set中添加一个或多个元素
- SREM key member … : 移除set中的指定元素(remove)
- SCARD key: 返回set中元素的个数
- SISMEMBER key member:判断一个元素是否存在于set中(is menber),有点像Java中的contains
- SMEMBERS:获取set中的所有元素
2)多个集合之间的交互操作
- SINTER key1 key2 … :求key1与key2两个集合的交集
- SDIFF key1 key2 … :求key1与key2的差集(key1有key2没有)
- SUNION key1 key2 …:求key1和key2的并集(由于set不能重复,所以重复元素只会记录一次)
例如两个集合:s1和s2:
求交集:SINTER s1 s2
求s1与s2的不同:SDIFF s1 s2
三、代码实现
1)对单个集合增删改查的操作
127.0.0.1:6379> sadd s1 a b c # 向集合s1中添加a、b、c
(integer) 3
127.0.0.1:6379> smembers s1 # 获取集合中所有元素
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> srem s1 a # 删除集合中的a元素
(integer) 1
127.0.0.1:6379> SISMEMBER s1 a # 判断集合中是否有a元素
(integer) 0 # 没有
127.0.0.1:6379> SISMEMBER s1 b # 判断集合中是否有b元素
(integer) 1 # 有
127.0.0.1:6379> SCARD s1
(integer) 2 # 集合数量仅剩两个元素
2)多个集合之间的交互操作
案例
- 将下列数据用Redis的Set集合来存储:
- 张三的好友有:李四、王五、赵六
- 李四的好友有:王五、麻子、二狗
- 利用Set的命令实现下列功能:
- 计算张三的好友有几人
- 计算张三和李四有哪些共同好友
- 查询哪些人是张三的好友却不是李四的好友
- 查询张三和李四的好友总共有哪些人
- 判断李四是否是张三的好友
- 判断张三是否是李四的好友
- 将李四从张三的好友列表中移除
127.0.0.1:6379> SADD zs lisi wangwu zhaoliu # 张三的好友有:李四、王五、赵六
(integer) 3
127.0.0.1:6379> SADD ls wangwu mazi ergou # 李四的好友有:王五、麻子、二狗
(integer) 3
127.0.0.1:6379> SCARD zs # 计算张三的好友有几人
(integer) 3
127.0.0.1:6379> SINTER zs ls # 计算张三和李四有哪些共同好友
1) "wangwu"
127.0.0.1:6379> SDIFF zs ls # 查询哪些人是张三的好友却不是李四的好友
1) "zhaoliu"
2) "lisi"
127.0.0.1:6379> SUNION zs ls # 查询张三和李四的好友总共有哪些人
1) "wangwu"
2) "zhaoliu"
3) "lisi"
4) "mazi"
5) "ergou"
127.0.0.1:6379> SISMEMBER zs lisi # 判断李四是否是张三的好友
(integer) 1
127.0.0.1:6379> SISMEMBER ls zhangsan # 判断张三是否是李四的好友
(integer) 0
127.0.0.1:6379> SREM zs lisi # 将李四从张三的好友列表中移除
(integer) 1
127.0.0.1:6379> SMEMBERS zs
1) "zhaoliu"
2) "wangwu"