"王经理最近很头疼——他们电商平台的秒杀活动总是崩溃 😫,明明准备了足够库存,但总有用户反馈'明明看到有货却抢不到',甚至出现超卖问题,技术团队排查后发现,问题出在库存扣减的并发控制上..."
这就是Redis集合大显身手的时候了!作为Redis五种核心数据结构之一,集合(Set)不仅能解决这类并发问题,还能实现很多神奇功能,接下来就让我带你全面掌握Redis集合的高效玩法!
Redis集合(Set)是无序、唯一的字符串集合,底层用哈希表或整数集合实现,举个栗子 🌰:
用户A的好友列表 = {"小明", "小红", "小刚"}
用户B的好友列表 = {"小红", "小丽", "小强"}
# 添加元素(可批量) SADD friends:user1 "小明" "小红" # 查看所有元素 SMEMBERS friends:user1 # 判断是否成员(存在返回1,不存在0) SISMEMBER friends:user1 "小明" # 随机弹出元素(适合抽奖场景) SPOP friends:user1 # 删除指定元素 SREM friends:user1 "小红"
性能贴士:SMEMBERS操作会返回全部元素,大集合慎用!可以用SSCAN分批获取。
# 共同好友(交集) SINTER friends:user1 friends:user2 # 全部好友(并集) SUNION friends:user1 friends:user2 # A有但B没有的好友(差集) SDIFF friends:user1 friends:user2
真实案例:某社交App用SINTER计算共同好友,QPS提升20倍! 🚀
# 获取3个不重复随机元素(适合推荐系统) SRANDMEMBER friends:user1 3 # 获取3个可能重复的随机元素 SRANDMEMBER friends:user1 -3
# 把"小明"从user1好友移到user2(原子操作) SMOVE friends:user1 friends:user2 "小明"
# 获取集合元素数量(无需全量扫描) SCARD friends:user1
# 给文章打标签 SADD article:123:tags "科技" "AI" "编程" # 查找有"科技"标签的所有文章 # (需要配合反向索引实现)
# 记录访问IP(自动去重) SADD site:visitors:20250701 "192.168.1.1" # 统计UV SCARD site:visitors:20250701
# 参与抽奖 SADD lottery:202507 "user1" "user2" "user3" # 开奖(随机选取3名) SRANDMEMBER lottery:202507 3
# 添加黑名单 SADD system:blacklist "user123" # 请求时校验 IF SISMEMBER system:blacklist "user123" THEN RETURN "禁止访问" END
❌ 误区1:用集合存储有序数据(应该用ZSET)
✅ 正确:集合天生无序,需要排序请用ZSET
❌ 误区2:超大集合直接SMEMBERS
✅ 正确:10万+元素集合用SSCAN分批处理
❌ 误区3:频繁创建删除大集合
✅ 正确:重用集合对象减少内存分配开销
场景 | 适用结构 | 原因 |
---|---|---|
好友关系 | SET | 天然去重,支持集合运算 |
排行榜 | ZSET | 需要分数排序 |
最近访问 | LIST | 需要维护顺序 |
缓存数据 | STRING | 简单KV场景 |
Redis集合就像瑞士军刀 🗡️ —— 看似简单,但用好了能解决各种棘手问题,从去重统计到关系运算,从抽奖系统到黑白名单,掌握这些技巧后,你的Redis水平绝对能更上一层楼!
下次当你遇到需要去重或关系计算的场景时,不妨先想想:"这个用Redis集合是不是更优雅?" 🤔
(本文操作示例基于Redis 7.x版本,信息更新至2025年7月)
本文由 阎朗宁 于2025-07-30发表在【云服务器提供商】,文中图片由(阎朗宁)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/485079.html
发表评论