文章目录
- redis的过期删除策略
- 常见删除策略
- 定时删除策略
- 惰性删除策略
- 定期删除策略
- redis的过期删除策略
- 惰性删除策略
- 定时删除策略
- rdb对过期键的处理
- 生成rdb文件
- 载入rdb文件
- aof对过期键的处理
- 写入
- 重写
- 复制功能对过期键的处理
redis的过期删除策略
常见删除策略
- 定时删除: 在设置键的过期时间时创建一个定时器,定时器会在时间到来时执行对键的删除操作
- 惰性删除: 放任过期键不管,每次从键空间中获取键时,会检查该键是否过期,过期则删除,没过期则返回
- 定期删除: 每隔一段时间,对数据库进行检查,删除过期键
定时删除策略
通过调用定时器来完成操作,可以保证过期键会立刻删除,释放程序内存。
- 优点:释放内存
- 缺点:僵硬地删除,影响cpu性能
如果由大量的命令请求需求服务器去处理时,服务器还需要耗费很多的系统资源去删除过期键,很影响性能
惰性删除策略
只有在获取键时才会对键进行检查,不会再删除其他无关的过期键时耗费cpu性能
- 优点:对cpu非常友好
- 缺点:实际已经过期键会占用大量内存资源
定期删除策略
定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时,通过定期删除过期键,也有效地减少了因为过期键而带来的内存浪费。
redis的过期删除策略
redis采用的是惰性删除策略和定期删除策略相结合的方式
惰性删除策略
过期键的惰性删除策略由expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:
- 如果输入键已经过期,那么将输入键从数据库中删除
- 如果输入键未过期,那么不做任何处理
定时删除策略
过期键的定期删除策略由activeExpireCycle函数实现,每当Redis服务器的周期性操作serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。
rdb对过期键的处理
生成rdb文件
在执行save或bgsave命令创建新的red文件时,程序会对缓存中的键进行检查,已过期的键不会写入新创建的rdb文件中。
载入rdb文件
启动redis时,如果服务器开启了rdb持久化,那么服务器会载入rdb文件:
- 载入服务器是主服务器,会对rdb文件中保存的键进行检查,未过期的键会载入到数据库中,过期键则会忽略
- 服务器是从服务器,rdb文件中保存的所有键,都会被载入到数据库中
aof对过期键的处理
写入
当服务器开启aof功能后,如果数据库中的某个键过期了,程序会向aof文件中追加一条del命令,表示该键已经被删除了。
重写
在执行aof文件重写时,程序会对数据库中的键进行检查,过期的键不会被保存到aof文件中
复制功能对过期键的处理
主从复制模式下,从服务器的过期删除模式由主服务器控制:
- 主服务器在删除一个过期键后,会显示地向所有从服务器发送一个del命令,告知从服务器已经删除这个过期键
- 从服务器在执行客户端发送的读命令时,即使发现该键已经过期也不会删除该键,照常返回该键的值
- 只有从服务器接受到主服务器的del命令时,才会删除过期键