Redis 字符串编码 embstr 有性能优势,为什么要有长度限制呢?

2022-07-07 00:57:12 +08:00
 erquiasz0825

网上很多文章都是讲 embstr 编码的性能优势,比如连续内存空间,raw 编码会分别创建 RedisObject 和 sds 结构,但还是疑惑 embstr 为什么有长度限制只能专用于存储短字符串呢?

如果要存一个很长的字符串,用 embstr ,也创建一块连续内容空间不就好了。

请大佬讲解,谢谢!

2065 次点击
所在节点    Redis
4 条回复
CRVV
2022-07-07 03:09:22 +08:00
因为 Redis 在调用 malloc 创建 RedisObject 的时候最大只申请 64 bytes 的内存,把什么 header 之类的去掉就是 embstr 的最大长度。
至于为什么只申请 64 bytes 的内存,我不知道是什么原因。随便瞎猜一下的话,可能是因为 cache line 是 64 bytes 的。也可能是一个为了优化内存使用的一个权衡,申请一大堆各种不同大小的内存显然会增加 fragmentation ,刚好限制在了 64 bytes 。
LeegoYih
2022-07-07 10:40:00 +08:00
作者本人没说过原因,个人猜想:因为 embstr 是不可变的,对 embstr 进行修改,会先将其转化为 raw ,这个过程又会申请内存,粗略计算可能需要双倍空间,而且原字符串越大越浪费。

看过 Redis 代码,其实可以发现有很多地方都有优化的空间,但是 Redis 作者 antirez 认为没必要,Redis 的瓶颈是 IO ,代码要优雅、易于实现、易于调试。
Mogamigawa
2022-07-07 19:24:09 +08:00
申请空间和释放空间次数少
erquiasz0825
2022-07-09 18:40:42 +08:00
是不是可以这样理解:

其实短字符长度的限制,并不是必然 44 bytes ,网上有 44 bytes 的来历,其实是可以更多,比如 100 bytes 才用 raw ,但怎么定这个长度是合理的呢?假设超过 1M 的字符串采用 raw ,那么大部分情况下不需要一次申请这么多内存,就会造成更大的浪费。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/864567

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX