内存淘汰策略
Redis配置文件中可以设置maxmemory,即内存的最大使用量,到达设置值时会执行内存淘汰机制。其中,LRU(least recently used)为最近最少用到的,LFU(Least Frequently Used)为最不常用的。
volatile-lru -> 使用 LRU 算法删除过期字典中的key
allkeys-lru -> 根据 LRU 算法删除任意key
volatile-lfu -> 使用 LFU 算法删除过期字典中的key
allkeys-lfu-> 根据 LFU 算法删除任意key
volatile-random -> 随机删除一个过期字典中的key
allkeys-random -> 随机删除一个key
volatile-ttl -> 删除过期时间最近的key
noeviction -> 根本不过期,只在写操作时返回一个错误
注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。
选取内存淘汰策略的规则:
- 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
- 如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
LRU算法的实现
Redis中的数据整体上是一个大的字典,其每个对象都记有最近访问时间戳。Redis中LRU初始的实现算法很简单,随机从dict中取出五个key,淘汰一个LRU字段值最小的。在3.0的时候,又改进了一版算法,首先第一次随机选取的key都会放入一个pool中(pool的大小为16),pool中的key是按LRU大小顺序排列的。接下来每次随机选取的key的LRU值必须小于pool中最小的LRU才会继续放入,直到将pool放满。放满之后,每次如果有新的key需要放入,需要将pool中LRU最大的一个key取出。淘汰的时候,直接从pool中选取一个LRU最小的值然后将其淘汰。