Redis数据类型与实现结构
Redis 提供了多种数据类型,每种数据类型都有其独特的实现结构和使用场景。以下是 Redis 中常见的数据类型及其底层实现结构:
-
字符串(String)
- 字符串是最基本的数据类型,可以存储二进制安全的字符串、整数或浮点数。
- 实现结构:Redis 使用
SDS
(Simple Dynamic String)结构来存储字符串,这是一种类似于 C 语言字符串的结构,但 SDS 优化了解决C字符串的一些缺陷,如长度信息预存储,减少多次操作时的内存重分配等。
-
列表(List)
- 列表是一个有序的字符串集合,可以在列表的两端进行高效地插入和删除操作。
- 实现结构:列表由多个
quicklist
(快速列表)组成,而quicklist
本质上是一个双向链表,每个节点包含一个ziplist
(压缩列表),从而实现了空间和时间复杂度的平衡。
-
哈希(Hash)
- 哈希是一个键值对的集合,可以在一个哈希数据结构中存储多个字段和值。
- 实现结构:哈希使用
ziplist
或hashtable
(散列表)来存储数据,取决于元素的数量和大小。当元素数量较少且较小的时候,Redis 使用ziplist
,反之则使用hashtable
。
-
集合(Set)
- 集合是一个无序的唯一值的集合,支持集合间的交集、并集和差集操作。
- 实现结构:集合使用
intset
(整数集合)或hashtable
,intset
用于存储整数值,且当集合中的所有元素都可以表示为整数时使用,以节省空间;否则使用hashtable
。
-
有序集合(Sorted Set)
- 有序集合类似于集合,但每个成员都关联着一个分数(score),可以根据分数对成员进行排序,同时保持唯一性。
- 实现结构:有序集合使用
skiplist
(跳跃表)和hashtable
结构。skiplist
用于按分数排序和查找,而hashtable
用于存储成员和分数的映射。
-
位图(Bitmaps)
- 位图是一种按照单个位进行操作的字符串类型,常用于活跃用户统计、用户签到功能等。
- 实现结构:位图在 Redis 中实际上就是一系列的比特位,存储在字符串类型中,每个比特位可以表示一个元素的存在与否。
-
HyperLogLog
- HyperLogLog 是一种用于近似计算不同元素个数(基数)的算法,添加元素时只记录元素个数,不存储元素本身,节省空间并避免重复计数。
- 实现结构:HyperLogLog 使用概率数据结构来估计基数,存储空间非常小,适用于需要大量数据的统计场景。
-
GeoSpatial Indexes
- 地理空间索引用于地理位置查询,如两点之间的距离、一个点附近有多少元素等。
- 实现结构:地理空间索引在内部使用
sorted set
结构,其中每个元素的 score 代表经纬度的编码值,从而可以利用 sorted set 的范围查询能力来进行地理空间查询。
收藏文章数量从多到少与“把书读薄”是一个道理