三种类型
可以将淘汰策略分为三种,一种是对于设置了过期时间的key,一种对于所有key,另一种是内存上限后只允许读不允许写。
设置了过期时间的key
- volatile-lru:淘汰最久未使用的key(最近一段时间访问次数最少)
- volatile-lfu:淘汰最少被使用的key
- volatile-ttl:淘汰剩余时间最短的key
- volatile-random:随机淘汰一个key
所有key
- allkeys-lru:淘汰最久未使用的key(最近一段时间访问次数最少)
- allkeys-lfu:淘汰最少被使用的key
- allkeys-random:随机淘汰一个key
默认使用
- no-eviction:内存达到上限后只允许读,不能进行写操作
可以通过设置配置文件(redis.conf)修改使用的策略,maxmemory-policy
两种淘汰算法
1.LRU(Least Recently Used)最近最少使用
根据数据最近被访问的时间来移除那些使用次数最少的,最近一段时间使用次数最少的。
2.LFU(Least Frequently Used)最少使用
根据数据被访问的频率来决定哪些数据应该被移除,不关注使用时间,只关注使用频率。
不同的版本
在redis4.0版本之后出现了两种新的算法,是LFU对应的两种淘汰策略。
使用场景
1.读/写比例:
应用主要是读操作,那么考虑使用 allkeys-lru 或 allkeys-lfu 策略,这些策略会保留频繁访问的数据。如果写操作较多,不希望写操作因内存不足而失败,noeviction 策略更适合。
2.数据的更新频率:
数据经常更新,使用 volatile-lru 或 volatile-lfu 策略更合适,这些策略会考虑数据的过期时间和访问频率。
3.数据的访问模式:
3.1热点数据:
应用中存在一些热点数据(即经常被访问的数据),allkeys-lru 或 allkeys-lfu 策略更适合,它们会保留这些热点数据。
3.2均匀访问模式:
如果数据的访问模式比较均匀,即没有明显的热点数据,那么 volatile-random 或 allkeys-random策略可能更合适。
4.内存限制和性能要求:
内存限制严格:系统内存资源有限,且对性能要求较高,那么 noeviction 策略更适合,可以避免因内存不足而导致的写操作失败。
性能优化:在某些情况下,volatile-ttl策略可以帮助优化性能,会优先淘汰剩余生存时间较短的key,从而确保内存中保留更多的有效数据。