redis对象

1. 对象的类型与编码
redis创建一个键值对时,至少创建两个对象,键对象、值对象。
redisObject:
typedef struct redisObject{
     //类型
     unsigned type:4;
     //编码
     unsigned encoding:4;
     //指向底层数据结构的指针
     void *ptr;
     //引用计数
     int refcount;
     //记录最后一次被程序访问的时间
     unsigned lru:22;
}robj
1)type属性:记录对象类型
命令:type key
2)encoding 属性和 *prt指针
对象的prt指针指向对象底层的数据结构,而数据结构由encoding属性决定
命令:object encoding key

 

 

 
2. 内存回收和内存共享
  • 内存回收
redis自己构建了一个内存回收机制,通过redisObject结构的refcount属性实现。
1)创建新对象,refcount初始化1
2)对象被一个新程序使用,refcount+1
3)对象不再被一个程序使用,refcount-1
4)对象应用计数值变为0,对象所占用的内存就会被释放
  配置参数maxmemory-policy :设置为0表示不限制。当内存使用达到最大值时,redis使用的清除策略。有以下几种可以选择:
1)volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰;
2)volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰;
3)volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰;
4)allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰;
5)allkeys-random:从数据集中任意挑选数据 淘汰;
6)no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到maxmemory,在该策略下,直接返回OOM错误);
   通过这种配置,也可以对内存进行回收。
  • 内存共享
refcount属性实现。
共享对象目前只支持整数值的字符串对象。共享对象虽然会降低内存消耗,但是判断两个对象是否相等需要消费额外的时间。对于整数值判断操作之O(1),普通字符串O(n),哈希、列表、集合、有序集合O(n^2)
1)将数据库键的值指针指向一个现有对象
2)将被共享的值对象引用refcount+1
  
3. 对象的空转时长
lru属性记录了对象最后一次被命令程序访问的时间
使用object idletime命令可以打印给定键的空转时长,单位S,当前时间-lru
lru属性还可以配合内存回收配置使用:打开maxmemory选项,并且内存回收算法是volatile-lru或allkeys—lru,那么当Redis内存占用超过maxmemory指定的值时,Redis会优先选择空转时间最长的对象进行释放。
 
4. redis 过期key删除策略
  • 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
  • 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
  • 当前已用内存超过maxmemory限定时,触发主动清理策略
posted @ 2019-11-20 00:05  king_wq_庆  阅读(375)  评论(0编辑  收藏  举报