Redis 内存回收机制
Redis 的内存回收主要围绕以下两个方面:
1.Redis 过期策略:删除过期时间的 key 值
2.Redis 淘汰策略:内存使用到达 maxmemory 上限时触发内存淘汰数据
Redis 的过期策略和内存淘汰策略不是一件事,实际研发中不要弄混淆了,下面会完整的介绍两者。
Redis过期策略
过期策略通常有以下三种:
1.定时过期
每个设置过期时间的 key 都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的 CPU 资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
2.惰性过期
只有当访问一个 key 时,才会判断该 key 是否已过期,过期则清除。该策略可以最大化地节省 CPU 资源,却对内存非常不友好。极端情况可能出现大量的过期 key 没有再次被访问,从而不会被清除,占用大量内存。
3.定期过期
每隔一定的时间,会扫描一定数量的数据库的 expires 字典中一定数量的 key,并清除其中已过期的 key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得 CPU 和内存资源达到最优的平衡效果。
Redis中同时使用了惰性过期和定期过期两种过期策略。
Redis 淘汰策略
1.简介
Redis 的内存淘汰策略,是指当内存使用达到 maxmemory 极限时,需要使用 LAU 淘汰算法来决定清理掉哪些数据,以保证新数据的存入。
2、LRU 算法
Redis 默认情况下就是使用 LRU 策略算法。
LRU 算法(least RecentlyUsed),最近最少使用算法,也就是说默认删除最近最少使用的键。
但是一定要注意一点!redis 中并不会准确的删除所有键中最近最少使用的键,而是随机抽取 3 个键,删除这三个键中最近最少使用的键。
那么 3 这个数字也是可以可以设置采样的大小,如果设置为 10,那么效果会更好,不过也会耗费更多的 CPU 资源。对应位置是配置文件中的 maxmeory-samples。
3.缓存清理配置
maxmemory 用来设置 redis 存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用 LRU 算法清理掉部分数据。
对于 64 bit 的机器,如果 maxmemory 设置为 0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止,但是对于 32 bit 的机器,有一个隐式的闲置就是 3GB。
4.Redis 数据淘汰策略
maxmemory-policy,可以设置内存达到最大闲置后,采取什么策略来处理。
对应的淘汰策略规则如下:
1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key。
3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。
4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。
5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
5.缓存清理的流程
1)客户端执行数据写入操作
2)redis server 接收到写入操作之后,检查 maxmemory 的限制,如果超过了限制,那么就根据对应的 policy 清理掉部分数据
3)写入操作完成执行。
总结
redis 的内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,内存淘汰策略的选取并不会影响过期的 key 的处理。过期策略用于处理过期的缓存数据。
作者:楚阳
链接:https://leetcode-cn.com/circle/article/ztZkJJ/
来源:力扣(LeetCode)