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