基本数据类型以及底层数据结构

Redis 提供了五种基本数据类型,每种类型在不同场景下有特定的用途,并且底层实现使用了高效的数据结构。以下是 Redis 的基本数据类型及其底层数据结构的详细说明:


1. String(字符串)

  • 用途
    • 存储简单的键值对,如用户信息、计数器等。
    • 可以存储字符串、整数或浮点数,最大存储 512MB。
  • 底层数据结构
    • SDS(Simple Dynamic String):Redis 的字符串是基于 SDS 实现的动态字符串。
      • 支持动态扩容,避免频繁的内存分配。
      • 额外维护了字符串长度,支持高效的长度获取操作。
  • 示例
    SET key "value"
    INCR counter
    

2. Hash(哈希)

  • 用途
    • 存储对象或结构化数据,如用户信息(name、age 等字段)。
  • 底层数据结构
    • ZipList(压缩列表):当字段数量较少且字段和值较小时使用,节省内存。
    • HashTable(哈希表):当字段数量或字段值较大时使用,支持快速查询。
  • 示例
    HSET user:1 name "Alice"
    HGET user:1 name
    

3. List(列表)

  • 用途
    • 存储有序的字符串列表,如消息队列、任务队列。
  • 底层数据结构
    • ZipList(压缩列表):当列表元素较少且每个元素较小时使用,节省内存。
    • LinkedList(双向链表):当列表元素较多或元素较大时使用,支持快速插入和删除。
  • 示例
    LPUSH list "value1"
    RPUSH list "value2"
    LPOP list
    

4. Set(集合)

  • 用途
    • 存储无序的唯一字符串集合,如标签、好友列表。
  • 底层数据结构
    • IntSet(整数集合):当集合中的元素全是整数且数量较少时使用,节省内存。
    • HashTable(哈希表):当集合元素较多或包含非整数时使用,支持快速查询。
  • 示例
    SADD set "value1"
    SADD set "value2"
    SMEMBERS set
    

5. ZSet(有序集合)

  • 用途
    • 存储带有分数的有序集合,如排行榜、优先队列。
  • 底层数据结构
    • ZipList(压缩列表):当集合元素较少且分数较小时使用,节省内存。
    • SkipList(跳表):当集合元素较多或分数较大时使用,支持快速范围查询和排序。
  • 示例
    ZADD zset 1 "value1"
    ZADD zset 2 "value2"
    ZRANGE zset 0 -1 WITHSCORES
    

Redis 数据类型与底层数据结构的关系

数据类型 底层数据结构 适用场景
String SDS(动态字符串) 存储简单键值对、计数器、缓存等
Hash ZipList、HashTable 存储对象或结构化数据
List ZipList、LinkedList 消息队列、任务队列
Set IntSet、HashTable 存储无序唯一集合,如标签、好友列表
ZSet ZipList、SkipList 排行榜、优先队列

Redis 数据类型的选择建议

  1. String:适合存储简单的键值对或计数器。
  2. Hash:适合存储结构化数据,如用户信息。
  3. List:适合存储有序数据,如消息队列。
  4. Set:适合存储无序且唯一的数据,如标签。
  5. ZSet:适合存储需要排序的数据,如排行榜。

通过理解 Redis 的基本数据类型及其底层数据结构,可以根据具体业务场景选择合适的数据类型,从而优化存储和查询性能。