在这里插入图片描述


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.pswp.cn/pingmian/91431.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91431.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91431.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ansible.cfg 配置文件的常见配置项及其说明

配置项说明默认值defaults默认配置部分inventory指定清单文件的位置&#xff0c;可以是文件路径、目录或动态清单脚本。/etc/ansible/hostsremote_user默认的远程用户roothost_key_checking是否启用主机密钥检查。设置为 False 跳过 SSH 主机密钥验证。Trueask_pass是否在执行时…

Effective C++ 条款15:在资源管理类中提供对原始资源的访问

Effective C 条款15&#xff1a;在资源管理类中提供对原始资源的访问核心思想&#xff1a;RAII类需要提供访问其封装原始资源的显式或隐式接口&#xff0c;以兼容需要直接操作资源的API&#xff0c;同时维持资源的安全管理。 ⚠️ 1. 原始资源访问的必要性 使用场景示例&#x…

Linux 进程管理与计划任务设置

Linux 进程管理与计划任务设置一、进程管理进程管理用于监控、控制系统中运行的程序&#xff08;进程&#xff09;&#xff0c;包括查看进程状态、调整优先级、终止异常进程等。以下是核心命令及操作说明&#xff1a;1. 常用进程查看命令&#xff08;1&#xff09;ps&#xff1…

MYSQL数据库之索引

1、引入索引的问题在图书馆查找一本书的过程&#xff0c;可类比数据库查询场景。在一般软件系统中&#xff0c;对数据库操作以查询为主&#xff0c;数据量较大时&#xff0c;优化查询是关键&#xff0c;索引便是优化查询的重要手段 。2、索引是什么索引是一种特殊文件&#xff…

ArcGIS以及ArcGIS Pro如何去除在线地图制作者名单

问题&#xff1a;ArcGIS和ArcGIS Pro提供了许多在线地图服务&#xff0c;但是这些地图会自动生成制作者名单&#xff0c;如下图所示&#xff1a; 在线地图加载方式可参考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在线底图 这在出图时有时会造成图的部分信息遮挡或出图不美观…

InfluxDB 与 Golang 框架集成:Gin 实战指南(二)

四、实际应用案例4.1 案例背景某智能工厂部署了大量的物联网设备&#xff0c;如传感器、智能仪表等&#xff0c;用于实时监测生产线上设备的运行状态、环境参数&#xff08;如温度、湿度&#xff09;以及生产过程中的各项指标&#xff08;如产量、次品率&#xff09;。这些设备…

Linux系统磁盘未分配的空间释放并分配给 / 根目录的详细操作【openEuler系统】

选择 Fix 修正 GPT 表 输入 Fix 并按回车&#xff0c;parted 会自动&#xff1a; 扩展 GPT 表的 结束位置 到磁盘末尾。释放未被使用的空间&#xff08;1048576000 个 512B 块&#xff0c;约 500GB&#xff09;。 验证修正结果 修正后&#xff0c;再次运行&#xff1a; parted …

王道考研-数据结构-01

数据结构-01视频链接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 数据结构到底在学什么? 数据结构这门课他要学习的就是怎么用程序代码把现实世界的问题给信息化&…

k8s云原生rook-ceph pvc快照与恢复(上)

#作者&#xff1a;Unstopabler 文章目录前言部署rook-ceph on kubernets条件Ceph快照概述什么是PVC安装快照控制器和CRD1.安装crds资源2.安装控制器3.安装快照类前言 Rook 是一个开源的云原生存储编排器&#xff0c;为各种存储解决方案提供平台、框架和支持&#xff0c;以便与…

springcloud04——网关gateway、熔断器 sentinel

目录 注册中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 远程服务调用 httpClient | RestTemplate | OpenFeign 负载均衡服务 ribbon | loadbalancer 网关 zuul | gateway 熔断器 hystrix | sentinel 网关 sentinel 流控 压测工具 1…

XSS跨站脚本攻击详解

一、XSS攻击简介跨站脚本攻击的英文全称是Cross-Site Scripting&#xff0c;为了与CSS有所区别&#xff0c;因此缩写为“XSS”由于同源策略的存在&#xff0c;攻击者或者恶意网站的JavaScript代码没有办法直接获取用户在其它网站的信息&#xff0c;但是如果攻击者有办法把恶意的…

Linux /proc/目录详解

文章目录前言文件说明注意事项前言 在 Linux 系统中&#xff0c;/proc 目录是一个特殊的虚拟文件系统&#xff0c;它提供了对系统内核和进程的访问。/proc 目录中的文件和目录不是真实存在的&#xff0c;它们是在运行时由内核动态生成的&#xff0c;用于提供系统和进程的相关信…

北斗变形监测在地质灾害监测中的应用

内容概要 北斗形变监测系统在地质灾害监测领域发挥着核心作用&#xff0c;该系统基于北斗卫星导航技术&#xff0c;实现对地表变形的精确追踪。通过毫米级精度定位能力&#xff0c;北斗形变监测技术为滑坡等灾害提供关键数据支撑&#xff0c;尤其在偏远地区应用中&#xff0c;单…

2025新征程杯全国54校园足球锦标赛在北京世园公园隆重开幕

2025年8月1日&#xff0c;备受瞩目的2025新征程杯全国54校园足球锦标赛&#xff08;北京&#xff09;在北京世园公园盛大拉开帷幕。开幕式上&#xff0c;中国关心下一代健康体育基金会副秘书长、中国青少年研究会理事、全国 54 校园足球人才培养计划创始人何占强主任表示&#…

分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测

分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测 目录分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测分类效果基本介绍程序设计分类效果 基本介绍 1.Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测&#xff0c;运…

机器学习——逻辑回归(LogisticRegression)的核心参数:以约会数据集为例

理解 LogisticRegression 的核心参数&#xff1a;以约会数据集为例 逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习中一种基础且重要的分类算法&#xff0c;特别适用于解决二分类和多分类问题。本文将基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:优化 Kafka Sink 事务处理,减轻 Broker 负载

一、 背景与核心问题&#xff1a;Kafka Sink 事务的痛点 Flink Kafka Sink 在 Exactly-Once 模式下依赖 Kafka 事务来确保数据写入的原子性&#xff0c;并与 Flink 检查点对齐。然而&#xff0c;非优雅关闭&#xff08;如任务失败、非 stop-with-savepoint 的停止&#xff09;会…

设计模式:组合模式 Composite

目录前言问题解决方案结构代码前言 组合是一种结构型设计模式&#xff0c;你可以使用它将对象组合成树状结构&#xff0c;并且能像使用独立对象一样使用它们。 问题 如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如&#xff0c; 你有两…

嵌入式 C 语言入门:函数封装与参数传递学习笔记 —— 从定义到内存机制

前言 大家好&#xff0c;这里是 Hello_Embed。在前一篇笔记中&#xff0c;我们用循环实现了 LED 闪烁&#xff0c;其中重复使用了两段几乎一样的延时代码&#xff1a; for(i 0; i < 100000000; i); // 延时这种重复不仅让代码冗余&#xff0c;还不利于后续修改&#xff08…

第一个大语言模型的微调

模型推理 现在,我们的模型应该能够针对输入的任何短句生成类似尤达大师风格的句子作为回应。 该模型要求其输入格式规范。我们需要构建一个 “消息” 列表 —— 在这个案例中,就是来自用户的消息 —— 并通过提示表明轮到模型进行输出,以促使其做出回答。 add_generation…