• Redis内存回收策略


    Redis内存回收机制主要体现在以下两个方面:

    1. 删除到达时间的键对象。
    2. 内存使用达到maxmemory上限时触发内存溢出控制策略。
    1.删除过期键对象

    Redis所有的键都可以设置过期属性,内部保存在过期字典中。由于进程内保存了大量的键,维护每个键精准的过期删除机制会导致消耗大量的CPU,对于单线程的Redis来说成本过高,因此Redis采用惰性删除定时任务删除机制实现过期键的内存回收。

    - 惰性删除:惰性删除用于当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空,这种策略是出于节省CPU成本考虑,不需要单独维护TTL链表来处理过期键的删除。但是单独用这种方式存在内存泄露的问题,当过期键一直没有访问将无法得到及时删除,从而导致内存不能及时释放。正因为如此,Redis还提供另一种定时任务删除机制作为惰性删除的补充。
    - 定时任务删除:Redis内部维护一个定时任务,默认每秒运行10次(通过配置hz控制)。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例,使用快慢两种速率模式回收键。
    比如:

    1. 定时任务在每个数据库空间随机检查20个键,当发现过期时删除对应的键。
    2. 如果超过检查数25%的键过期,循环执行回收逻辑直到不足25%或运行超时为止,慢模式下超时时间为25ms。
    3. 如果之前回收键逻辑超时,则在Redis触发内部事件之前再次以快模式运行回收过期键任务,快模式下超时时间为1ms且2s内只能运行1次。
    4. 快慢两种模式内部删除逻辑相同,只是执行的超时时间不同。
    2. 内存溢出控制策略

    当Redis所用内存达到maxmemory上限时会触发相应的溢出控制策略。具体策略受maxmemory-policy参数控制,Redis支持6种策略,如下所示:

    1. noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。
    2. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。推荐使用,目前项目在用这种。
    3. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key。应该也没人用吧,你不删最少使用 Key,去随机删。
    4. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。不推荐。
    5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key。依然不推荐。
    6. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。不推荐。如果没有对应的键,则回退到noeviction策略。


    作者:杨鑫科
    链接:https://www.jianshu.com/p/6a5eb0ddf57b
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    C语言博客作业06--结构体&文件
    C语言博客05--指针
    C语言博客作业04--数组
    LeetCode错题集
    C博客作业--指针
    深入浅出强化学习:原理入门(待更新)
    Detectron2环境配置+Ubantu+CUDA10.1+pytorch1.7.0
    论文记载:A Survey on Traffic Signal Control Methods
    论文记载:FRAP:Learning Phase Competition for Traffic Signal Control
    周博磊老师强化学习纲领笔记第三课:无模型的价值函数估计和控制
  • 原文地址:https://www.cnblogs.com/hmy-1365/p/12935620.html
Copyright © 2020-2023  润新知