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

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

  •  1
     
  •   erquiasz0825 · 2022-07-07 00:57:12 +08:00 · 2192 次点击
    这是一个创建于 870 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    请大佬讲解,谢谢!

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

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

    其实短字符长度的限制,并不是必然 44 bytes ,网上有 44 bytes 的来历,其实是可以更多,比如 100 bytes 才用 raw ,但怎么定这个长度是合理的呢?假设超过 1M 的字符串采用 raw ,那么大部分情况下不需要一次申请这么多内存,就会造成更大的浪费。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2494 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 01:15 · PVG 09:15 · LAX 17:15 · JFK 20:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.