前言 Redis对于大家而言,是再熟悉不过的了,作为一款高性能的NoSql缓存数据库,往往也是在项目中扮演着十分重要的角色。今天笔者就分析一下Redis作为缓存时的淘汰机制
一、Redis的淘汰机制
Redis常常被我们用作项目中的缓存中间件去存储一些热点数据以及常用数据。但是Redis肯定也会有其缓存数据的大小。
设置缓存大小
- 例如:Config set maxmemory 4gb 设置缓存大小
- 当内存已经写满或者key过期时,redis就会自己采取一些淘汰机制。
淘汰机制分为7种:
二、LRU与LFU
2.1 LRU算法
LRU 算法的全称是 Least Recently Used,这是按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中。
LRU 会把所有的数据组织成一个链表,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据和最近最不常用的数据
LRU简单图解
2.2 LFU算法
LFU (Least Frequently Used) 算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。
LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序
注意:它无法对一个拥有最初高访问率之后长时间没有被访问的条目缓存负责
LFU简单图解
三、Redis中的LRU
LRU算法固然有好有弊,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能。 因此redis针对LRU做了自己的优化,以达到高性能缓存。
Redis 默认会记录每个数据的最近一次访问的时间戳(由键值对数据结构 RedisObject 中的 lru 字段记录)。然后,Redis 在决定淘汰的数据时,第一次会随机选出 N 个数据,把它们作为一个候选集合。接下来,Redis 会比较这 N 个数据的 lru 字段,把 lru 字段值最小的数据从缓存中淘汰出去,当需要再次淘汰数据时,Redis 需要挑选数据进入第一次淘汰时创建的候选集合。这儿的挑选标准是:能进入候选集合的数据的 lru 字段值必须小于候选集合中最小的 lru 值。当有新数据进入候选数据集后,如果候选数据集中的数据个数达到了 maxmemory-samples,Redis 就把候选数据集中 lru 字段值最小的数据淘汰出去
CONFIG SET maxmemory-samples 100 :
maxmemory-samples :此参数为redis选择的待删除的数据量