为什么Redis的embstr编码比raw string编码更高效?
为什么Redis的embstr编码比raw string编码更高效?
Redis的embstr编码相比raw string编码更高效,核心源于内存布局和操作流程的优化,具体可以从这几个维度拆解:
内存操作次数更少
raw编码会为Redis的对象结构体(redisObject)和字符串内容分别分配两块独立内存,释放时也需要执行两次释放操作;而embstr编码是一次性申请一块连续内存,同时容纳redisObject和字符串内容,分配与释放各只需一次操作,大幅减少了内存分配器的调用开销。缓存局部性更优
由于embstr的redisObject和字符串数据存储在连续内存中,CPU访问时能将这两部分数据一次性加载到缓存行里,大幅降低缓存 miss 的概率,提升数据访问速度;而raw编码的两块内存是分散的,大概率会被加载到不同缓存行,缓存利用率更低。内存开销更节省
内存分配器管理内存块时,每个块都会附带少量元数据(如块大小、空闲标记等)。raw编码的两块内存对应两份元数据,embstr则只用一份,额外占用的内存更少;同时连续内存也减少了内存碎片的产生,提升了内存整体利用率。
补充:embstr仅适用于长度≤44字节的字符串,这是因为Redis的
redisObject结构体加上字符串头部信息,再加上44字节内容,刚好能被分配在一块64字节的内存块中(Redis默认使用的jemalloc等内存分配器会按固定大小块分配内存,64字节是常用的小内存块规格)。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

