Redis 常用数据类型

106 阅读3分钟

Redis 常用数据类型

Redis 提供五种常用数据类型,它们分别是:

  1. 字符串(String)
    • 底层实现:在 Redis 中,字符串类型是一个简单的动态字符串。底层数据结构包括双向链表和压缩列表。自 Redis 7.0 起,压缩列表被称为紧凑列表(List Pack)。
  1. 哈希(Hash)
    • 底层实现:使用哈希表来存储数据。
  1. 列表(List)
    • 底层实现:通过双向链表来存储数据。
  1. 集合(Set)
    • 底层实现:采用哈希表作为底层数据结构。
  1. 有序集合(Sorted Set)
    • 底层实现:使用跳表(Skip List)和哈希表的组合。Redis 7.0 之前使用压缩列表和跳表,7.0 之后,数据量小的使用紧凑列表,数据量大的继续使用跳表。

总结:Redis 提供的五种数据类型通过不同的底层数据结构实现,支持高效的数据存储和操作。

Redis ZSet 的底层实现

Redis 的有序集合(ZSet)底层实现依赖于两种数据结构:

  1. Redis 7.0 之前:
    • 小数据量时使用压缩列表(Zip List)。
    • 大数据量时使用跳表(Skip List)。
  1. Redis 7.0 之后:
    • 小数据量时使用紧凑列表(List Pack)。
    • 大数据量时仍然使用跳表。

Redis 7.0之后的变化

在Redis 7.0版本之后,Redis对ZSet的实现进行了优化,原来使用的压缩列表(Ziplist)被**紧凑列表(Listpack)**取代。紧凑列表在内存使用和数据访问上比压缩列表更为高效,尤其是在存储大量数据时,内存占用更小,性能更高。

**紧凑列表(Listpack)压缩列表(Ziplist)**的区别在于,Listpack更加灵活,能够支持更多的数据类型并且减少内存浪费。因此,Redis 7.0版本之后的ZSet更加高效。

具体的规则:

对于 ZSet 的底层数据结构,用户可以使用 object encoding 命令来查看它所使用的底层实现。例如,在 Redis 7.0 之后,ZSet 会使用 ListPack 数据结构,因为其数据量较小。

// 查看某个 ZSet 的底层实现方式
127.0.0.1:6379> OBJECT ENCODING myZset
"listpack"

这表明 Redis 使用了紧凑列表(ListPack)来存储 ZSet。


附录:跳跃表(Skiplist)的工作原理

跳跃表是实现有序集合的核心数据结构之一。在Redis中,跳跃表通过随机化的方式来决定元素所在的层数。每个元素在跳跃表中都会根据随机数生成一到多层索引,从而实现快速查找。跳跃表的主要优势是插入和删除操作的时间复杂度为O(log N),查找操作的时间复杂度为O(log N),相比于传统的链表,它能大大提升性能。

跳跃表的添加流程以及查找流程:

  • 添加流程:当插入一个元素时,Redis会生成一个随机层数,表示该元素在跳跃表中的层数。跳跃表的层数并不是固定的,而是通过随机数来决定的。这种设计可以减少元素在表中的分布不均的情况。
  • 查找流程:查找操作会在跳跃表的不同层次中逐步进行,跳跃表通过多层索引加速查找速度,避免了顺序遍历的低效。

总结:ZSet 的底层实现会根据数据量的不同在压缩列表、紧凑列表和跳表之间进行选择。