尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Redis Set 数据结构

Redis Set 数据结构 Redis Set 数据结构Set 是 Redis 提供的无序集合类型核心特性是元素唯一、自动去重支持交集、并集、差集等集合运算是业务中去重、标签、社交关系等场景的常用数据结构。一、核心特性元素唯一性集合内不允许重复元素重复添加会被自动忽略天然支持去重无序性不保留元素的插入顺序输出顺序与插入顺序无关原子性所有 Set 命令均为原子操作并发场景下无需额外加锁保证数据安全。编码自适应底层有两种存储编码会根据元素类型、数量自动切换优化内存占用。无硬数量限制单个 Set 的元素数量无强制上限仅受服务器内存约束。二、底层编码实现Redis Set 有两种底层编码intset整数集合和hashtable哈希表编码转换为单向不可逆只能从小内存编码转到大内存编码不能反向转回。1. intset整数集合触发条件当集合同时满足以下两个条件时使用 intset 编码存储所有元素均为整数类型元素数量 ≤set-max-intset-entries配置项默认值 512数据结构intset 是一块连续的内存结构定义如下typedefstructintset{uint32_tencoding;// 整数编码类型int16 / int32 / int64uint32_tlength;// 集合中元素的总数量int8_tcontents[];// 柔性数组存储元素按从小到大有序排列}intset;升级机制当新插入的整数超过当前编码的取值范围时比如 int16 存不下 32768会触发编码升级根据新元素的类型重新分配更大的内存空间将原有所有元素转换为新的整数类型并按顺序重新排列更新encoding字段插入新元素特点只升级、不降级。即使后续元素被删除、数量减少编码也不会回退到更小的类型。性能与优势内存占用极低连续数组存储没有哈希表的指针、桶开销查找性能基于有序数组做二分查找时间复杂度O(log n)适合场景小体量的整数集合如用户ID、订单ID2. hashtable哈希表/字典触发条件满足任一条件即自动从 intset 转换为 hashtable集合中出现非整数类型的元素元素数量超过set-max-intset-entries阈值实现原理复用 Redis 通用的字典Dict结构集合元素作为字典的 key字典的 value 统一为 NULL利用哈希表 key 的唯一性保证集合元素不重复性能与优势增删查平均时间复杂度O(1)性能稳定支持任意类型的元素无类型限制适合场景大体量集合、非整数元素集合3. 编码配置可通过redis.conf调整 intset 的元素数量阈值set-max-intset-entries 512 # 默认值可根据业务场景调大/调小三、常用命令分类详解1. 基础增删查操作命令语法功能说明SADDSADD key member [member ...]向集合添加一个 / 多个元素返回成功新增的元素数量重复元素自动忽略SREMSREM key member [member ...]删除集合中一个 / 多个元素返回成功删除的数量SISMEMBERSISMEMBER key member判断元素是否在集合中存在返回1不存在返回0SCARDSCARD key获取集合元素总数基数SMEMBERSSMEMBERS key返回集合中所有元素SSCANSSCAN key cursor [MATCH pattern] [COUNT count]渐进式遍历集合避免大集合阻塞主线程命令示例添加元素重复的3会被自动去重127.0.0.1:6379SADD myset1233(integer)3查看所有元素无序输出127.0.0.1:6379SMEMBERS myset1)12)23)3判断元素是否存在127.0.0.1:6379SISMEMBER myset2(integer)1获取元素总数127.0.0.1:6379SCARD myset(integer)3删除指定元素127.0.0.1:6379SREM myset2(integer)12. 集合运算命令支持交集、并集、差集三种集合运算分为直接返回结果和结果存入新Key两类大集合运算推荐使用带STORE的版本避免大数据量阻塞网络。命令语法功能说明SINTERSINTER key [key ...]计算多个集合的交集返回所有集合中共同存在的元素SINTERSTORESINTERSTORE destination key [key ...]计算交集并将结果存入destination返回结果集的元素数量SUNIONSUNION key [key ...]计算多个集合的并集返回所有去重后的元素SUNIONSTORESUNIONSTORE destination key [key ...]计算并集并存入destinationSDIFFSDIFF key [key ...]计算差集第一个集合减去后续所有集合的元素SDIFFSTORESDIFFSTORE destination key [key ...]计算差集并存入destination命令示例127.0.0.1:6379SADD set1123127.0.0.1:6379SADD set2234交集两个集合共有的元素127.0.0.1:6379SINTER set1 set21)22)3差集set1有、但set2没有的元素127.0.0.1:6379SDIFF set1 set21)1并集两个集合所有去重后的元素127.0.0.1:6379SUNION set1 set21)12)23)34)4将交集结果存入新key不直接返回127.0.0.1:6379SINTERSTORE inter_result set1 set2(integer)23. 随机元素操作命令语法功能说明SPOPSPOP key [count]随机弹出并删除count个元素默认1个返回被删除的元素SRANDMEMBERSRANDMEMBER key [count]随机返回count个元素不删除count为正返回不重复元素为负可重复命令示例127.0.0.1:6379SADD lottery10011002100310041005随机抽取1个中奖用户抽取后从集合移除不可重复中奖127.0.0.1:6379SPOP lottery1003随机返回2个不重复元素不删除原集合数据127.0.0.1:6379SRANDMEMBER lottery21)10012)10054. 元素移动命令语法功能说明SMOVESMOVE source destination member原子性地将元素从source集合移动到destination集合成功返回1四、典型应用场景1. 去重类业务点赞、收藏、浏览记录、IP访问统计等天然需要去重的场景文章1的点赞用户集合SADD article:1:likes user:100 SISMEMBER article:1:likes user:100# 判断用户是否已点赞SCARD article:1:likes# 统计点赞总数2. 标签系统用户标签、内容标签支持多标签组合筛选正向给用户打标签SADD user:100:tags 篮球 编程 音乐 SADD user:200:tags 编程 摄影 旅行反向按标签找用户配合交集实现多标签筛选SADD tag:编程:users100200SADD tag:音乐:users100300SINTER tag:编程:users tag:音乐:users# 找出同时有两个标签的用户3. 社交关系共同好友、共同关注、推荐关注等场景计算两个用户的共同好友SINTER user:A:friends user:B:friends推荐关注A关注的人里B还没关注的SDIFF user:A:follows user:B:follows4. 抽奖系统SPOP不重复抽奖抽完即排除适合一等奖、二等奖逐轮抽取SRANDMEMBER可重复抽奖适合每日签到、全民抽奖类活动5. 权限/角色校验存储用户权限、角色集合快速校验权限SADD user:admin:perms user:add user:delete order:query SISMEMBER user:admin:perms user:delete五、性能特性与最佳实践. 最佳实践大集合用渐进式遍历元素过千的集合遍历必须使用SSCAN避免阻塞主线程优先使用整数元素业务中尽量用整数ID作为集合元素充分利用 intset 的内存优化大集合运算预计算频繁的交集、并集计算建议定时预计算后缓存结果避免实时计算阻塞合理配置阈值若业务多为小整数集合可适当调大set-max-intset-entries延长 intset 适用范围单元素过期不用 SetSet 仅支持整个 Key 设置 TTL单个元素无法设置过期时间需单元素过期请使用 ZSet分数存储过期时间戳
返回列表