集合
一、认识
Redis
的 Set
数据结构是一种无序集合,包含多个不重复的元素,支持高效的集合操作,如交集、并集、差集等。Set
具有非常高效的插入、删除和查找操作,通常用于需要去重或者进行集合运算的场景。
Redis
结构特点: 无序, Set
中的元素没有顺序。你不能按照插入的顺序访问元素,但可以通过操作获取 Set
中的所有元素,或者执行集合运算(如交集、并集、差集); 不重复, Set
中的元素是唯一的。插入相同的元素不会改变 Set
的内容。这是 Set
最重要的特性,通常用于去重。
Redis
优化策略: Redis
中的 Set
数据结构通常使用 哈希表(Hash Table
) 或 整数集合(IntSet
) 来实现,具体实现依赖于 Set
的大小和元素类型。对于包含小整数(例如小于某个阈值的整数)的 Set
,Redis
会使用 IntSet
编码,这是一种更高效的内存表示方式。IntSet
是针对整数类型元素的优化。当 Set
中的元素全部为整数时,Redis
会自动使用 IntSet
编码来节省内存。IntSet
使用压缩方式存储整数集合,通常比哈希表更加节省内存。如果 Set
中只包含整数,IntSet
编码能够大大减少内存的占用。IntSet
编码只适用于整数类型的元素,当包含非整数类型时,Redis
会自动切换回哈希表实现。对于大多数的 Set
,Redis
使用哈希表来实现。哈希表是一种 key-value
存储结构,其中每个元素的哈希值会被用作存储位置的依据。哈希表提供了 O(1)
时间复杂度的插入、删除和查找操作,使得 Redis Set
在这些操作上表现非常高效。当 Set
中的元素数量较大时,Redis
会通过哈希表来存储元素,从而支持快速访问和操作。内存优化, Redis
通过智能选择哈希表和 IntSet
编码,在需要时自动切换,实现了内存的节省和高效的访问。例如,IntSet
编码显著减少了存储小整数集合时的内存占用。渐进式更新, Redis
使用渐进式的哈希表扩展策略,哈希表的大小会根据元素的插入自动调整,保证了在处理大量元素时的高效性。