Redis 的 redisObject 存储结构

摘要:redis 的 redisObject 存储结构,redis 会把我们的 value 都用一个 redisObject 对象存储。

redisObject 对象

redis 会把我们的 value 都用一个 redisObject 对象存储,存储结构体如下:

redisObject
type:4 ---------------------- 数据类型
encoding:4 ------------------ 内部编码类型
lru:REDIS_LRU_BITS ---------- key 的最后一次访问时间
int refcount; --------------- 当前对象的引用计数器
void *ptr ------------------- 数据指针


type 字段

type 字段表示当前对象使用的数据类型,比如 string、hash、list、set、zset。可以使用 type key 命令来查看每个 key 存储的什么类型的数据,比如下面这个 key 使用的就是 string 数据结构存储。

127.0.0.1:6379> set k1 redis
OK
127.0.0.1:6379> type k1
string


encoding 字段

type 字段表示当前 value 存储的数据类型,但是每种数据类型都有自己底层的内部编码实现,所谓编码就是具体使用哪种底层数据结构来实现,编码不同将直接影响数据的内存占用和读写效率。我们可以使用 object encoding key 来查看当前数据是用什么编码存储的。

127.0.0.1:6379> object encoding key
"raw"


lru 字段

记录对象最后一次被访问的时间,当配置了 maxmemory 和 maxmemory-policy=volatile-lru 或者 allkeys-lru 时,用于辅助 lru 算法的内存淘汰机制删除键数据。可以使用 object idletime key 命令在不更新 lru 字段情况下查看当前键的最后访问时间。

127.0.0.1:6379> object idletime key
(integer) 75740


refcount 字段

记录当前对象被引用的次数,使用 object refcount key 获取当前对象引用的次数。

127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> object refcount k1
(integer) 2147483647

当 refcount=0 时,reids 会回收当前对象,当 redis 为整数且范围在 [0-9999] 时,redis 可以使用共享对象的方式来节省内存。除了整数值对象,其他类型如 list、hash、set、zset 内部元素也可以使用整数对象池。因此开发中在满足需求的前提下,尽量使用整数对象以节省内存。整数对象池在Redis中通过变量 REDIS_SHARED_INTEGERS 定义,不能通过配置修改。


*ptr 字段

与对象的数据内容相关,如果是整数,直接存储数据,否则表示指向数据的指针。redis 在 3.0 之后对值对象是字符串且长度 <=39 字节的数据,内部编码为 embstr 类型,字符串 sds 和 redisObject 一起分配,从而只要一次内存操作即可。

所以高并发写入场景中,在条件允许的情况下,建议字符串长度控制在 39 字节以内,减少创建 redisObject 内存分配次数,从而提高性能。

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top