# Redis 中常见的数据类型有哪些?

7 min read
Table of Contents

Redis 中常见的数据类型有哪些?

Redis 常见数据类型详解

【核心定义】

Redis 是一个基于内存的键值存储系统,它提供了多种数据结构类型,使得开发者能够超越简单的字符串操作,实现更复杂的数据模型和高效的操作。

【关键要点】

  1. String(字符串)

    • 本质:二进制安全的字符串,最大512MB
    • 特性:可存储文本、数字、序列化对象;支持原子递增/递减操作
    • 应用场景:缓存、计数器、分布式锁
  2. Hash(哈希)

    • 本质:键值对集合,类似编程语言中的Map
    • 特性:适合存储对象;支持字段级操作,节省网络开销
    • 应用场景:用户信息、商品详情等对象存储
  3. List(列表)

    • 本质:双向链表结构
    • 特性:按插入顺序排序;支持两端插入/弹出;可做阻塞队列
    • 应用场景:消息队列、最新消息列表、粉丝列表
  4. Set(集合)

    • 本质:无序且元素唯一的集合
    • 特性:支持交集、并集、差集运算;快速判断元素是否存在
    • 应用场景:共同好友、标签系统、抽奖去重
  5. Sorted Set(有序集合)

    • 本质:带权重的Set,每个元素关联一个分数
    • 特性:按分数排序;支持范围查询;元素唯一但分数可重复
    • 应用场景:排行榜、延迟队列、带权重的任务调度
  6. Bitmaps(位图)

    • 本质:基于String的位操作
    • 特性:节省空间;支持位运算
    • 应用场景:用户签到、活跃用户统计
  7. HyperLogLog

    • 本质:概率性数据结构
    • 特性:固定12KB内存,可估算超大集合基数;误差率约0.81%
    • 应用场景:UV统计、大规模去重计数
  8. Geospatial(地理空间)

    • 本质:基于Sorted Set的地理位置存储
    • 特性:存储经纬度;支持距离计算、范围查询
    • 应用场景:附近的人、地理位置服务
  9. Stream(流)

    • 本质:Redis 5.0引入的日志数据结构
    • 特性:支持消息持久化、消费者组、消息回溯
    • 应用场景:消息队列、事件溯源

【深度推导/细节】

1. 底层实现机制

  • String:采用SDS(Simple Dynamic String)实现,相比C字符串具有O(1)长度获取、二进制安全、自动扩容等优势
  • Hash:小数据量使用ziplist(压缩列表),大数据量使用hashtable
  • List:早期版本使用ziplist或linkedlist,3.2版本后统一使用quicklist(ziplist的链表)
  • Set:整数集合使用intset,其他使用hashtable
  • Sorted Set:小数据量使用ziplist,大数据量使用skiplist+dict组合

2. 内存优化策略

  • 编码转换阈值:
    • Hash:元素数≤512且所有值≤64字节时使用ziplist
    • List:元素数≤512且所有值≤64字节时使用ziplist
    • Set:元素都是整数且数量≤512时使用intset
    • Sorted Set:元素数≤128且所有值≤64字节时使用ziplist

3. 性能考量

  • 时间复杂度:
    • 大多数操作O(1):String的GET/SET、Hash的HGET/HSET
    • 范围操作O(N):List的LRANGE、Sorted Set的ZRANGE
    • 集合运算O(N):Set的SINTER、SUNION

【关联/对比】

Redis数据类型 vs 传统数据库

特性Redis数据类型传统数据库表
查询方式基于键或特定结构操作SQL查询
关联关系无内置关联,需应用层处理外键关联
事务支持简单事务(MULTI/EXEC)ACID事务
持久化可选(RDB/AOF)强制持久化

Redis内部数据结构对比

数据类型底层实现适用场景
StringSDS简单键值、计数器
Hashziplist/hashtable对象存储、字段频繁更新
Listquicklist队列、栈、时间线
Setintset/hashtable去重、集合运算
Sorted Setziplist/skiplist+dict排行榜、范围查询

『面试官追问』

常见追问问题:

  1. Redis的String类型为什么能存储多种格式的数据?

    • Redis的String是二进制安全的,不关心内容格式,可以存储JSON、序列化对象、数字等
  2. List和Stream在消息队列场景下如何选择?

    • List适合简单队列,Stream适合需要消息持久化、消费者组、消息确认的复杂场景
  3. HyperLogLog的误差率0.81%是怎么来的?

    • 基于概率算法,使用16384个6位寄存器,标准误差为1.04/√m,其中m=16384
  4. Sorted Set的跳表实现原理是什么?

    • 多层索引结构,查询时间复杂度O(logN),空间复杂度O(N),支持快速范围查询
  5. Redis 6.0新增了哪些数据类型特性?

    • 无新增数据类型,但增强了现有类型的命令和性能

版本演进差异:

  • Redis 3.2:引入quicklist优化List性能
  • Redis 4.0:优化内存回收,支持模块化
  • Redis 5.0:引入Stream类型
  • Redis 6.0:多线程I/O,客户端缓存
  • Redis 7.0:Function API,多部分AOF

选择建议:

  • 缓存简单数据:String
  • 存储对象:Hash
  • 队列/栈:List
  • 去重/集合运算:Set
  • 排行榜/范围查询:Sorted Set
  • 地理位置:Geospatial
  • 消息队列:Stream
  • 基数统计:HyperLogLog

每种数据类型都有其特定的应用场景和性能特征,正确选择数据类型是优化Redis性能的关键。

My avatar

文章看完了,不打算去别的篇章转转吗?👀 感谢你的耐心阅读!如果你有问题想探讨,或者发现了文中的 Bug,请务必通过页脚的链接联系我


More Posts

# Redis 中的 Big Key 问题是什么?如何解决?

9 min read

Redis Big Key 是指单个 Key 所对应的 Value 值过大(如字符串类型超过 10KB,集合/列表/哈希/有序集合等元素数量过多或总大小过大),导致在存储、读取、删除等操作时引发性能瓶颈、内存不均、阻塞风险等一系列问题的现象。

Read

Comments