为什么要清洁Redis

Redis是基于内存上进行数据的操作的,并非像以往我们所安装的底层数据库一样存在磁盘上的。在机子中,缓存的容量是有限的。 比较起存储在磁盘,其可存储量会小很多很多,随着程序的运行,缓存的数据只会越来越多,而因为容量有限我们不能无节制的存下去,因此需要对部分缓存的数据进行清理,以提供空间给新的数据进行缓存。

如何清洁

一、定时删除

在Redis缓存的数据中,几乎所有数据都会被标上一个过期时间,而这个过期时间是作为Redis清理数据腾出空间的一个重要依据。

定时删除的原理在于:为数据设置一个过期时间。每过一个时间周期,Redis会随机遍历一部分数据,当检测到数据已经到达了过期时间后,Redis就会将这些数据清除掉。 (为什么是随机遍历:如果全部遍历,十分耗费时间,影响性能)

redis怎么定期清理缓存 redis 自动清理缓存_数据

每过一个时间周期,Redis都会遍历一部分数据,并对这部分数据中到达了过期时间的数据进行清除。具体如上图所示。而从图中我们也可以看到该方法是存在一定的弊端的。因为是随机遍历一部分数据,所以可能会有些已过期但从来都没被遍历到的数据存在,而这些陈年老数据一直不会被清除,占用在内存中。

二、惰性删除

惰性删除与定时删除有种组合拳的意思。

惰性删除的原理在于:当有请求访问到了一个已到达过期时间且未被清理的数据时,Redis就会检测到这个过期数据并进行清除。

redis怎么定期清理缓存 redis 自动清理缓存_redis_02


如图所描述的,当有外来的请求访问到该数据时,若检测到过期时间已经到达,Redis就会删除这个数据。惰性删除也有着一个缺陷,如果一些陈年老数据一直未被请求访问到, 则该数据可能永远都不会被删除。

三、内存淘汰策略

在定时删除与惰性删除这套组合拳下,解决了极大部分的Redis清洁工作。但由于两者所存在的不足之处,很可能会出现永远没被删除的陈年且无用的老数据,这种数据很可能会随着业务的增加而越堆越多,这十分浪费我们宝贵的内存资源。

在解决这个问题上,我们使用到了Redis所提供的内存淘汰策略,为完成Redis的清理补上最后的一块拼图。

Redis一共提供了8种内存淘汰策略。如下图所示

redis怎么定期清理缓存 redis 自动清理缓存_redis怎么定期清理缓存_03


使用时,首先在配置文件redis.conf 中,参数 maxmemory 来设定最大内存,当达到最大内存后就会触发内存淘汰策略。然后通过设置 maxmemory-policy 来指定使用哪种内存淘汰策略。