Redis 使用对象来表示数据库中的键和值,每次 Redis 创建一个键值对时,至少会创建两个对象,一个键对象,一个值对象
Redis 每个对象都由一个 redisObject 结构表示:

类型
对象的 type 属性记录了对象的类型

对 Redis 数据库保存的键值来说,键总是一个字符串对象,而值可以是字符串、列表、哈希、集合或者有序集合
当对一个数据库键执行 TYPE 命令时,命令返回的结果为数据库键对应的值对象的类型

编码和底层实现
对象的 ptr 指针指向对象的底层实现数据结构,而这些数据结构由对象的 encoding 属性决定
encoding 属性记录了对象所使用的编码,即该对象的底层数据结构实现

每种类型的对象都至少使用了两种不同的编码

使用 OBJECT ENCODING 命令可以查看一个数据库键的值对象的编码

通过 encoding 属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定编码,极大地提升了 Redis 的灵活性和效率。这样 Redis 可以根据不同的场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率
例如,在列表对象包含的元素较少时,Redis 使用压缩列表作为列表的底层实现:
- 因为压缩列表比双端链表更节约内存,并且在元素数量较少时,在内存中以连续块方式保存的压缩列表比起双端链表可以更快被载入到缓存中
- 随着元素增多,使用压缩列表保存元素的优势消失时,对象就会将底层实现转向功能更强、也更适合保存大量元素的双端链表上面
网友评论