• Redis(六)——过期删除策略


    1.设置过期时间

    redis可以通过4种指令设置键的生存时间

    • expire key seconds 设置多少秒过期
    • pexpire key milliseconds 设置多少毫秒过期
    • expireat key timestamp 设置过期的秒时间戳
    • pexpireat key timestamp 设置过期的毫秒时间戳

    无论单位如何,最后都是转换成pexpireat命令来实现过期

    2.记录

    expires过期字典保存了所有键的过期时间

    • 过期字典的键是一个指针,指向键空间(数据库级别的属性,指向保存的键值对)的某个键
    • 过期字典的值是long long类型的整数,用于保存毫秒精度的unix时间戳

    3.移除过期时间

    persist key 

    4.判断是否过期

    • 检查给定键是否在过期字典是否存在,如果存在则获取过期时间
    • 检查当前UNIX时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则未过期

    5.过期键删除策略

    (1)定时删除:过期就马上删除。节省CPU内存,占用太多CPU时间(花费时间时刻盯着哪个键即将过期),影响服务器的响应时间和吞吐量。

    (2)惰性删除:过期不删除,被访问才删除。浪费CPU内存存储,不花费CPU时间去删除,大量无用数据堆积在数据库中。

    • 具体由db.c/expireIfNeeded函数实现,所有读写数据库的redis命令在执行之前都会调用该函数检查键是否过期:如果键已过期,则删除键;否则不改动。
    • 读写数据库的redis命令必须能实现 键不存在 和 键存在以及是否过期 几种情况。

    (3)定期删除:对时间空间的折中方案,每隔一段时间执行一次过期键删除操作,至于什么时候删除、多久删除一次根据具体情况合理设置。

    • 具体由redis.c/activeExpireCycle函数实现,每当redis的周期性操作redis.c/serverCron函数执行时都会调用。在规定时间内,分多次遍历服务器中的各个数据库,从expires过期字典随机检查一部分键的过期时间,并删除其中的过期键。

    redis服务器实际使用的是惰性删除和定期删除两种策略。

    6.RDB对过期键的处理

    • 生成RDB文件时直接忽略掉过期的键
    • 载入RDB文件时,主服务器不会保存过期键,从服务器保留所有键

    7.AOF对过期键的处理

    (1)如果客户端访问没有被删除的过期键,则执行顺序如下

    • 从数据库中删除过期键
    • 追加一条删除命令进AOF文件
    • 向客户端返回空

    (2)AOF重写不会保存过期的键

    8.主从复制对过期键的处理

    • 主服务器删除一个过期键后,会通告所有从服务器发送一个del命令,让所有从服务器删除过期键
    • 从服务器执行读指令时,遇到没有删除的过期键,依旧会返回一个值,也不会删除,当做未过期键一样处理;从服务器只有等主服务器发来del命令才会删除

     


     参考&引用

    《redis设计与实现》

  • 相关阅读:
    大数据的前景?
    PriorityBlockingQueue深度解析(好文)
    深入CAS原理
    common-lang3工具类-使用手册
    gitlab搭建
    RestTemplate转码bug
    论tigergraph边的方向性
    关于java的wait方法的深入分析
    openjdk的源码下载方式
    一个奇怪的urlencode转码问题
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/13470440.html
Copyright © 2020-2023  润新知