Redis对象特性

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

redis类型检查与命令多态

redis操作的命令分为两种类型

一种命令可以对任何类型的键执行,比如del、expire、rename、type、object等等,

一种是对特定类型的键执行,比如set、hset、rpush、sdd这些只针对特定数据类型的操作

类型特定命令是通过redisObject结构的type属性来实现的:

在执行命令之前,服务器会先检查输入数据库键的值对象是否为执行命令所需的类型,如果是,服务器就对键执行指定的命令;如果不是,服务器将拒绝执行命令,并向客户端返回一个类型错误。

多态命令的实现

redis根据值对象的类型来判断键是否能执行指定命令,还会根据值对象的编码方式,选择正确的命令实现代码来执行命令,这就是多态命令的具体表现。

引用计数内存回收

c语言不具备自动内存回收的功能,redis构建了一个引用计数技术来实现内存回收机制,程序通过跟踪对象的引用计数信息,在适当的时候自动释放对象进行内存回收。

对象引用计数信息随对象使用状态不断变化:

创建新对象,引用计数的值会被初始化为1,当对象被一个新程序使用时,它的引用计数值会被增1,当对象不被使用时,引用计数减1,当对象引用计数值变为0时,对象所占用的内存会被释放。

对象的生命周期分为创建对象,操作对象,释放对象

对象共享

redis在初始化服务器时,创建一万个字符串对象,这些对象包含0到9999的所有整数值,当服务器需要用到值为0到9999的字符串对象时,服务器就会使用这些共享对象。

redis如果多个键的值相同,那么可以让这多个键共享同一个值对象将:先将数据库键的值指针指向现有的值对象,将被共享的值对象的引用计数增1。这样保存相同的值越多,越节省内存。

redis只对包含整数值的字符串对象进行共享,对其他对象的验证操作的复杂度高,消耗cpu

空转时长

redisObject结构中有个属性为lru属性,该属性记录了对象最后一次被命令程序访问的时间,Object IDLETIME命令可以打印出给定键的空转时长,空转时长就是当前时间减去键的值对象的lru时间,执行Object IDLETIME命令不会修改值对象的lru属性

空转时长可以在当服务器占用的内存超过maxmemory选项设置的上限值时,空转时长较高的那部分键会优先被服务器释放,从而回收内存。