暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis过期键判定及处理

董源龙 2021-09-29
467

过期删除策略

    定时删除

        内存友好。定时器定时删除,释放键占用内存

        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命令才会删除键,即使键过期也不会主动删除




文章转载自董源龙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论