本文最后更新于 2024-07-16,文章内容可能已经过时。

noeviction默认策略

当内存不足以容纳新写入数据时,新写入操作会报错,不淘汰任何数据

allkeys

  1. allkeys-lru:使用最近最少使用(Least Recently Used)算法淘汰数据。Redis 默认情况下使用这种策略,但并不会精确地删除所有键中最不常用的键,而是随机抽取一定数量的键,然后淘汰最不常用的一个

  2. allkeys-lfu:淘汰最不经常使用的数据,即根据数据被访问的频率来淘汰,使用频率最低的数据会被优先移除

  3. allkeys-random:在所有键中随机选择并删除数据,适用于不需要严格控制的场景,但可能会导致性能不稳定

volatile

  1. volatile-lru:在设置了过期时间的键中,根据 LRU 算法选择并删除数据

  2. volatile-lfu:在设置了过期时间的键中,根据 LFU 算法淘汰数据

  3. volatile-random:在设置了过期时间的键中随机选择并删除数据

  4. volatile-ttl:在设置了过期时间的键中,根据 TTL(time to live)值选择并删除数据,TTL 值越小的键越先被删除

redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键。
那么3这个数字也是可以可以设置采样的大小,如果设置为10,那么效果会更好,不过也会耗费更多的CPU资源。

Redis过期策略

  • 定时过期

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

  • 惰性过期

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

  • 定期过期

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

Redis中同时使用了惰性过期和定期过期两种过期策略。