redis 的过期策略及 内存删除策略

685 阅读2分钟

redis 的过期策略

redis 有两种过期策略

1.懒惰删除

只有当用户主动访问已过期的数据时,会先检查一下对象是否过期,如果过期,则删除记录。

2.定期删除

如果对象一直没有被访问到,redis 还有一个定期的删除线程,会随机选出一部分key,删除其中最近最久未使用的key。

3.RDB 与AOF 时是否会载入过期键

rdb 如果是主服务器运行的话,不会载入已经过期的,如果是从服务器的话,会!只会由主服务器同步时,才会被清空。

AOF 是增量更新的,会增加一条删除记录。

AOF重写:因为AOF是增量的,数量会非常多,所以,程序会重写AOF,在重写的时候,是不会写入已删除的键值的。 AOF 重写是在子进程中执行的,不会影响主进程,也不用考虑线程切换及锁的问题。在执行AOF重写时,新命令会同时写入主进程AOF缓冲区及AOF重写缓冲区,等重写进程执行完毕,重写缓冲区内容写入重写AOF文件,然后把新的AOF文件覆盖原有AOF文件。

4.Redis 内存删除策略:

当redis 内存满了的时候,会主动的删除一些已过期的键值,该操作是阻塞的,并且如果删除后,重新又满了,会重复的进行删除,导致请求延迟,因此建议在redis 内存快满之前及时扩容,否则会频繁删除,导出阻塞timeOut。 删除策略有6种,用的比较多的是删除最近最久未使用的key,但这个最近最久未使用不是针对所有的key,而是随机5个key,删除其中最近最久未使用的。

* volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存
* allkeys-lru:清除最少用的旧缓存,然后保存新的缓存
* volatile-lfu:在那些设置了expire过期时间的缓存中,清除最长时间未用的旧缓存,然后保存新的缓存
* allkeys-lfu:清除最长时间未用的旧缓存,然后保存新的缓存
* volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存
* allkeys-random:在所有的缓存中随机删除(不推荐)
* volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的
* noeviction:旧缓存永不过期,新缓存设置不了,返回错误