赞
踩
推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
策略 | 定时删除 | 惰性删除 | 定期删除 |
---|---|---|---|
描述 | 设置key过期时间时,创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。 | 当需要key时,首先检查是否过期,如果过期就删掉,反之返回值。 | 每隔一段时间,对key进行检查,删除里面过期的key。 |
优点 | 对内存最友好 | 对cpu最友好 | 对内存友好 对cpu友好 |
缺点 | 对cpu不友好 | 对内存不友好 | 难以确定删除操作执行的时长和频率 |
1)难以确定删除操作执行的时长和频率
如果执行频率高:和定时删除一样,对CPU不友好
如果执行频率低:和惰性删除一样,对内存不友好
2)在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是个严重的错误
Redis的过期删除策略 = 惰性删除 + 定期删除
过期删除策略 | 处理方式 | 实现函数 | 描述 |
---|---|---|---|
惰性删除 | 零散 | db.c/expireIfNeeded | 当key被访问时,调用函数检查key是否过期,如果过期则删除,否则继续执行实际命令 |
定期删除 | 集中 | redis.c/activeExpireCycle | 每隔一段时间,随机检查设置了过期的key并删除已过期的key |
Redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。
# 每秒执行次数
hz 10
# 默认值:10
# 取值范围:1~500,建议不超过100,只有在请求延时非常低的情况下可以将值提升到100
Q:单线程的redis,如何知道要运行定时任务?
A:Redis 的定时任务会记录在一个称为最小堆的数据结构中。这个堆中,最快要执行的任务排在堆的最上方。在每个循环周期,Redis 都会将最小堆里面已经到点的任务立即进行处理。处理完毕后,将最快要执行的任务还需要的时间记录下来,这个时间就是接下来处理客户端请求的最大时长,若达到了该时长,则暂时不处理客户端请求而去运行定时任务。
Redis 默认会每秒进行10次过期扫描,但并不是遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。
为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。
持久化命令:save、bgsave
程序会对数据库中的键进行检查,未过期键会保存到RDB文件,已过期键则忽略。
程序会对文件中的键进行检查,未过期键会被载入到数据库中,过期键则忽略。
文件中的所有键,不论是否过期,都会被载入到数据库中。(过期键会通过与主服务器同步而删除)
持久化命令:rewriteaof 、bgrewriteaof
当过期键被惰性删除或者定期删除后,程序会向AOF文件追加一条DEL命令,显式记录该键已被删除。
Q:客户端访问已经过期的键,服务器如何处理?
A:服务器将执行以下3个动作:1、从数据库中删除该键
2、追加一条DEL命令到AOF文件
3、向客户端返回空
程序会对数据库中的键进行检查,未过期键会保存到重写后的AOF文件,过期键则忽略。
在主从复制模式下,从服务器的过期键删除动作由主服务器控制
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。