Redis 作为高性能的内存数据库,不仅仅是一个简单的 “key-value” 存储系统,它支持多种灵活的数据结构,用于不同的业务场景。
核心的五种数据类型包括:
- String(字符串)
- List(列表)
- Hash(哈希)
- Set(集合)
- ZSet(有序集合)
🧭 目录
一、String(字符串)
✅ 定义
Redis 中最基本的数据类型。
每个 key 对应一个 value,value 可以是字符串、整数、JSON、二进制文件等。
⚙️ 内部编码结构
| 编码方式 | 说明 |
|---|---|
int | 当值为整数并可用 long 存储时 |
embstr | 短字符串(≤44字节),单次内存分配 |
raw | 长字符串(>44字节),两次内存分配 |
💡 特性
- 最大值:512MB
- 支持二进制安全(可存任意字节序列)
- 可进行自增、自减等数值操作
🔧 常用命令
SET key value # 设置值
GET key # 获取值
INCR key # 自增
DECR key # 自减
APPEND key value # 追加字符串
STRLEN key # 获取长度
MSET key1 v1 key2 v2 # 批量设置
MGET key1 key2 # 批量获取
SETEX key seconds value # 设置带过期时间的值
🧠 应用场景
- 缓存热点数据(如用户信息、Token)
- 计数器(网站PV/UV)
- 分布式锁(SET NX + EX)
- Session 缓存或 JSON 对象序列化
⚠️ 使用注意
- 避免存储过大字符串,防止内存碎片
- 修改大字符串会引发复制操作(性能下降)
- 分布式锁要设置过期时间防止死锁
二、List(列表)
✅ 定义
一个有序的字符串列表,可以从两端插入或弹出元素。
底层是 双端链表 或 压缩列表。
⚙️ 内部编码结构
| 编码方式 | 说明 |
|---|---|
ziplist | 小型列表(元素少且短) |
linkedlist | 元素多或长 |
quicklist | Redis 3.2+ 默认结构(ziplist + 链表) |
💡 特性
- 有序,可重复
- 支持队列、栈操作
- 插入删除高效
🔧 常用命令
LPUSH key value1 value2 # 从左插入
RPUSH key value1 value2 # 从右插入
LPOP key # 从左弹出
RPOP key # 从右弹出
LRANGE key start stop # 获取区间元素
LLEN key # 获取长度
LINDEX key index # 按索引获取
LREM key count value # 删除指定元素
BRPOP key timeout # 阻塞弹出
🧠 应用场景
- 消息队列(FIFO/LIFO)
- 时间序列(日志、任务流水)
- 待办任务列表
⚠️ 使用注意
- 不支持随机访问
- 队列过长会阻塞主线程
- 阻塞命令(BRPOP)应设置超时防止卡死
三、Hash(哈希)
✅ 定义
键值对(field-value)集合,类似于对象(object/map)。
⚙️ 内部编码结构
| 编码方式 | 说明 |
|---|---|
ziplist | 小型哈希表 |
hashtable | 普通哈希表 |
💡 特性
- 支持多个字段的存取
- 单字段修改高效
- 结构紧凑,节省内存
🔧 常用命令
HSET key field value # 设置字段
HGET key field # 获取字段
HMSET key f1 v1 f2 v2 # 批量设置
HMGET key f1 f2 # 批量获取
HGETALL key # 获取所有字段
HDEL key field1 field2 # 删除字段
HINCRBY key field increment # 字段值自增
🧠 应用场景
- 存储对象型数据(如用户信息)
- 缓存配置项或元数据
- 属性字典结构(如商品参数)
⚠️ 使用注意
HGETALL会阻塞大对象- field 过多会导致 ziplist 转 hashtable,内存上升
- 不适合嵌套复杂对象
四、Set(集合)
✅ 定义
无序且唯一的字符串集合。
⚙️ 内部编码结构
| 编码方式 | 说明 |
|---|---|
intset | 元素全为整数时 |
hashtable | 元素包含字符串时 |
💡 特性
- 自动去重
- 支持集合运算(交、并、差)
- 查询、添加、删除操作 O(1)
🔧 常用命令
SADD key member1 member2 # 添加元素
SREM key member # 删除元素
SMEMBERS key # 获取所有成员
SISMEMBER key member # 判断是否存在
SCARD key # 获取数量
SUNION key1 key2 # 并集
SINTER key1 key2 # 交集
SDIFF key1 key2 # 差集
🧠 应用场景
- 用户标签(去重)
- 抽奖系统(随机取)
- 社交关系(共同好友)
- 黑名单、已处理ID集合
⚠️ 使用注意
- 无序,不支持索引访问
- 大规模集合运算建议异步执行
五、ZSet(有序集合)
✅ 定义
带有 分数(score) 的集合,按 score 自动排序。
成员唯一,score 可重复。
⚙️ 内部编码结构
| 编码方式 | 说明 |
|---|---|
ziplist | 元素少时使用 |
skiplist + dict | 跳表结构(元素多时) |
💡 特性
- 自动排序
- 可按分数或排名查询
- 支持范围操作
🔧 常用命令
ZADD key score1 member1 score2 member2 # 添加元素
ZRANGE key start stop [WITHSCORES] # 升序范围
ZREVRANGE key start stop [WITHSCORES] # 降序范围
ZRANK key member # 获取排名
ZSCORE key member # 获取分数
ZINCRBY key increment member # 分数自增
ZCOUNT key min max # 统计区间数量
ZREMRANGEBYSCORE key min max # 删除分数区间
🧠 应用场景
- 排行榜(score=积分)
- 定时任务(score=时间戳)
- 热门内容排序(score=权重)
- 优先队列(score=优先级)
⚠️ 使用注意
- score 必须为浮点数
- 修改 score 会触发重新排序
- 大规模排序应异步或分页执行
📊 对比总结表
| 类型 | 是否有序 | 是否可重复 | 内部结构 | 常见用途 |
|---|---|---|---|---|
| String | 否 | 是 | int / embstr / raw | 缓存、计数、分布式锁 |
| List | 有序 | 可重复 | quicklist | 消息队列、日志流 |
| Hash | 否 | field 唯一 | ziplist / hashtable | 对象缓存 |
| Set | 否 | 否 | intset / hashtable | 去重、关系运算 |
| ZSet | 有序 | 否(按member) | skiplist / dict | 排行榜、优先队列 |
🧩 使用建议
- 对于频繁变化的对象,Hash 比多个 String 更省内存
- 排序、权重类相关的场景,推荐使用 ZSet
- 队列场景优先 List,但高并发推荐 Stream(Redis 5+)
- 避免大 key(>10MB)
- 为缓存数据设置 expire,防止内存泄漏
- 集合类操作注意 阻塞和性能问题

被折叠的 条评论
为什么被折叠?



