redis的过期键删除策略
定时删除:为每个键设置过期时间的同时,设置一个定时器,即一过期就删除,这个方法对内存友好,但是没过期时维持大量的计时器对CPU不好
惰性删除:放任不管,用到一个键时,坚持该键是否过期,过期的话删除,否则不删除
定期删除: 每隔一段时间,对数据库进行检查,删除过期的键盘。
redis配合使用惰性和定期两种策略
RDB
执行SAVE或者BGSAVE创建一个RDB时,程序会对数据库中的键进行检查,已经过期的键不会被保存到RDB文件中,即过期键对RDB文件没有影响。 于此类似,重写AOF时候,过期键也不会被保存到重写后的AOF文件中
启动redis时,若是服务器启用了RDB,服务器将会载入RDB文件。
如果服务器以主服务器的方式进行运行,过期键会被删除;若是以从服务器方式运行,即使过期也会载入
AOF
服务器以AOF方式运行时,若是有还没被删除的过期键,也不会对AOF有影响,当该键被删除时,会向AOF追加一条DEL,显示记录该键已被删除
若是访问过期键message(get message),服务器会执行以下三个动作:
- 首先删除message
- 追加一条DEL命令到AOF
- 向执行get命令的服务器返回一条空回复
复制
当服务器运行在复制模式下,从服务器当且仅当收到主服务器的DEL才会删除过期键。主服务器在删除一个过期键会给所有的从服务器发送一个DEL命令。
RDB && AOF
两个redis命令会生成RDB文件,SAVE 和 BGSAVE.SAVE会阻塞服务器,生成RDB文件的过程中服务器啥都不能干。BGSAVE则是子进程创建rdb,父进程可以继续执行别的命令。
RDB阻塞命令,AOF消耗内存
rdb文件是在服务器启动时自动进行的,开启了AOF的话,优先使用AOF
rdb持久化主要是保存键值对到rdb文件中,AOF持久化则主要是保存写命令