Redis Set是一个无序的、不重复的字符串集合,底层使用哈希表实现,支持O(1)的插入、删除和查找操作。主要命令包括SADD添加元素、SREM删除元素、SMEMBERS获取所有元素、SISMEMBER检查成员是否存在、SCARD获取集合大小。集合运算如SINTER求交集、SUNION求并集、SDIFF求差集,时间复杂度大多为O(N),N为集合大小,非常适合标签系统、好友列表、抽奖等场景。
SADD命令详解
SADD key member [member ...] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作值的集合。当 key 不是集合类型时,返回一个错误。
SREM命令详解
SREM key member [member ...] 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。当 key 不是集合类型时,返回一个错误。
SCARD命令详解
SCARD key 返回集合 key 的基数(集合中元素的数量)。
SISMEMBER命令详解
SISMEMBER key member 判断 member 元素是否存在于集合 key 之中。
SMEMBERS命令详解
SMEMBERS key 返回集合 key 中的所有成员。不存在的 key 被视为空集合。
SINTER命令详解
SINTER key [key ...] 返回给定集合的交集。
SUNION命令详解
SUNION key [key ...] 返回给定集合的并集。
SDIFF命令详解
SDIFF key [key ...] 返回给定集合的差集。
Set实际应用场景
Set类型非常适合需要无重复元素且快速判断元素是否存在或做集合运算的业务场景。比如:抽奖系统用SADD添加参与者,SRANDMEMBER随机抽取;用户标签系统用SINTER计算共同标签;好友关系用SUNION合并好友列表。
性能优化Tips
Set操作平均时间复杂度O(1),但集合运算如SINTER复杂度O(N),大集合时建议分片或用Lua脚本批量处理,避免一次性加载过多数据到内存。
FAQ
Q: Redis Set能存储多少元素?
A: 单Set最多可存2^32-1个元素,约40亿,实际受内存限制。
Q: Set和List有什么区别?
A: Set无序且自动去重,List有序允许重复。
Q: 怎么随机获取Set元素?
A: 用SRANDMEMBER key [count]命令。
Q: Set支持排序吗?
A: 不支持,Set无序,如需排序用Sorted Set。
Q: 集合运算结果怎么保存?
A: 用SINTERSTORE、SUNIONSTORE、SDIFFSTORE保存到新key。