zoukankan      html  css  js  c++  java
  • 深入了解Redis(5)-内存回收

      了解redis内存回收之前,需要先了解过期键删除策略。

    过期键删除策略

    1.定时删除

      在设置键的过期时间的同时,创建一个timer,在定时器在键的过期时间到达时,立即执行对键的删除操作。内存友好型策略,一旦键过期,就会被删除,并释放所占用的内存,Cpu 不友好,当一批数量比较多的键过期时,正好遇上Cpu 紧张的时段,这时候需要的是Cpu处理能力,而不是内存。另外当前 Redis 时间事件(无序链表O(N))无法高效处理大量时间事件,所以定时删除并不是一种好的定时删除策略。

    2.惰性删除

      不管过期的键,在这种策略下,当键在键空间中被取出时,首先检查取出的键是否过期,若过期删除该键,否则,返回该键。很明显,惰性删除依赖过期键的被动访问,对于内存不友好,如果
    一些键长期没有被访问,会造成内存泄露。redis非常依赖内存,所以这也不是一个很好的策略。

    3.定期删除

      每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库, 则由算法决定。

      目前redis采用的是定期删除+惰性删除策略。定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
    于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。但是存在一种情况如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制

    内存淘汰策略

    名称描述
    volatile-lru 已设置过期时间的数据集中挑选最近最少使用的数据淘汰
    volatile-lfu 从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
    volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰
    volatile-random 从已设置过期时间的数据集中挑选任意数据淘汰
    allkeys-lru 当内存不足写入新数据时淘汰最近最少使用的Key
    allkeys-random 当内存不足写入新数据时随机选择key淘汰
    allkeys-lfu 当内存不足写入新数据时移除最不经常使用的Key
    no-eviction 当内存不足写入新数据时,写入操作会报错,同时不删除数据
    • volatile为前缀的策略都是从已过期的数据集中进行淘汰。
    • allkeys为前缀的策略都是面向所有key进行淘汰。
    • LRU(least recently used)最近最少用到的。
    • LFU(Least Frequently Used)最不常用的。
    • 它们的触发条件都是Redis使用的内存达到阈值时。

      因为 C 语言并不具备自动的内存回收功能, 所以 Redis 在自己的对象系统中构建了一个引用计数技术实现的内存回收机制, 通过这一机制, 程序可以通过跟踪对象的引用计数信息, 在适当的时候自动释放对象并进行内存回收。

    typedef struct redisObject {
    
        // ...
    
        // 引用计数
        int refcount;
    
        // ...
    
    } robj;

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

    • 在创建一个新对象时, 引用计数的值会被初始化为 1 ;
    • 当对象被一个新程序使用时, 它的引用计数值会被增一;
    • 当对象不再被一个程序使用时, 它的引用计数值会被减一;
    • 当对象的引用计数值变为 0 时, 对象所占用的内存会被释放。 
  • 相关阅读:
    将iso镜像转换为docker镜像
    Linux awk使用方法~~整理
    Linux sed使用方法
    Linux 环境变量梳理
    学习docker——命令总结
    Golang 字符串操作--使用strings、strconv包
    WebSocket实现一个聊天室
    学习WebSocket
    PHP面试题整理
    php使用gd库输出中文内容的图片
  • 原文地址:https://www.cnblogs.com/iceggboom/p/13718449.html
Copyright © 2011-2022 走看看