网上很多文章都是讲 embstr 编码的性能优势,比如连续内存空间,raw 编码会分别创建 RedisObject 和 sds 结构,但还是疑惑 embstr 为什么有长度限制只能专用于存储短字符串呢?
如果要存一个很长的字符串,用 embstr ,也创建一块连续内容空间不就好了。
请大佬讲解,谢谢!
1
CRVV 2022-07-07 03:09:22 +08:00 1
因为 Redis 在调用 malloc 创建 RedisObject 的时候最大只申请 64 bytes 的内存,把什么 header 之类的去掉就是 embstr 的最大长度。
至于为什么只申请 64 bytes 的内存,我不知道是什么原因。随便瞎猜一下的话,可能是因为 cache line 是 64 bytes 的。也可能是一个为了优化内存使用的一个权衡,申请一大堆各种不同大小的内存显然会增加 fragmentation ,刚好限制在了 64 bytes 。 |
2
LeegoYih 2022-07-07 10:40:00 +08:00 1
作者本人没说过原因,个人猜想:因为 embstr 是不可变的,对 embstr 进行修改,会先将其转化为 raw ,这个过程又会申请内存,粗略计算可能需要双倍空间,而且原字符串越大越浪费。
看过 Redis 代码,其实可以发现有很多地方都有优化的空间,但是 Redis 作者 antirez 认为没必要,Redis 的瓶颈是 IO ,代码要优雅、易于实现、易于调试。 |
3
Mogamigawa 2022-07-07 19:24:09 +08:00 via iPhone
申请空间和释放空间次数少
|
4
erquiasz0825 OP 是不是可以这样理解:
其实短字符长度的限制,并不是必然 44 bytes ,网上有 44 bytes 的来历,其实是可以更多,比如 100 bytes 才用 raw ,但怎么定这个长度是合理的呢?假设超过 1M 的字符串采用 raw ,那么大部分情况下不需要一次申请这么多内存,就会造成更大的浪费。 |