过期删除策略
定时删除
内存友好。定时器定时删除,释放键占用内存
cpu不友好,键值较多占用cpu时间
主动删除
Redis实现:
由db.c/expireIfNeeded函数实现。所有读写命令都会调用expireIfNeeded函数对输入键进行检查
惰性删除
内存不友好
cpu友好
被动删除
放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除
折中方案
每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定
主动删除
Redis通过redis.c/activeExpireCycle实现,分批次(current_db)从库中取出一定数据随机键,删除过期键
流程:
redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用。在规定时间内,分多次遍历服务器中各个数据库。从expireszi 字典中随机检查部分键过期时间,删除其中的过期键。
current_db记录当前进度,下次继续。eg:本次扫描到db10,current_db=10,下次db11.待全部全扫一遍。current_db=0。
RDB对过期键的处理
生成RDB文件
主服务器生成文件对键值进行检查。若过期则忽略
从服务器生成文件不会对键值进行检查。直接生成文件
载入RDB文件
主服务器载入文件对键值进行检查。
从服务器载入文件不会对键值进行检查。
AOF对过期键值的处理
AOF写入
键值被删除后。追加一条删除命令
AOF重写
若键已过期,会忽略写入
复制对过期键的处理
主服务器向所有从服务器发送DEL命令
从服务器只有在收到DEL命令才会删除键,即使键过期也不会主动删除