Redis里头怎么搞交集,底层原理到底是咋回事儿,想弄明白这事儿得先了解啥机制
- 问答
- 2026-01-15 19:52:04
- 2
想知道Redis里怎么搞交集,底层原理是啥,咱们得先弄明白一个最核心的东西:Redis的键值对里,这个“值”到底能是啥玩意儿,你不能一上来就盯着交集命令看,那就像只学炒菜步骤却不认识油盐酱醋一样,容易迷糊。
第一件事:得知道Redis的“集合”是个啥
Redis不是个简单的存字符串的字典,它支持好几种数据结构,“集合”(Set)就是其中之一,你可以把它想象成一个麻袋,里面扔进去一堆东西,比如把所有喜欢看科幻小说的用户ID扔进一个叫“sci-fi-fans”的麻袋里,这个麻袋有俩特点:1. 里面的东西是无序的,没有先来后到,2. 里面的东西都是唯一的,同一个用户ID你扔进去一百遍,麻袋里也只有一个。
明白了集合是这么个东西,交集就很好理解了,假设我们还有另一个麻袋叫“comedy-fans”,里面装的是喜欢看喜剧片的用户ID。“既喜欢科幻片又喜欢喜剧片”的用户是哪些人呢?答案就是把“sci-fi-fans”和“comedy-fans”这两个麻袋都倒出来,找出里面都有的那些用户ID,这个找共同部分的过程,就是求交集,在Redis里,用的命令就是 SINTER key1 key2 ...。
第二件事:光知道命令不行,得瞅瞅麻袋的里子(底层结构)
Redis这个“集合”麻袋,可不是随便拿个布袋子做的,它内部有两种实现方式,相当于有时候用“帆布麻袋”,有时候用“金属保险箱”,用哪个,取决于里面装的东西多不多、大不大。

-
第一种:整数集合(Intset),这就像个紧凑的小盒子,当你往集合里塞的数据全都是整数,并且数量不多的时候(Redis会有个配置参数决定多少算“不多”,比如默认512个),Redis就会用这个“整数集合”,它的好处是特别省地方,把所有整数按顺序紧凑地排列在一起,找起来也快,因为有序嘛,可以用二分查找,这可以理解为一种“内存优化模式”。
-
第二种:哈希表(Hash Table),这是更通用、更常用的“大麻袋”,一旦你的集合里出现了非整数的数据(比如字符串),或者里面的元素数量超过了整数集合的承受能力,Redis就会自动把这个“集合”从“整数集合”升级成“哈希表”,哈希表是啥?你可以把它想象成一个大仓库,里面有好多好多小柜子,当你存一个元素时,Redis会用一个函数(哈希函数)算一下这个元素的“地址”,然后把它放进对应编号的小柜子里,下次要找这个元素在不在,同样算一下地址,直接去那个柜子里看一眼就行,速度极快,几乎不受仓库里货物总数的影响。
回到交集原理:Redis是怎么在两个麻袋里找共同东西的?

理解了底层是哈希表,交集的算法就清晰了,假设我们现在有两个集合A和B,Redis要计算 SINTER A B,它不会傻乎乎地把A和B里每个元素都两两比较一遍,那样太慢了。
它会用一个非常聪明的策略:
- 判断大小:先看看A和B哪个集合的元素数量更少,假设A更小。
- 遍历小的:Redis会把小的集合A里的所有元素,一个一个地取出来。
- 检查大的:每取出A的一个元素,就立刻去大的集合B里查一下,看这个元素在不在B里面,因为集合B底层是哈希表,这个“检查存在”的操作非常快,几乎是瞬间完成的(时间复杂度是O(1))。
- 收集结果:如果这个元素在B里也存在,那它就是交集的一员,把它放到结果集合里,如果不在,就跳过。
这个过程,专业点叫“用时间复杂度为O(1)的查找操作,去遍历较小的那个集合”,它的总耗时主要取决于较小集合的大小,而不是两个集合加起来的大小,这就像你要在一大堆人中找出和你同一天生日的人,你不会去问每一个人,而是直接喊一句“谁也是X月X日生日?”,然后看谁举手,这里,“喊一句”就相当于在大的哈希表里做一次快速查找。
想弄明白Redis交集的机制,你得先了解:
- 集合的本质:一个无序、唯一种类的数据结构,这是进行集合运算(交、并、差)的基础。
- 底层的两种实现:整数集合(Intset)用于优化存储小规模整数集;哈希表(Hash Table)是通用且高效的实现方式,其O(1)复杂度的查找特性是关键。
- 高效的算法策略:
SINTER命令的核心原理是利用哈希表的快速查找能力,通过遍历较小的集合来高效地确定交集,避免了低效的全量比较。
你下次用 SINTER 的时候,脑子里就可以想象这个画面:Redis拎起那个元素少的麻袋,把里面的东西一件一件拿出来,然后对着那个大的哈希表仓库喊:“喂,我手里这个号码的柜子里有东西吗?” 有,就收进结果框;没有,就下一个,就是这么简单直接又高效。
本文由钊智敏于2026-01-15发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/81355.html
