在redis中提供了两种数据过期删除策略
第一种是惰性删除(LRU),当访问一个键时,Redis会检查该键是否过期,如果过期则将它删除。这种方式主要用于减少内存的使用,因为不需要额外的定时器来检查键的过期时间。在惰性删除策略下,Redis只有在访问键时才会检查其是否过期。通俗点说就是在设置该key过期时间后,我们不去管它,当需要该key 时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。
第二种是 定期删除(TTL),当设置了过期时间(TTL)的键到达过期时间时,Redis会自动删除该键。Redis使用一个定时器来检查键是否过期,并在过期时删除它们。这种方式确保了被设置了过期时间的键能够及时地删除。就是说每隔一段时间,我们就对一些key进行检查,删 除里面过期的key
定期清理的两种模式:
SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配 置文件redis.conf 的 hz 选项来调整这个次数
FAST模式执行频率不固定,每次事件循环会尝试执行,但两次间隔不低于2ms, 每次耗时不超过1ms
优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。
缺点:难以确定删除操作执行的时长和频率
Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用。
扩展:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。
可以通过配置Redis的maxmemory-policy参数来选择过期策略。常见的策略包括:
- volatile-lru:在键空间中按照LRU算法删除已设置过期时间的键。
- volatile-ttl:在键空间中按照TTL算法删除已设置过期时间的键。
- volatile-random:在键空间中随机删除已设置过期时间的键。
- allkeys-lru:在键空间中按照LRU算法删除任何键,无论是否设置过期时间。
- allkeys-random:在键空间中随机删除任何键,无论是否设置过期时间
LRU(Least Recently Used)最近最少使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。(key1是在3s之前访问的, key2是在9s之前访问的,删除的就是key2)
LFU(Least Frequently Used)最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。(key1最近5s访问了4次, key2最近5s访问了9次, 删除的就是key1)