删除|一文读懂Redis内存淘汰策略

删除|一文读懂Redis内存淘汰策略

文章图片

【删除|一文读懂Redis内存淘汰策略】删除|一文读懂Redis内存淘汰策略

文章图片


Redis内存淘汰的必要性我们都知道redis的性能很高 , 最主要的原因之一就是redis的数据都在内存中放着 , 我们在从redis中获取数据或者更新redis中的数据时 , 都是操作的内存中的数据 。 而当内存被占满了之后怎么办呢?这时就有必要将一些数据清理掉 , 以便新的数据能够放到redis中 。 而清理掉哪些数据?保留哪些数据?什么时候清理?如何配置这些策略?这些就是接下来要研究的内容 。
Redis的key过期策略Redis中可以为key设置过期时间 , 当到达过期时间后 , 就需要将这个key删除掉 。 Redis中提供了两种过期删除策略:惰性删除和定期删除 。

  • 定期删除
Redis会将每个设置了过期时间的key放入到一个独立的字典中 , 以后会定期遍历这个字典来删除到期的key 。 Redis默认每秒进行10次过期扫描(100ms一次 , 可以通过修改配置文件redis.conf 的hz选项来调整这个次数) , 但这个扫描并不会扫描过期字典中所有的key , 而是通过一种贪心策略来随机筛选删除key , 步骤如下:
  1. 从过期字典中随机选出20个key;
  2. 删除这20个key中已经过期的key;
  3. 如果过期的key的比例超过了1/4 , 那就重复从步骤1开始执行 。
之所以采用这种扫描策略 , 还是为了性能考虑 。 假如过期字典中有数百万个key , 每隔100ms就扫描一次这数百万个key , 会给CPU造成很大的负荷 , 所以 , 就选择了这种随机筛选部分key , 然后按照过期比例来判断是否需要重复执行筛选过期的动作 。
正是由于使用了这种扫描策略 , 定期删除可能会造成很多已经过期的key无法及时删除 , 所以就有了接下来的惰性删除策略 。
  • 惰性删除
所谓惰性删除就是在客户端访问这个key的时候 , Redis对key的过期时间进行检查 , 如果过期了就立即删除 , 然后返回null 。
不管是定期删除还是惰性删除 , 都是一种不完全精确的删除策略 , 始终还是会存在已经过期的key无法被删除的场景 。 而且这两种过期策略都是只针对设置了过期时间的key , 不适用于没有设置过期时间的key的淘汰 , 所以 , Redis还提供了内存淘汰策略 , 用来筛选淘汰指定的key 。
Redis内存淘汰策略我们在之前的文章中学习过两种内存淘汰算法:LRU算法详解LFU算法详解 , redis提供的内存淘汰策略中就有一部分是基于这两种算法实现的 , 如果对这两种算法不太熟悉 , 可以先学习下这两篇文章的内容 。 Redis目前共提供了8种内存淘汰策略 , 其中有两种基于LFU算法的策略是Redis4.0版本之后增加的 。 接下来让我们一起了解下这8种淘汰策略: