fgd
V2EX  ›  Redis

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

  •  
  •   fgd ·
    fgd-haha · Apr 14, 2022 · 4296 views
    This topic created in 1665 days ago, the information mentioned may be changed or developed.

    大家好,之前看网上 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 */

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

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

    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5125 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 06:39 · PVG 14:39 · LAX 22:39 · JFK 01:39
    ♥ Do have faith in what you're doing.