redis--过期策略和内存淘汰策略
redis过期策略
1、惰性删除
当客户端尝试访问某个键时,Redis会先检查该键是否设置了过期时间,并判断是否过期。
如果键已过期,则Redis会立即将其删除。这就是惰性删除。
总结:该策略可以最大化的节省CPU资源,却对内存非常的不友好,极端情况下可能出现大量的过期的key没有再次被访问,从而不会被清除,占用大量的内存。
2、定期删除
redis会每隔一段时间(默认100毫秒) 随机检查一部分设置了过期时间的键。
定期过期策略通过使用循环遍历的方式,逐个检查键是否过期,并删除已过期的键值对
总结:通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使的CPU和内存资源达到最优的平衡效果
实际的流程
Redis中同时使用了惰性删除和定期删除的这两种过期策略
假设Redis当前存放20万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。
因此redis采取的是定期删除,每隔100ms就随机抽取一定数量的key来检查和删除的 。
但是呢,最后可能会有很多已经过期的key没有被删除,这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。
总结:需要注意如果定期删除漏掉了很多过期的key,然后也没走惰性删除,就会有很多过期key积在内存中,可能会导致内存溢出,或者是业务量太大,内存不够用然后溢出了,为了应对这个问题,redis引入了内存淘汰策略进行优化。
redis内存淘汰策略
前言
以下介绍redis的6中内存淘汰策略,内存淘汰策略允许Redis在内存资源紧张时,根据一定的策略主动删除一些键值对,以释放内存空间并保持系统的稳定性
1、noeviction(不淘汰策略)
当内存不足以容纳新写入数据时,Redis将新写入的命令返回错误,这个策略确保数据的完整性,但会导致写入操作失败。
2、volatile-lru(最近最少使用)
从设置了过期时间的键中选择最少使用的键进行删除,该策略优先删除最久未被访问的键,保留最常用的键。
3、volatile-ttl(根据过期时间优先)
从设置了过期事假的键中选择剩余圣剑最短的键进行删除。该策略优先删除剩余时间较短的键,以保留剩余时间更长的键
4、volatile-random(随机删除)
从设置了过期时间的键中随机选择一个键进行删除
5、allkeys-lru(全局最近最少使用)
从所有键中选择最少使用的键进行删除,无论键是否设置了过期时间,都将参与淘汰
6、allkeys-random(全局随机删除)
从所有键中随机选择一个键进行删除