redis的内存回收-过期策略和淘汰策略详解

redis内存回收机制

redis的内存回收主要围绕一下两个方面

  1. redis过期策略:删除过期时间的key值
  2. redis淘汰策略:内存使用达到maxmemory上限时会触发内存淘汰数据
    redis的过期策略和内存淘汰策略不是一回事

过期策略通常有以下3种

  1. 定时过期:为每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除,该策略可以立即清除过期的数据,
    对内存很友好,但是会占用大量的CPU资源去处理过期时间的数据,从而影响缓存的影响时间和吞吐量
  2. 惰性过期:只有当访问一个key时,才会判断该key是否过期,如果过期立即清除,该策略可以最大化的节省CPU资源,
    但是却对内存非常不友好,极端的情况可能出现大量的key没有被再次访问,从而不会被清除,占用大量的内存
  3. 定期过期:每隔一定的时间,会扫描一定数量的数据库中的expires字典中的一定数量的key,并清除已经过期的key
    该策略是定时过期和惰性过期的折中方案,通过调整定时扫描的时间间隔和每次扫描的限定耗时,就可以在不同情况下
    使CPU和内存达到最优的平衡效果
  • redis中同时使用了惰性过期和定期过期两种过期策略

redis淘汰策略

  1. 简介
    redis的内存淘汰策略是指当内存使用达到maxmemory极限时,需要使用LRL淘汰算法来决定清理掉哪些数据,
    这样才能保证新数据的存入
  2. LRU算法
    redis默认情况下使用的就是LRU策略算法
    LRU(least recently used)算法最近最少使用算法, 也就是说默认删除最近最少使用的键
    但是一定要注意一点,redis并不会准确删除所有键中最近最少使用的键,而是随机抽取3个,删除这3个中最近最少使用的键
    3这个数字也是可以设置采样大小的,如果设置为10,效果会更好,不过会耗费更多的CPU资源,配置文件中可以通过maxmemory-samples设置
  3. 缓存清理配置
    maxmemory用来设置redis存放数据的最大内存大小,一旦超出这个内存大小之后,就会立即调用LRU算法清理掉一部分数据
    对于64 bit的机器,如果设置maxmemory=0,那么就等于不限制内存使用,直到机器中的内存耗尽为止,但是在32 bit中,有一个隐式的闲置就是3GB
  4. redis数据淘汰策略
    maxmemory-policy 可以设置内存到达最大闲置后,采取什么策略来处理
    对应的淘汰策略规则如下:
    规则名称 规则说明
    volatile_lru 使用lru算法删除一个键(只对设置了生存时间的键)
    allkeys_lru 使用lru算法删除一个键
    volatile_random 随机删除一个键(只对设置了生存时间的键)
    allkeys_random 随机删除一个键
    volatile_ttl 删除生存时间最近的一个键
    noeviction 不删除键,只返回错误
    (1) noeviction: 当内存不足以容纳新写入的数据时,新写入数据会报错
    (2) allkeys_lru: 当内存不足以容纳新写入数据时,在键空间中,删除最近最少使用的键
    (3) allkeys_random: 当内存不足以容纳新写入数据时,在键空间中,随机删除一个键
    (4) volatile_lru: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,删除最近最少使用的键
    (5) volatile_random: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机删除一个键
    (6) volatile_ttl: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,删除最早过期的键
  5. 缓存清理的流程
    (1)客户端执行数据写入操作
    (2)redis server接收到写入操作后,检查maxmemory的限制,如果超过了限制,那么就根据policy清理掉一部分数据
    (3)写入操作完成执行

总结

redis淘汰策略就是当内存达到maxmemory最大时又需要申请额外的内存空间,就需要通过淘汰策略淘汰掉一部分数据,给新数据腾出内存空间
redis淘汰策略的选取不会影响过期key的处理
redis过期策略用于处理过期的缓存数据

参考文档

posted @ 2022-03-30 15:00  专职  阅读(254)  评论(0编辑  收藏  举报