当前位置: 首页 > news >正文

Redis 数据结构全景解析

在这里插入图片描述


Redis 不是简单的 key-value 缓存,它更像一把“瑞士军刀”。
只要掌握数据结构,就能把同一份内存用出 10 倍效率。

0. 开场白:为什么聊数据结构?

面试常问“Redis 有几种数据类型?”——很多人答 5 种(String、List、Hash、Set、ZSet)。
但 Redis 7.0 源码里已出现 9 种编码(encoding),未来还会更多。
理解“类型 vs 编码”是区分菜鸟与专家的第一步。

对外类型(type)内部可能编码(encoding)场景关键字
stringint、embstr、raw、sdshdr5…计数器、缓存
listziplist、quicklist消息队列
hashziplist、hashtable对象缓存
setintset、hashtable去重、抽奖
zsetziplist、skiplist排行榜
streamrax + listpackKafka-lite
bitmap / hyperloglog / geo特殊紧凑编码大数据去重、LBS

下面按使用频率由浅入深展开。


1. String:最被低估的“全能选手”

  • 底层:简单动态字符串(SDS),预分配策略减少 80% 内存重分配。
  • 三大绝技
    1. 缓存:SET / GET 常规操作。
    2. 计数器:INCR、INCRBY 原子自增,秒杀库存必备。
    3. 分布式锁:SET key value NX PX 30000 一条命令解决“SETNX + EXPIRE”非原子问题。
  • 面试题:为什么 512 MB 以下都用 embstr?
    答:embstr 将 redisObject 与 SDS 连续分配,一次 malloc,CPU cache 友好。

2. List:双端队列 & 阻塞队列

  • 编码进化史:ziplist(<=3.2) → quicklist(4.0) → listpack(7.0)。
  • 典型用法
    • 栈:LPUSH + LPOP
    • 队列:RPUSH + LPOP
    • 阻塞队列:BLPOP mylist 0(0 表示永不超时)
  • :ziplist 转 quicklist 的阈值 list-max-ziplist-size -2,负值表示节点字节限制。

3. Hash:小对象之王

  • 阈值:hash-max-ziplist-entries 512 / hash-max-ziplist-value 64。
    小 Hash 用 ziplist,大 Hash 自动转 hashtable,O(1) vs O(N) 差异巨大。
  • 实战
    HSET user:1001 name kim age 18
    HINCRBY user:1001 age 1
    
    单 key 管理对象字段,比多个 String 省内存 30%+。

4. Set:无序去重 + 数学集合

  • 编码:全整数且元素 ≤ set-max-intset-entries 512 → intset,否则 hashtable。
  • 花式用法
    • 抽奖:SRANDMEMBER lucky 1 随机 1 人
    • 交并差:SINTER tag:redis tag:cache 找出共同标签的文章。

5. Sorted Set:排行榜 & 延迟队列

  • 底层:skiplist + dict 双索引,O(logN) 范围查询 + O(1) 成员定位。
  • 排行榜
    ZINCRBY rank:2025 1 player:42
    ZREVRANGE rank:2025 0 9 WITHSCORES
    
  • 延迟队列:score 存执行时间戳,用 ZRANGEBYSCORE 定时轮询即可。

6. Stream:Redis 的 Kafka

  • 组成
    • 消息:XADD mystream * field value
    • 消费组:XGROUP CREATE mystream g1 $
  • 特点
    • 消息持久化,重启不丢。
    • 支持 ACK、PEL(pending list),比 List 做队列更可靠。

7. 三大“特种类型”

类型命令示例用途
BitmapSETBIT uv:20250801 10086 1日活统计(1 bit/用户)
HyperLogLogPFADD ip:20250801 1.1.1.1去重计数,误差 < 0.81%
GeoGEOADD shops 116.397 39.909 “beijing”附近 5 km 门店

8. 内存优化 3 板斧

  1. 编码对齐DEBUG OBJECT key 看 encoding,针对性调阈值。
  2. 压缩:开启 list-compression-depth 2 对中间节点压缩。
  3. 短结构:小数据量用 ziplist/listpack,可把内存压到 1/8。

9. 小结与思维导图

Redis 数据结构 = 对外类型 + 内部编码 + 阈值参数↓用对结构,省内存,提性能
http://www.lryc.cn/news/607429.html

相关文章:

  • 如何管理数据足迹,实现SAP S/4HANA的无缝迁移
  • 记一次Windwos非常离谱的系统错误,IPF错误,程序构建卡顿,程序启动卡顿。。。
  • 从“多、老、旧”到“4i焕新”:品牌官方商城(小程序/官网/APP···)的范式跃迁与增长再想象
  • 振动波形转音频播放并做声纹聚类
  • Eigent:革新复杂任务处理的多智能体协作平台技术解析
  • MybatisPlus如何用wrapper语句灵活连接多查询条件
  • [位运算]2411. 按位或最大的最小子数组长度
  • 安卓开发--RelativeLayout(相对布局)
  • AI在安全方面的十个应用场景
  • 技术栈:基于Java语言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平台
  • 电子合同管理台账功能详解
  • 移除 Excel 文件(.xlsx)的工作表保护
  • EasyExcel 公式计算大全
  • python进程、线程、协程
  • 【LeetCode 热题 100】155. 最小栈
  • 【东枫科技】DreamHAT+
  • 【人工智能-17】机器学习:KNN算法、模型选择和调优、朴素贝叶斯分类
  • kafka快速部署、集成、调优
  • 力扣 hot100 Day62
  • 机器学习sklearn:编码、哑变量、二值化和分段
  • TCP协议的特点和首部格式
  • 同品牌的系列广告要如何保证宣传的连贯性?
  • 广东省省考备考(第六十三天8.1)——判断推理(强化训练)
  • 国产开源大模型崛起:使用Kimi K2/Qwen2/GLM-4.5搭建编程助手
  • Galaxea机器人由星海图人工智能科技有限公司研发的高性能仿人形机器人
  • 大模型结构比较
  • uniapp 开发微信小程序,获取经纬度(uni.getLocation)并且转化详细地址(‌高德地图逆地理编码API、‌腾讯地图逆地理编码)
  • SIP 呼叫中实现远端摄像头控制学习笔记
  • axios请求的取消
  • 什么是链游