当前位置:   article > 正文

一文彻底搞懂Redis的内存回收机制和内存过期淘汰策略

一文彻底搞懂Redis的内存回收机制和内存过期淘汰策略


关于 Redis 内存回收机制和内存过期淘汰策略的常见问题:

  • 什么是 Redis 的内存回收机制?

    Redis 的内存回收机制是指 Redis 如何回收不再使用的数据的机制。

  • Redis 有哪些内存过期淘汰策略?

    Redis 提供了多种内存过期淘汰策略,包括 noeviction、allkeys-random、volatile-random、volatile-lru、volatile-ttl、lru、ttl 和 lfu。

1. Redis内存回收机制

Redis 的内存回收主要由两部分组成:

  • Redis过期策略:删除过期时间的key值
  • Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据

Redis的过期策略和内存淘汰策略不是一件事

2. Redis过期策略

  • 定时过期
    每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

  • 惰性过期
    只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

  • 定期过期
    每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
    Redis中同时使用了惰性过期和定期过期两种过期策略。

3. Redis淘汰策略

Redis的内存淘汰策略,是指当内存使用达到maxmemory极限时,需要使用LAU淘汰算法来决定清理掉哪些数据,以保证新数据的存入。

3.1 LRU算法

Redis默认情况下就是使用LRU策略算法。
LRU算法(least RecentlyUsed),最近最少使用算法,也就是说默认删除最近最少使用的键。
但是一定要注意一点!redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键。
那么3这个数字也是可以可以设置采样的大小,如果设置为10,那么效果会更好,不过也会耗费更多的CPU资源。对应位置是配置文件中的maxmeory-samples。

3.2 缓存清理配置

maxmemory用来设置redis存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用LRU算法清理掉部分数据。
对于64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止;,但是对于32 bit的机器,有一个隐式的闲置就是3GB

3.3 Redis数据淘汰策略

maxmemory-policy,可以设置内存达到最大闲置后,采取什么策略来处理。

对应的淘汰策略规则如下

  • noeviction:这是默认策略,当运行内存超过最大设置内存时,不淘汰任何数据,这时如果有新的数据写入,会报错通知禁止写入,不淘汰任何数据,但是如果没用数据写入的话,只是单纯的查询或者删除操作的话,还是可以正常工作。
  • allkeys-random:在所有键中,随机选择并删除数据。
  • volatile-random:在设置了过期时间的键中,随机选择并删除数据。
  • volatile-lru:在设置了过期时间的键中,根据 LRU 算法选择并删除数据。
  • volatile-ttl:在设置了过期时间的键中,根据 TTL 值选择并删除数据,TTL 值越小的键越先被删除。

3.4 缓存清理的流程

客户端执行数据写入操作,redis server接收到写入操作之后,检查maxmemory的限制,如果超过了限制,那么就根据对应的policy清理掉部分数据,写入操作完成执行。

4. 总结

redis的内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,内存淘汰策略的选取并不会影响过期的key的处理。过期策略用于处理过期的缓存数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/421233
推荐阅读
相关标签
  

闽ICP备14008679号