介绍
Redis 的 Set是 String 类型的无序集合,与java中的HashSet类似,它的底层也是通过哈希表实现的,它具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集,并集,差集等功能
常用命令
SADD userset a b c
: 给userset集合添加1个或多个元素SMEMBERS userset
: 查看集合userset中的所有元素SREM userset a
: 删除集合userset中的a元素SISMEMBER userset a
: 判断集合userset中是否有a元素,有返回1,没有返回0SCARD userset
: 返回集合userset中元素的个数SINTER key1 key2
: 求key1和key2的交集,如下图b和c
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PGIMc9VR-1681144496891)(null)]SDIFF key1 key2
: 求key1与key2的差集,比如下图的a而不是d,d是key2与key1的差集
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2B0tDjTx-1681144494814)(null)]SUNION key1 key2
: 求key1和key2的并集:也就是上图的a,b,c,d,两个集合的全部元素去重
HashTag机制可以影响key被分配到的slot,从而可以使用那些被限制在slot中操作。HashTag即是用{}包裹key的一个子串,如{user:}1, {user:}2。在设置了HashTag的情况下,集群会根据HashTag决定key分配到的slot, 两个key拥有相同的HashTag:{user:}, 它们会被分配到同一个slot,允许我们使用MGET命令。通常情况下,HashTag不支持嵌套,即将第一个{和第一个}中间的内容作为HashTag。若花括号中不包含任何内容则会对整个key进行散列,如{}user:。HashTag可能会使过多的key分配到同一个slot中,造成数据倾斜影响系统的吞吐量,务必谨慎使用。
练习
- 将下面数据用redis的set集合存储:
- 赵东洋的好友:熊梦豪,朱豪杰,李大帅
SADD {friends:}zdy 熊梦豪 朱豪杰 李大帅
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8gq8dNL-1681144494804)(null)]
- 熊梦豪的好友:支天旭,赵东洋,朱豪杰
SADD {friends:}xmh 支天旭 赵东洋 朱豪杰
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cidmygFN-1681144494822)(null)]
2. 利用set的命令实现下面功能:
- 计算赵东洋的好友个数
192.168.2.14:26003> SCARD {friends:}zdy
3
- 计算赵东洋和熊梦豪有哪些共同好友
192.168.2.14:26003> SINTER {friends:}zdy {friends:}xmh
朱豪杰
- 查询那些人是赵东洋的好友却不是熊梦豪的好友
192.168.2.14:26003> SDIFF {friends:}zdy {friends:}xmh
熊 梦 豪
李 大 帅
- 查询赵东洋和熊梦豪的好友总共有哪些人
192.168.2.14:26003> SUNION {friends:}zdy {friends:}xmh
赵 东 洋
李 大 帅
朱 豪 杰
熊 梦 豪
支 天 旭
- 判断熊梦豪是否是赵东洋的好友
192.168.2.14:26003> SISMEMBER {friends:}zdy 熊梦豪
1
- 判断赵东洋是否是熊梦豪的好友
192.168.2.14:26003> SISMEMBER {friends:}xmh 赵东洋
1
- 将熊梦豪从赵东洋的好友列表中移除
192.168.2.14:26003> SREM {friends:}zdy 熊梦豪
1
192.168.2.14:26003> SMEMBERS {friends:}zdy
李 大 帅
朱 豪 杰