V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fgd
V2EX  ›  Redis

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

  •  
  •   fgd ·
    fgd-haha · 2022-04-14 21:59:34 +08:00 · 2829 次点击
    这是一个创建于 939 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,之前看网上 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 条回复    2022-04-16 23:36:34 +08:00
    afewok
        1
    afewok  
       2022-04-15 00:56:45 +08:00
    试下不就知道了
    fgd
        2
    fgd  
    OP
       2022-04-15 01:00:49 +08:00
    @afewok #1 你说的对!等我有空试完来更新。
    1070794219
        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 限制。
    1070794219
        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)
    Mitt
        5
    Mitt  
       2022-04-16 18:03:48 +08:00   ❤️ 1
    fgd
        6
    fgd  
    OP
       2022-04-16 23:36:34 +08:00
    @1070794219 #3
    @Mitt #5

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

    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2602 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:39 · PVG 09:39 · LAX 17:39 · JFK 20:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.