学习分享(第 2 期):从源码层面看 Redis 节省内存的设计
这里记录的是学习分享的内容,文章维护在 Github:studeyang/leanrning-share。
回顾
在文章《Redis 的 String 类型,原来这么占内存》中,我们学习了 SDS 的底层结构,发现 SDS 存储了很多的元数据,再加上全局哈希表的实现,使得 Redis String 类型在内存占用方面并不理想。
然后在文章《学习分享(第1期)之Redis:巧用Hash类型节省内存》中,我们学习了另一种节省内存的方案,使用 ziplist 结构的 Hash 类型,内存占用减少了一半,效果显著。
虽然我们在使用 String 类型后,占用了较多内存,但其实 Redis 是对 SDS 做了节省内存设计的。除此之外,Redis 在其他方面也都考虑了内存开销,今天我们就从源码层面来看看都做了哪些节省内存的设计。
文中代码版本为 6.2.4。
一、redisObject 的位域定义法
我们知道,redisObject 是底层数据结构如 SDS, ziplist 的封装,因此,redisObject 如果能做优化,最终也能带来节省内存的用户体验。在源码 server.h
中定义了 redisObject 的结构体,如下面代码所示:
1 |
|
type, encoding, lru, refcount 都是 redisObject 的元数据,redisObject 的结构如下图所示。