Redis的key驱逐策略

警告
本文最后更新于 2022-01-27,文中内容可能已过时。

如果maxmemory为0则没有限制,如果内存用完会写入到磁盘的交换分区,这将导致Redis的性能降低,因为磁盘交换区比RAM慢很多。所以我们要合理设置 maxmemory

1
maxmemory 100mb
  1. noeviction: 当达到内存限制时,新数据不会保存。 当数据库使用复制时,这适用于主数据库。默认策略,如果redis内存被写满,则不会写入。
  2. allkeys-lru: 保留最近使用的密钥; 删除最近最少使用(LRU)的键。
  3. allkeys-lfu: 保留频繁使用的密钥; 删除最不常使用(LFU)的键。
  4. volatile-lru: 删除将expire字段设置为true的最少使用的键。
  5. volatile-lfu: 删除将expire字段设置为true的最不常用的键。
  6. allkeys-random: 随机删除键以为新数据添加空间。
  7. volatile-random: 随机删除将expire字段设置为true的键。
  8. volatile-ttl: 删除具有expire字段设置为true的剩余TTL值最短的密钥。
  • 策略不同:LRU淘汰最近最少使用的缓存数据,而LFU淘汰最不经常使用的缓存数据。
  • 计算方式不同:LRU淘汰是根据缓存数据最后一次被使用的时间,而LFU淘汰是根据缓存数据被使用的频率。

假设有以下4个缓存数据:A、B、C、D,只有3个空间,它们被访问的情况如下:A -> B -> C -> B -> D -> C -> A

按照最近最少使用(LRU)的策略,每次淘汰最久未被使用的缓存数据。根据上述访问情况,淘汰的过程如下:

  1. 访问A:A
  2. 访问B:A, B
  3. 访问C:A, B, C
  4. 访问B:A, C, B
  5. 访问D:C, B, D
  6. 访问C:B, D, C
  7. 访问A:D, C, A(淘汰B)

按照最少经常使用(LFU)的策略,每次淘汰使用频率最低的缓存数据。根据上述访问情况,淘汰的过程如下:

  1. 访问A:A(A使用次数为1)
  2. 访问B:A, B(A使用次数为1,B使用次数为1)
  3. 访问C:A, B, C(A使用次数为1,B使用次数为1,C使用次数为1)
  4. 访问B:A, C, B(A使用次数为1,C使用次数为1,B使用次数为2)
  5. 访问D:C, B, D(C使用次数为1,B使用次数为2,D使用次数为1)
  6. 访问C:B, D, C(B使用次数为2,D使用次数为1,C使用次数为2)
  7. 访问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策略。


Redis key eviction

相关内容