内存淘汰策略是当内存不够用时才会触发的一种机制,是缓存服务层面的操作,而过期策略定义的是具体缓存数据何时失效。我们在使用Redis的时候经常会给redis的key设置一个过期时间如:EXPIRE key 30
,过期策略就是指当 Redis 中缓存的 key 过期了,Redis 如何处理。
对于已经过期的数据,Redis将使用两种策略搭配使用来删除这些过期的键值,分别是惰性删除,定期删除。
惰性删除
惰性删除 是指 Redis 服务器不主动删除过期的键值,而是在客户端要获取某个键值时,Redis会先去检测一下这个key是否已经过期,如果没有过期则返回给客户端,如果已经过期了,那么Redis会删除这个key并返回null给客户端。
惰性删除可以解决一些过期了,但没被定期删除随机抽取到的key。但有些过期的key既没有被随机抽取,也没有被客户端访问,就会一直保留在数据库,占用内存,长期下去可能会导致内存耗尽。所以Redis提供了内存淘汰机制来解决这个问题。
惰性删除的优点是不会浪费太多的系统资源,只是在每次访问时才检查键值是否过期。缺点是像上面说的删除过期键不及时,造成了一定的空间浪费。
定期删除
定期删除 是指 Redis 服务器每隔一段时间会检查一下缓存数据库,看看是否有过期键可以被清除。默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”即可,默认的值为“hz 10”。
因为key太多,如果全盘扫描所有的key会非常耗性能,所以定期删除是随机抽取一些key来删