Redis集合(Set)是一种无序、不重复的字符串集合数据类型,非常适合存储唯一元素列表。核心方法包括SADD添加元素、SREM移除元素、SMEMBERS获取所有元素、SISMEMBER检查成员是否存在、SCARD获取集合大小、SRANDMEMBER随机获取元素、SPOP弹出随机元素、SINTER求交集、SUNION求并集、SDIFF求差集。这些方法时间复杂度大多为O(1)或O(N),极大提升了数据库性能,避免了传统关系型数据库的复杂JOIN操作。
SADD、SREM 和 SCARD 的基本使用
SADD key member [member ...]:向集合中添加一个或多个成员,不存在的集合将被创建。当集合中已经存在该成员时,该成员将被忽略。示例:SADD myset "apple" "banana" "apple" 返回添加成功的成员数。
SREM key member [member ...]:移除集合中的一个或多个成员,不存在的成员将被忽略。示例:SREM myset "apple" 返回移除成功的成员数。
SCARD key:返回集合的成员数。示例:SCARD myset 返回3(如果有三个元素)。
SMEMBERS 和 SISMEMBER 的查询操作
SMEMBERS key:返回集合中的所有成员。注意:当集合较大时,SMEMBERS 可能阻塞服务器,建议使用 SSCAN 进行增量迭代。
SISMEMBER key member:返回成员是否是集合的成员,1表示是,0表示否。示例:SISMEMBER myset "banana" 返回1。
SRANDMEMBER 和 SPOP 的随机操作
SRANDMEMBER key [count]:从集合中随机返回一个或多个成员,默认1个。count为负数时允许重复返回。
SPOP key [count]:随机移除并返回一个或多个成员。示例:SPOP myset 返回并移除一个随机成员。
集合运算:SINTER、SUNION、SDIFF
SINTER key [key ...]:返回一个或多个集合的交集。示例:SINTER set1 set2。
SUNION key [key ...]:返回一个或多个集合的并集。示例:SUNION set1 set2。
SDIFF key [key ...]:返回一个集合与其他集合的差集。示例:SDIFF set1 set2 返回set1中不在set2的元素。
这些运算还有存储版本如 SINTERSTORE、SUNIONSTORE、SDIFFSTORE,可直接将结果保存到新集合中。
性能优化技巧
1. 使用管道(Pipeline)批量执行命令,减少网络往返。2. 集合大小控制在合理范围内,避免SMEMBERS阻塞。3. 利用SSCAN进行游标迭代大集合。4. 结合Lua脚本原子执行复杂集合操作。5. 对于高频访问,使用SISMEMBER快速检查存在性。6. 监控内存使用,及时清理无用集合。
FAQ
Q: Redis集合能存储多少元素?
A: 理论上232个元素(约42亿),实际受内存限制,通常建议不超过千万级。
Q: Set和List有什么区别?
A: Set无序且自动去重,List有序允许重复,适合不同场景。
Q: 如何处理大集合的迭代?
A: 使用SSCAN key cursor [MATCH pattern] [COUNT count],支持模式匹配和增量返回。
Q: 集合操作对性能影响大吗?
A: 单集合O(1),多集合O(N),N为最小集合大小,高效但大集合需谨慎。