• Redis——》过期删除策略


    推荐链接:
        总结——》【Java】
        总结——》【Mysql】
        总结——》【Redis】
        总结——》【Spring】
        总结——》【SpringBoot】
        总结——》【MyBatis、MyBatis-Plus】

    一、过期删除策略

    策略定时删除惰性删除定期删除
    描述设置key过期时间时,创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。当需要key时,首先检查是否过期,如果过期就删掉,反之返回值。每隔一段时间,对key进行检查,删除里面过期的key。
    优点对内存最友好对cpu最友好对内存友好
    对cpu友好
    缺点对cpu不友好对内存不友好难以确定删除操作执行的时长和频率

    1、定时删除

    • 优点:对内存最友好(key只要过期就能立即从内存中删除)
    • 缺点:对CPU最不友好(在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响)

    2、惰性删除

    • 优点:对 CPU最友好(只在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查)
    • 缺点:对内存不友好(如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放,从而造成内存泄漏)

    3、定期删除

    • 优点:通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响,也能有效释放过期键占用的内存。
    • 缺点:

    1)难以确定删除操作执行的时长和频率

    如果执行频率高:和定时删除一样,对CPU不友好
    如果执行频率低:和惰性删除一样,对内存不友好

    2)在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是个严重的错误

    二、Redis过期删除策略

    Redis的过期删除策略 = 惰性删除 + 定期删除

    过期删除策略处理方式实现函数描述
    惰性删除零散db.c/expireIfNeeded当key被访问时,调用函数检查key是否过期,如果过期则删除,否则继续执行实际命令
    定期删除集中redis.c/activeExpireCycle每隔一段时间,随机检查设置了过期的key并删除已过期的key

    1、定期删除

    Redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。

    (1)设置执行时间间隔

    # 每秒执行次数
    hz 10
    
    # 默认值:10
    # 取值范围:1~500,建议不超过100,只有在请求延时非常低的情况下可以将值提升到100
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Q:单线程的redis,如何知道要运行定时任务?
    A:Redis 的定时任务会记录在一个称为最小堆的数据结构中。这个堆中,最快要执行的任务排在堆的最上方。在每个循环周期,Redis 都会将最小堆里面已经到点的任务立即进行处理。处理完毕后,将最快要执行的任务还需要的时间记录下来,这个时间就是接下来处理客户端请求的最大时长,若达到了该时长,则暂时不处理客户端请求而去运行定时任务。

    (2)执行过程

    Redis 默认会每秒进行10次过期扫描,但并不是遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

    1. 从过期字典中随机 20 个 key;
    2. 删除这 20 个 key 中已经过期的 key;
    3. 如果过期的 key 比率超过 1/4,那就重复步骤 1。

    为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

    2、惰性删除

    在这里插入图片描述

    三、RDB对过期键的处理(开启RDB持久化)

    1、生成RDB文件

    持久化命令:save、bgsave
    程序会对数据库中的键进行检查,未过期键会保存到RDB文件,已过期键则忽略。

    2、载入RDB文件

    (1)如果服务器以主服务器模式运行

    程序会对文件中的键进行检查,未过期键会被载入到数据库中,过期键则忽略。

    (2)如果服务器以从服务器模式运行

    文件中的所有键,不论是否过期,都会被载入到数据库中。(过期键会通过与主服务器同步而删除)

    四、AOF对过期键的处理(开启AOF持久化)

    1、AOF文件写入

    持久化命令:rewriteaof 、bgrewriteaof
    当过期键被惰性删除或者定期删除后,程序会向AOF文件追加一条DEL命令,显式记录该键已被删除。

    Q:客户端访问已经过期的键,服务器如何处理?
    A:服务器将执行以下3个动作:

    1、从数据库中删除该键
    2、追加一条DEL命令到AOF文件
    3、向客户端返回空

    2、AOF文件重写

    程序会对数据库中的键进行检查,未过期键会保存到重写后的AOF文件,过期键则忽略。

    五、复制功能对过期键的处理

    在主从复制模式下,从服务器的过期键删除动作由主服务器控制

    • 主服务器在删除一个过期键后,会显式地向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键。
    • 从服务器在执行客户端发送的读命令时,即使发现该键已过期也不会删除该键,照常返回该键的值。
    • 从服务器只有接收到主服务器发送的DEL命令后,才会删除过期键。
  • 相关阅读:
    CMake 坑之添加文件后不修改CMakeList.txt,则文件加不进来
    PercentRatingBar-百分比评分控件
    【字符串匹配讲解 】
    计算机竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python
    实用调试技巧
    CSS 盒子模型(Box Model) | 青训营笔记
    喜报 | 2023上海文创资金拟支持名单公布,优积科技上榜
    master theorem公式推导
    62. 不同路径
    【工具软件】mediamtx——网页、vue3项目中播放 rtsp 视频流(支持265转码)
  • 原文地址:https://blog.csdn.net/weixin_43453386/article/details/127984743