Redis Set类型操作与使用场景
一、Set类型操作
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
无序
元素不可重复
查找快
支持交集、并集、差集等功能
Set的常见命令有:
SADD key member … :向set中添加一个或多个元素
# 添加多个值
127.0.0.1:6379> sadd user:1:friends bob jack job
3
SMEMBERS:获取set中的所有元素
# 获取元素
127.0.0.1:6379> smembers user:1:friends
job
bob
jack
SCARD key: 返回set中元素的个数
# 返回元素数量
127.0.0.1:6379> scard user:1:friends
3
SISMEMBER key member:判断一个元素是否存在于set中
# 判断是否存在bob(返回1为存在)
127.0.0.1:6379> sismember user:1:friends bob
1# 判断是否存在hony(返回0为不存在)
127.0.0.1:6379> sismember user:1:friends hony
0
SREM key member … : 移除set中的指定元素
# 删除元素job
127.0.0.1:6379> srem user:1:friends job
1# 查看是否删除
127.0.0.1:6379> smembers user:1:friends
bob
jack
SINTER key1 key2 … :求key1与key2的交集
# 创建3个元素
127.0.0.1:6379> sadd user:2:friends bob li hony
3# 交集
127.0.0.1:6379> sinter user:1:friends user:2:friends
bob
SDIFF key1 key2 … :求key1与key2的差集
# 查询用户1的差集
127.0.0.1:6379> sdiff user:1:firends user:2:friends
jack# 查询用户2的差集
127.0.0.1:6379> sdiff user:2:friends user:1:friends
hony
li
SUNION key1 key2 … :求key1与key2的并集
# 并集
127.0.0.1:6379> sunion user:1:friends user:2:friends
bob
hony
jack
li
例如两个集合:s1和s2:
求交集:SINTER s1 s2
求s1与s2的不同:SDIFF s1 s2
二、使用场景
Set类型在Redis中主要用于存储无序且不重复的数据集合,以下是几个典型的使用场景:
共同好友/关注列表:
在社交类应用中,获取两个人或多个人的共同好友或共同关注的用户,是一个常见的需求。使用Set类型可以方便地实现这个功能,只需要将每个人的好友或关注的用户ID存储在一个Set中,然后通过求交集的操作就可以得到共同好友或关注的用户列表。
标签系统:
在一些需要给用户打标签的应用中,比如电商网站的商品标签、博客的标签等,每个用户可能有多个标签,而且标签之间是不重复的。这时候就可以用Set类型来存储用户的标签,方便地添加、删除和查询标签。
唯一性校验:
有些场景中需要保证数据的唯一性,比如用户注册时输入的手机号或邮箱,不能重复。这时候可以用Set类型来存储已经注册过的手机号或邮箱,当用户再次输入时,只需要判断输入的值是否在Set中即可。
随机推荐:
在一些需要随机展示内容的场景中,比如首页的推荐内容,可以先将需要展示的内容ID存储在一个Set中,然后随机从Set中选取几个ID来展示。这样可以保证每次展示的内容都是随机的,而且不会重复。
IP地址去重:
在一些需要记录用户访问IP的应用中,比如网站访问统计、API调用次数统计等,可以使用Set类型来存储访问过的IP地址,这样可以方便地获取到去重后的IP地址列表和数量。