用法
Redis 中的 Set 是一个无序,不重复集合(里面的元素为字符串),支持常用的集合操作。
常见命令
1. 增
添加一个或多个元素到 set 中
SADD key member [ member ... ]
返回值: 添加成功的元素个数
将一个元素移到另一个 set 中
SMOVE source destination member
source(原来的 set),destination(移动到的 set),member (要移动的元素)
返回值: 1 --- 成功,0 --- 失败
2. 删
删除指定的元素
SREM key member [member ...]
返回值: 本次操作删除的元素个数。
随机删除元素
SPOP key [count](count表示要删除的个数)
返回值:返回删除的元素
3. 查
获取元素的个数
SCARD key
获取 set 中所有的元素
SMEMBERS key
返回值: 所有元素的列表。
判断当前的元素是否在集合中
SISMEMBER key member(你想要判断的成员)
返回值: 1 --- 存在, 0 --- 该元素不存在 / key不存在
4. 交集,并集,差集
获取 set 的交集中的元素
SINTER key [key ...]
返回值: 交集的元素。
SINTERSTORE destination key [key ...](把算好的交集放到指定的 destination 中)
返回值: 交集的元素个数
获取 set 的并集中的元素
SUNION key [key ...]
返回值:并集的元素。
SUNIONSTORE destination key [key ...](把算好的并集放到指定的 destination 中)
返回值: 并集 的元素个数
获取 set 的差集中的元素
SDIFF key [key ...]
返回值: 差集的元素。
SDIFFSTORE destination key [key ...](把算好的差集放到指定的 destination 中)
返回值: 差集元素的个数
内部编码
intset:当集合中的元素都是整数且数量较少时,Redis 使用 intset 结构。intset 是一个紧凑的整数数组,节省内存。
hashtable:当集合中的元素数量较多或类型多样时,Redis 会使用 hashtable 编码。hashtable 提供了快速的查找性能。
应用场景
标签系统:可以使用 Set 存储用户的标签,如兴趣爱好。通过集合运算,可以轻松实现标签交集、并集和差集的计算。
-
给用户添加标签
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5 -
给标签添加用户
sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3 -
删除用户下的标签
srem user:1:tags tag1 tag5
-
删除标签下的用户
srem tag1:users user:1
srem tag5:users user:1 -
计算用户的共同兴趣爱好
sinter user:1:tags user:2:tags
唯一性检测:利用 Set 的无序且不重复特性,可以快速检测出数据集中的重复元素。
社交网络:在社交网络应用中,可以使用 Set 存储用户的好友列表或关注列表,并通过集合操作实现好友推荐等功能