本文是Redis成本优化系列文章的第2篇,这篇篇幅较少,但是是Redis内存优化的重要里程碑。
版本 | 2.8.24 | 3.0.7 | 3.2.13 | 4.0.14 | 5.0.14 | 6.0.20 | 6.2.15 | 7.0.12 |
---|---|---|---|---|---|---|---|---|
容量MB | 995.83 | 995.83 | 776.72 | 461.61 | 461.61 | 461.61 | 461.61 | 461.29 |
版本 | 2.8.24 | 3.0.7 | 3.2.13 | 4.0.14 | 5.0.14 | 6.0.20 | 6.2.15 | 7.0.12 |
---|---|---|---|---|---|---|---|---|
容量MB | 1511.01 | 1511.14 | 1286.70 | 1134.15 | 1140.26 | 1134.20 | 1134.19 | 1133.81 |
初步结论:
3.2.13相比于3.0.7:
4.0.14相比于3.2.13,
zset类型(hashtable + skiplist实现):Redis使用容量又优化了13.4%
相关releaseNotes如下:所有复杂类型(例如hash、list、set、zset)中的元素不再使用robj改为使用sds
all the aggregated data types no longer use Redis Objects structures but directly SDS objects
改动示意图如下:
每个robj占用数据量: 4bit + 4bit + 24bit + 4字节 + 8字节 = 16字节
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
int refcount;
void *ptr;
} robj;
Redis可能没有打算在复杂数据结构的每个元素做一些功能,考虑到内存占用,所以在Redis 4做了上述优化,从实际看基本能满足大部分场景的需求,同时确实带来了很大的成本优化。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞3
添加新评论0 条评论