1、当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换,将使Redis性能急剧下降。但是在生产上时不允许出现这样的情况的,为了限制最大的使用内存,Redis提供了配置参数maxmemory来限制内存,当实际内存超出maxmemory时,Redis提供了几种可选策略来腾出新的空间
1)noeviction 不会继续服务写请求 (DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。
2)volatile-lru 尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。
3)volatile-ttl 跟上面一样,除了淘汰的策略不是 LRU,而是 key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。
4)volatile-random 跟上面一样,不过淘汰的 key 是过期 key 集合中随机的 key。
5)allkeys-lru 区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合。这意味着没有设置过期时间的 key 也会被淘汰。
6)allkeys-random 跟上面一样,不过淘汰的策略是随机的 key。
2、LRU算法
LRU算法需要key/value以及一个链表,链表内的元素按照访问时间进行排序,即刚刚访问的元素会排到首部,如果列表满了,将尾部的元素删除
3、近似LRU算法
Redis采用近似LRU算法,其规则比较简单,在现有数据结构的基础上使用随机采样法来淘汰元素,Redis为了实现近似采样法,给每个key增肌了个额外的小字段,最后被访问的时间戳。
LRU淘汰的处理方式只有懒惰处理,当Redis执行写操作,发现内存超出maxmemory,会执行一次淘汰,这个算法是随机采样出5个key(可以配置),然后淘汰掉最旧的key,如果淘汰完,还是超出maxmemory,继续淘汰,直到内存低于maxmemory为止。
如何淘汰根据maxmemory-policy配置,采样的大小可以根据maxmemory_samples的配置。
Redis3.0算法中增加淘汰池,提升了LRU的算法效果,没次淘汰循环中,新随机出来的key列表和淘汰池中的key列表进行融合,淘汰掉最旧的一个key,保留剩余较旧的key列表放入淘汰池中留待下次循环。