redis 过期键的删除策略
redis 删除过期键策略
定时删除:
优点:定时删除策略对内存是最友好的:通过定时器,定时删除策略可以保证布偶期间尽快的被删除,并释放过期键所占的内存
缺点:对cpu时间是最不有好的,在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分的cpu时间,在内存不紧张但是cpu时间非常紧张的情况下,将cpu时间用在删除和当前任务无关的过期键上,
无疑会对服务器的响应时间和吞吐量造成影响
惰性删除:
优点:对cpu时间最友好。
缺点:对内存不友好。
原因:惰性删除是当访问过期键是会删除改键,但是当一些键过期后再也没有被访问时。他的内存就不会被释放
当大量的过期键不在被访问,就会一直占用内存,这种情况甚至可以称之为内存泄漏,因为他们可能永远不会被删除
定期删除
描述:定期删除是对定时删除与惰性删除的整合与折中,每隔一段时间执行一次删除过期键操作,并通过限制删除执行的时长,和频率来减少对cpu时间的影响
定期删除侧率有效的减少了因为过期键带来的内存浪费。
难点:
如果定期删除操作执行的太频繁,就会退化为定时删除。
如果定期删除操作执行的太少,就会退化为惰性删除一样导致内存浪费
过期键对redis 持久化的影响
RDB 模式
写:
在使用save,bgsave是redis 会查看保存的键 是否过期如果过期将不会被保存在RDB文件里
读:
主服务器:
在redis读取RDB文件是同样会对文件里的键进行判断,如果键已经过期将忽略改键
从服务器:
在服务器载入RDB文件是不会判断改键是否过期,而是会将所有的键载入服务器里。为什么这样呢?因为在从服务器与主服务器同步时,过期键将被清除。
AOF 模式
写:
在键过期后但是还没有被删除,AOF不会因为这个键过期而产生影响,只有当过期键被删除时会向AOF添加一条del命令
例如客户端在使用get message 来访问message的值是发现改键已经过期了那么redis会有这样的操作
1.删除数据库中的message
2.向AOF里添加一条del message 命令
3.向客户端返回null
读:
没有判断,直接进行读取AOF文件中的命令读:
没有判断,直接进行读取AOF文件中的命令
AOF重写
AOF重写并不是重写AOF文件,因为AOF并不会对AOF文件进行读取,分析,写入等操作,而是根据服务器中数据库的状态来实现的
AOF重写和RDB一样的会检测键是否过期,如果过期则不会重写该键
AOF的主从模式
在该模式下过期键的删除是有主服务器控制的,如果主服务器删除改键将会向从服务器发送del key命令告知从服务器删除该键,同时将命令写入AOF文件
从服务器里的键即使过期也不会删除,而是通过接受主服务器的命令来删除。
这也是为了保证主从服务器模式下的数据一致性。