Redis的key驱逐策略
目录
警告
本文最后更新于 2022-01-27,文中内容可能已过时。
驱逐策略何时生效
如果maxmemory
为0则没有限制,如果内存用完会写入到磁盘的交换分区,这将导致Redis的性能降低,因为磁盘交换区比RAM慢很多。所以我们要合理设置 maxmemory
|
|
驱逐策略
noeviction
: 当达到内存限制时,新数据不会保存。 当数据库使用复制时,这适用于主数据库。默认策略,如果redis内存被写满,则不会写入。allkeys-lru
: 保留最近使用的密钥; 删除最近最少使用(LRU)的键。allkeys-lfu
: 保留频繁使用的密钥; 删除最不常使用(LFU)的键。volatile-lru
: 删除将expire字段设置为true的最少使用的键。volatile-lfu
: 删除将expire字段设置为true的最不常用的键。allkeys-random
: 随机删除键以为新数据添加空间。volatile-random
: 随机删除将expire字段设置为true的键。volatile-ttl
: 删除具有expire字段设置为true的剩余TTL值最短的密钥。
LRU 和 LFU 的区别
- 策略不同:LRU淘汰最近最少使用的缓存数据,而LFU淘汰最不经常使用的缓存数据。
- 计算方式不同:LRU淘汰是根据缓存数据最后一次被使用的时间,而LFU淘汰是根据缓存数据被使用的频率。
假设有以下4个缓存数据:A、B、C、D,只有3个空间,它们被访问的情况如下:A -> B -> C -> B -> D -> C -> A
按照最近最少使用(LRU)的策略,每次淘汰最久未被使用的缓存数据。根据上述访问情况,淘汰的过程如下:
- 访问A:A
- 访问B:A, B
- 访问C:A, B, C
- 访问B:A, C, B
- 访问D:C, B, D
- 访问C:B, D, C
- 访问A:D, C, A(淘汰B)
按照最少经常使用(LFU)的策略,每次淘汰使用频率最低的缓存数据。根据上述访问情况,淘汰的过程如下:
- 访问A:A(A使用次数为1)
- 访问B:A, B(A使用次数为1,B使用次数为1)
- 访问C:A, B, C(A使用次数为1,B使用次数为1,C使用次数为1)
- 访问B:A, C, B(A使用次数为1,C使用次数为1,B使用次数为2)
- 访问D:C, B, D(C使用次数为1,B使用次数为2,D使用次数为1)
- 访问C:B, D, C(B使用次数为2,D使用次数为1,C使用次数为2)
- 访问A:D, C, A(D使用次数为1,C使用次数为2,A使用次数为2)(淘汰D)
适用场景
Redis作为缓存,可以使用多种eviction策略,不同的策略适用于不同的场景,需要根据具体的业务需求和数据访问模式来选择。以下是一些常用的eviction策略及其适用场景:
- LRU(Least Recently Used,最近最少使用):适用于缓存数据具有时间局部性的场景,比如热点数据。
- LFU(Least Frequently Used,最不经常使用):适用于缓存数据访问频率比较稳定的场景,比如一些统计数据。
- TTL(Time To Live,生存时间):根据键的过期时间来淘汰。适用于缓存数据具有时效性的场景。
- Random(随机淘汰):随机选择一个键来淘汰。适用于缓存数据访问模式不确定的场景。
在选择eviction策略时,需要考虑数据的重要性
、访问模式
、数据的时效性
等因素。比如,对于一些比较重要的数据,可以考虑采用LRU策略,以保证热点数据被缓存下来;对于一些数据访问比较均匀的场景,可以考虑采用Random策略,以避免某些键一直被访问导致被淘汰的问题。如果缓存数据具有时效性,可以考虑采用TTL策略。