redis原理篇(五种数据结构)

String

  • 基本编码方式是RAW,基于简单动态字符串实现,存储上限为512Mb
  • 如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间,申请内存时只需要调用一次内存分配函数,效率更高
  • 如果存储的字符串是整数值,并且大小在long_max范围内,则会采用int编码,直接将数据保存在redisobject的ptr指针位置(刚好8字节),不再需要SDS了

list

  • linkedlist
  • ziplist
  • quicklist

redis3.2版本之后,redis统一采用quicklist来实现list

set

set是redis中的集合,不一定确保元素有序,可以满足元素唯一、查询效率要求较高。

  • 为了满足查询效率和唯一性,采用HT编码(Dict),Dict中的key用来存储元素,value统一为null。
  • 当存储的所有数据都是整数,并且元素数量不超过set-max-intset-entries时,set会采用intset编码,以节省内存。

zset

  • 可以根据score值排序后
  • member必须唯一
  • 可以根据member查询分数

当元素数量不多时,HT和SkipList优势不明显,而且更耗内存,因此zset还会采用ziplist结构来节省内存,不过需要同时满足两个条件:

  • 元素数量小于zset-max-ziplist-entries,默认为128
  • 每个元素都小于zset-max-ziplist-value字节,默认值为64

ziplist本身没有排序功能,而且没有键值对的概念,因此需要有zset通过编码实现

  • ziplist是连续内存,因此score和ele是紧挨在一起的两个entry,ele在前,score在后
  • score越小越接近队尾,score越大越接近队尾,按照score值升序排列

hash

hash底层采用的编码与zset也基本一致,只需要把排序有关的skiplist去掉即可

  • hash结构默认采用ziplist编码,用以节省内存,ziplist中相邻的两个entry分别保存field和value
  • 当数据量较大时,hash结构会转为HT编码,也就是dict,触发条件有两个:
    • ziplist中的元素数量超过了hash-max-ziplist-entries(默认512)
    • ziplist中的任意entry大小超过了hash-max-ziplist-value(默认64字节)
相关推荐
哈__7 分钟前
面向AI智能体的数据库专业技能包:将DBA工程经验封装为可调用能力
数据库·人工智能·dba
阿坤带你走近大数据9 分钟前
SQL里where后面的1=1是干嘛的,走的是什么索引
数据库·sql
阿坤带你走近大数据10 分钟前
SQL的执行顺序和书写顺序的介绍
数据库·sql·oracle
Poo_Chai1 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
这个DBA有点耶1 小时前
从DBA到数据架构师(五):数据架构演进中的技术债务管理
数据库·程序人生·云原生·架构·dba·数据库管理员
天疆说2 小时前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
Bruce_Liuxiaowei2 小时前
基于微步在线威胁情报的公网 IP 攻击迹象监测:threatbook_query 脚本全解析与 BruceSec 平台整合实践
数据库·tcp/ip·安全·网络安全·智能体
码农颜2 小时前
5.6.2 ⾏级锁死锁
数据库·sql·oracle
嘟嘟07173 小时前
Next.js 博客左侧笔记列表是怎么从 Redis 渲染出来的?从组件、children 到动态路由一次讲清
redis·react.js·前端工程化
wuyk5553 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表