• redis过期key的清理策略


    一,有三种不同的删除策略
    (1),立即清理。在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。

    (2),惰性清理。键过期了就过期了,不管。当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key

    (3),定期清理。每隔一段时间,对expires字典进行检查,删除里面的过期键。

    二,详细说明三种清理方式的优劣
    (1)立即清理
    立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。
    因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力。

    (2)惰性删除
    惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。
    所以惰性删除的缺点很明显:浪费内存。dict字典和expires字典都要保存这个键值的信息。

    (3)定时删除
    从上面分析来看,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。
    定时删除是:每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。
    另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。

    三,目前redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用。

    四,详细说明定时清理机制
    这个和redis.conf 的hz 10配置有关。
    首先说一下时间事件,对于持续运行的服务器来说, 服务器需要定期对自身的资源和状态进行必要的检查和整理,
    从而让服务器维持在一个健康稳定的状态, 这类操作被统称为常规操作(cron job)

    在 Redis 中, 常规操作由 redis.c/serverCron 实现, 它主要执行以下操作
    •更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
    •清理数据库中的过期键值对。
    •关闭和清理连接失效的客户端。
    •尝试进行 AOF 或 RDB 持久化操作。
    •如果服务器是主节点的话,对附属节点进行定期同步。
    •如果处于集群模式的话,对集群进行定期同步和连接测试。

    Redis 将 serverCron 作为时间事件来运行, 从而确保它每隔一段时间就会自动运行一次,
    又因为 serverCron 需要在 Redis 服务器运行期间一直定期运行, 所以它是一个循环时间事件: serverCron 会一直定期执行,直到服务器关闭为止。


    比如Redis-3.0.0中的hz默认值是10,代表每秒钟调用10次后台任务。
    典型的方式为,Redis每秒做10次如下的步骤:
    •随机测试100个设置了过期时间的key
    •删除所有发现的已过期的key
    •若删除的key超过25个则重复步骤1

    总结:redis会在hz的频率下(n次每秒),会在一定时间限制内尽可能多的删除过期key。

  • 相关阅读:
    【原创】go语言学习(五)函数详解1
    【原创】go语言学习(四)流程控制
    aws使用之负载均衡elb要点
    【转】只因写了一段爬虫,公司200多人被抓!
    【原创】go语言学习(三)字符串串、时间和日期类型
    【原创】go语言之打印目录
    【转】Sentry 入门实战
    【原创】go语言学习(二)数据类型、变量量、常量量
    【原创】导出aws ec2为csv
    (转)实验文档5:企业级kubernetes容器云自动化运维平台
  • 原文地址:https://www.cnblogs.com/zhangyabin---acm/p/9016065.html
Copyright © 2020-2023  润新知