Redis小对象压缩

小对象压缩存储

如果Redis内部管理的集合数据结构很小,他会使用紧凑存储形式压缩存储。

Redis的ziplist是一个紧凑的字节数组结构,如下图所示,每个元素之间都是紧挨着的。

如果他存储的是hash结构,那么key和value会作为两个entry相邻存在一起。

如果他存储的是zset,那么value和score会作为两个entry相邻在一起。

Redis的intset是一个紧凑的整数数组结构,他用于存放元素都是整数的并且元素个数较少的set集合。

如果整数可以用uint16表示,那么intset的元素就是16位的数组,如果新加入的整数超过了uint16的表示范围,那么就使用uint32表示,如果新加入的元素超过了uint32,那么就使用了uint64。Redis支持set集合动态从uint16升级到uint32,在升级到uint64。

如果set里存储的是字符串,那么sadd立即升级为hashtable结构。

存储界限

当集合对象的元素不断增加,或者某个value值过大,这种小对象存储也会被升级为标准结构。Redis规定在小对象存储结构的限制条件如下

hash-max-zipmap-entries 512 # hash 的元素个数超过 512 就必须用标准结构存储

hash-max-zipmap-value 64 # hash 的任意元素的 key/value 的长度超过 64 就必须用标准结构存储

list-max-ziplist-entries 512 # list 的元素个数超过 512 就必须用标准结构存储

list-max-ziplist-value 64 # list 的任意元素的长度超过 64 就必须用标准结构存储

zset-max-ziplist-entries 128 # zset 的元素个数超过 128 就必须用标准结构存储

zset-max-ziplist-value 64 # zset 的任意元素的长度超过 64 就必须用标准结构存储

set-max-intset-entries 512 # set的整数元素个数超过512就必须用标准结构存储

Redis内存回收机制

Redis并不总是可以将空闲内存立即返回给操作系统。

如果当前Redis内存有10G,当删除了1GB的key后,再去观察内存,会发现内存变化不会太大,原因是操作系统回收内存是以页为单位,如果这个页上只要有一个key还在使用,那么他就不能被回收。Redis虽然删除了1GB的key,但是这些key分散到了很多页面中,每个页面都还有key存在,这就导致了Redis内存不会立即被回收。

不过,如果执行了flushdb,然后在观察内存会发现内存确实被回收了。原因是所有的key都被删除掉了,大部分之前使用的页面都完全干净了。

Redis虽然无法保证立即回收已经删除的key的内存,但是他会重用那些尚未回收的空闲内存。

内存分配算法

内存分配是一个非常复杂的课题,需要适当的算法划分内存页,需要考虑内存碎片,需要平衡性能和效率。Redis为了保持自身结构的简单,在内存分配这里直接使用了第三方内存分配库,如使用jemalloc(facebook)库来管理内存,也可以切换到tcmalloc(google)。因为jemalloc相比tcmalloc性能稍好,所以Redis默认使用了jemalloc。

相关推荐
ai_coder_ai1 小时前
分布式缓存架构设计与实践
分布式·缓存
凡尘——雨落凡尘1 小时前
PHP 线上十大隐形故障复盘:90% 的网站卡顿、502、雪崩,都是这些细节导致的
redis·nginx·php·session
赤壁小虾2 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
MC皮蛋侠客2 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python
奈斯先生Vector3 小时前
把 Midjourney 二次编辑做成生产系统:customId 能力令牌、Action Graph 与 WebUI 精修工作台
数据库·人工智能·架构·aigc·音视频·midjourney
Lethehong3 小时前
双擎并驱·全链路并行:KFS让TB级异构增量同步秒级到达
数据库
MC皮蛋侠客3 小时前
SQLAlchemy 系列(八):AsyncIO、并发与 Web 生命周期——让每个并发任务持有自己的 Session
数据库·python
一水4 小时前
Redis实战:一个AI工作流系统里的五个应用场景,从传参到限流的完整链路
数据库·redis·wpf
枫叶v.5 小时前
Prompt Injection 防不住怎么办?从 Source-Sink 模型设计 Agent 安全边界
数据库·安全·prompt
Lucky_Turtle5 小时前
【Milvus】向量数据库
数据库