Redis 五大数据类型

Redis 五大数据类型底层结构对比表

类型 底层数据结构(Redis ≥ 5/6/7) 优点 缺点 & 注意点 适用场景
String 简单动态字符串(SDS) 快速、灵活(自动扩容、二进制安全) 最大限制 512MB 缓存简单对象、计数器(INCR对整数自增)、分布式锁(SETNX)、限流令牌等
List

quicklist(linkedlist + ziplist)

ZipList
⚠️ Redis 7 中 ziplist 被 listpack 替代

插入删除快、结构紧凑
支持分页操作
插入太多可能导致大链表、影响 GC 消息队列、任务列表、最新消息显示(如微博Timeline最近N条存List),还可用 lrange 做分页
Set intset(小量整数)
➡️ hashtable(大集合或字符串)
无序去重、添加/删除 O(1) 元素太大、需考虑哈希冲突 标签集合、联合好友列表、共同好友(交集)计算、抽奖随机抽取(SRANDMEMBER)等
ZSet

✅ skiplist + dict

ZipList

有序结构、范围查询快、支持排名 插入删除比 set 慢,跳表占用略大 排行榜(score为分数或时间,实现按分排序及排名)、延迟队列(score为时间戳,定时取出<=当前时间的任务)。常用操作有按照分值范围或排名范围取元素(ZRANGE by score或排名)
Hash ziplist(小结构)
➡️ hashtable(大字段)
→ Redis 7 使用 listpack 替代 ziplist
节省内存、键值访问快 字段太多仍可能较大,适合结构平坦的数据 用户信息、商品信息
Bitmap        实际上是字符串的一种,但按bit操作,可以高效地存储海量布尔值 用户签到(一位表示某天是否签到)、在线状态位、布隆过滤器底层
HyperLogLog 用于基数统计的概率数据结构,特点是占用固定小内存却能近似估计独立元素数量 UV统计(网站独立访客数),只需很小内存容忍误差。
Stream(流) Redis 5.0引入的数据类型,类似日志存储 消息队列系统,实现可靠消息和消费确认

Redis 版本中结构的演进(关键知识点)

Redis版本 替换内容 说明
Redis 3.2 List 从 ziplist → quicklist 改善 list 插入性能
Redis 7 ziplist 正式被废弃 用 listpack 替代,体积更小、安全性高
Redis 6+ 支持模块定义自己的数据结构 如 RedisTimeSeries、RedisBloom 等

quicklist vs ziplist vs listpack 对比

特性 ziplist quicklist listpack(Redis 7)
内存结构 连续内存 链表 + ziplist(压缩块) 更小的压缩格式(优化内存布局)
插入删除性能 差(需内存拷贝) 好(链表节点局部更新) 中等
安全性 存在过边界 bug 安全(节点单独处理) 安全
使用场景 已废弃 Redis list 默认实现 Hash / ZSet / List 的底层结构之一

实战建议总结:

类型 实战建议
String 值尽量不超过几 KB,避免大 key 问题
List 消息队列用 LPUSH + BRPOP,分页用 LRANGE,注意链表过长
Set 用于去重、抽奖、推荐系统;使用前确认数据量和类型是否合适
ZSet 排行榜、限时处理任务;可通过 ZREMRANGEBYRANK 清理老数据
Hash

适合存结构化对象,但字段数量不要太大(上千个字段建议分表)

 

你可能感兴趣的:(面试知识集合,Redis,缓存,redis,数据库,缓存)