Redis缓存是提高系统性能的最佳方式。相信大家都不陌生。光头老码友不仅要掌握Redis的基本用法,还要了解Redis的相关原理,比如Redis过期策略、内存淘汰机制等。大家都知道Redis缓存是用内存资源的。虽然缓存服务器会配置比较高的内存资源,但是如果我们忽略Redis中的缓存数据,内存资源总会被耗尽。这时,缓存服务器将无法对外提供服务。如果我们想利用有限的服务器资源来支持更多的业务服务,就必须删除那些不经常访问的缓存,为新的缓存腾出空间。Redis主要通过两种协作方式实现key-value清洗,即:过期策略和内存淘汰机制。内存淘汰策略当Redis节点分配的内存使用量达到最大值时,为了继续提供服务,Redis会启动内存淘汰策略。在Redis4.0之前,主要有以下六种淘汰策略:noeviction:不淘汰任何数据,当内存不足时,添加新的缓存时,会报错。这种策略可以保证数据不会丢失。也是Redis默认的内存淘汰策略。allkeys-lru:剔除整个键值中最长时间未被使用的键值,也就是我们常说的LRU算法。allkeys-random:随机消除任意键值。volatile-lru:淘汰所有设置了过期时间的键值中最早未使用的键值。volatile-random:随机消除任何设置了过期时间的键值。volatile-ttl:优先淘汰过期时间较早的键值。从上面的内存淘汰策略可以看出,allkeys-开头的表示从所有key中淘汰数据,而volatile-开头的则是对设置了过期时间的key淘汰数据。在Redis4.0版本中,新增了两种淘汰策略:allkeys-lfu,淘汰整个key值中最少使用的key值,也就是我们常说的LRU算法。volatile-lfu,淘汰所有设置过期时间的键值中最少使用的键值。LRU(LeastRecentlyUsed,最近最少使用),根据最近使用的时间,优先淘汰距离当前最远的数据;LFU(LeastFrequentlyUsed,最不频繁使用),在一段时间内,缓存数据被使用次数最少的将被淘汰。可以修改redis.conf配置文件中的配置项maxmemory-policy,修改为需要设置的类型。缓存过期策略内存淘汰策略是一种在内存不够时触发的机制。是缓存服务层面的操作,过期策略定义了具体的缓存数据什么时候过期。我们在使用Redis的时候,经常会为redis的key设置一个过期时间,比如:EXPIREkey30。过期策略是指当Redis中缓存的key过期时,Redis如何处理。对于过期的数据,Redis会采用两种策略来删除这些过期的键值,即惰性删除和定时删除。懒删除懒删除是指Redis服务器不会主动删除过期的键值,而是当客户端想要获取某个键值时,Redis会先检查该键是否过期,如果没有则返回给客户端已到期。如果已经过期,Redis将删除该键并返回null给客户端。延迟删除可以解决一些随机选择的过期但不定期删除的键。但是,有些过期的key既不是随机选择的,也不是客户端访问的,所以会一直保存在数据库中,占用内存,长此以往可能会导致内存耗尽。所以Redis提供了内存淘汰机制来解决这个问题。懒删除的好处是不会浪费太多的系统资源,每次访问时只检查key值是否过期。缺点就是上面说的过期键的删除不及时,造成了一定的空间浪费。周期性删除周期性删除是指Redis服务器每隔一段时间会检查缓存数据库,看是否有过期的key可以清除。默认情况下,Redis定期检查的频率为每秒10次扫描,用于定期清除过期的键。当然这个值也可以通过配置文件来设置,只需修改redis.conf中的配置“hz”即可,默认值为“hz10”。因为key太多,扫描全盘所有key会很耗性能,所以定时删除就是随机选择一些key删除。这样就可以无限删除,需要懒删除。
