八股文疑问, redis sds buffer 最大长度在 512M 限制?

2022-04-14 21:59:34 +08:00
 fgd

大家好,之前看网上 redis 相关文档,有提到 sds 最大长度 512M 限制,给出理由是因为 len 的类型是 int ,最长 32 位,最大长度 2**29-1 。

最近查看 redis 源码,6.2.6 版本,sdshdr64 ,最长 2**61-1 , 是否意味着 sds 可以存将近 2E 字节长度的字符串。。。

uint64_t len; /* used */

uint64_t alloc; /* excluding the header and null terminator */

2636 次点击
所在节点    Redis
6 条回复
afewok
2022-04-15 00:56:45 +08:00
试下不就知道了
fgd
2022-04-15 01:00:49 +08:00
@afewok #1 你说的对!等我有空试完来更新。
1070794219
2022-04-16 15:44:31 +08:00
很多人都在讨论这个问题,最后发现大家分析的有点远了,我个人认为这就是 redis 作者简单加的限定,应该是为了防止大 key 。你读的源码是 sds 部分, 当客户端操作 client 时,一般不会直接使用 sds ,而是通过对象的方式来使用。比如创建的字符串其实是一个对象,间接使用到了 sds 结构。限制 512M 的逻辑在 t_string.c 的 checkStringLength 方法。 所以我理解 sds 底层支持的限制很大,只是在对外层暴露的时候,加了个 512 的限制。另外从 checkStringLength 可以看到,在主从复制阶段,主服务器会创建一个客户端用于与从服务器通信,这个场景就没有 512 限制。
1070794219
2022-04-16 15:47:14 +08:00
@1070794219 checkStringLength 用到了一个配置项 proto_max_bulk_len , 默认就是 512M:
createLongLongConfig("proto-max-bulk-len", 省略一些配置信息, 512ll*1024*1024, xxxx)
Mitt
2022-04-16 18:03:48 +08:00
fgd
2022-04-16 23:36:34 +08:00
@1070794219 #3
@Mitt #5

谢谢,顺便做了个测试。此贴终结!

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

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

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

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

© 2021 V2EX