Redis 五种基础数据类型详解与实战应用

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元素多或长
quicklistRedis 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 会触发重新排序
  • 大规模排序应异步或分页执行

📊 对比总结表

类型是否有序是否可重复内部结构常见用途
Stringint / embstr / raw缓存、计数、分布式锁
List有序可重复quicklist消息队列、日志流
Hashfield 唯一ziplist / hashtable对象缓存
Setintset / hashtable去重、关系运算
ZSet有序否(按member)skiplist / dict排行榜、优先队列

🧩 使用建议

  • 对于频繁变化的对象,Hash 比多个 String 更省内存
  • 排序、权重类相关的场景,推荐使用 ZSet
  • 队列场景优先 List,但高并发推荐 Stream(Redis 5+)
  • 避免大 key(>10MB)
  • 为缓存数据设置 expire,防止内存泄漏
  • 集合类操作注意 阻塞和性能问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光芒万丈向远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值