zoukankan      html  css  js  c++  java
  • 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设计与实现》

  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/13470440.html
Copyright © 2011-2022 走看看