Redis设实 - 08 对象 下

《Redis设计与实现 黄建宏 著》第8章
该书基于Redis2.9,即Redis3.0开发版编写

Redis命令可分两种

一种命令可对任何类型键执行,例DEL、EXPIRE、RENAME、TYPE、OBJECT
另一种命令只对特定类型键执行
类型检查
通过redisObject.type属性实现,若命令与type要求不一致,则返回错误
命令多态
通过redisObject.encoding实现,以选择正确的命令实现代码(方法)执行命令
例:
Redis设实 - 08 对象 下
Redis设实 - 08 对象 下

内存回收

Redis通过引用计数(reference counting)实现内存回收机制
引用计数信息由redisObject.refcount属性记录
typedef struct redisObject{
// ...
// 引用计数
int refcount;
// ...
}robj;

·创建新对象时,引用计数值被初始化为1
·对象被一个新程序使用时,引用计数值+1
·对象不再被一个程序使用时,引用计数值-1
·引用计数值为0,对象所占用内存被释放

修改引用计数API:
Redis设实 - 08 对象 下
Redis设实 - 08 对象 下

对象共享

引用计数属性还带有对象共享作用
多个键共享同一个值对象需执行2个步骤:
1) 将数据库键的值指针指向一个现有值对象
2) 被共享的值对象引用计数+1
注,Redis初始化服务器时,会创建包含从0到9999的整数值的一万个SDS,服务器需使用这些字符串对象时,会使用这些共享对象,而非新创建对象

对象空转时长

对象最后一次被命令程序访问时间由redisObject.lru属性记录
typedef struct redisObject{
// ...
// 最后一次被命令程序访问时间
unsigned lru:22;
}robj;
lru属性作用:
1) 被OBJECT IDLETIME命令使用打印给定键的空转时长(当前时间-lru时间),但该命令不会修改lru属性
2) 若服务器打开maxmemory选项,且服务器回收内存算法为volatile-lru或allkeys-lru,则当服务器占用内存超过maxmemory选项设置的上限值时,空转时长较高的键会优先被服务器释放回收内存