Redis——》过期删除策略

news2024/11/26 20:27:21

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

Redis——》过期删除策略

  • 一、过期删除策略
    • 1、定时删除
    • 2、惰性删除
    • 3、定期删除
  • 二、Redis过期删除策略
    • 1、定期删除
      • (1)设置执行时间间隔
      • (2)执行过程
    • 2、惰性删除
  • 三、RDB对过期键的处理(开启RDB持久化)
    • 1、生成RDB文件
    • 2、载入RDB文件
      • (1)如果服务器以主服务器模式运行
      • (2)如果服务器以从服务器模式运行
  • 四、AOF对过期键的处理(开启AOF持久化)
    • 1、AOF文件写入
    • 2、AOF文件重写
  • 五、复制功能对过期键的处理

一、过期删除策略

策略定时删除惰性删除定期删除
描述设置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

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命令后,才会删除过期键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信交易dll接口怎么实现程序化交易?

现在很多交易者选择量化投资与传统的股票交易之间,往往会选择自动化交易跟量化交易的比较多,毕竟现在很多可以开发出来的交易软件都具备了量化的特点,能够及时的把握更多的盈利的机会,就比如说常使用的到通达信交易dll接口就是一个…

LeetCode | 850. 矩形面积 II

我们给出了一个(轴对齐的)二维矩形列表 rectangles 。 对于 rectangle[i] [xi1, yi1, xi2, yi2], 表示第 i 个矩形的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。 计算平面中所有 rectangles…

java maven pom application 生产prod/开发dev/测试test

前言 pom 和 application.properties(application.yml)里的定义的环境不太一样, pom 是maven对应的配置文件,编译阶段使用 application.properties(application.yml) 是Spring配置文件,程序运行阶段使用 POM pom文…

每次打开百度太麻烦?用程序直接打开网页 Python实现百度划词搜索功能(获取剪切板数据)

浏览顺序实现划词功能运行错误解决问题转载声明实现划词功能 说是划词翻译,实际上我们是通过获取用户的剪切板内容,通过一系列的操作得到的。首先呢,我们就先实现如何获取剪切板内容的程序 首先先在桌面创建一个文件夹,命名为“…

pac自动代理

文章目录1.pac 定义2. 参考配置地址3. 实际配置案例3.1 编写pac文件3.1.1 return 语句有三种指令:3.1.2 内置函数3.1.2.1 dnsDomainIs3.1.2.2 shExpMatch3.1.2.3 isInNet3.1.2.4 主机ip3.1.2.5 dnsResolve3.1.2.6 isPlainHostName3.1.2.7 isResolvable3.1.2.8 dnsDo…

RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码

目录 第十章-RabbitMQ之Spring客户端源码 1. 前言 2. 客户端消费代码 2.1 消费的实现方式 2.2 消费中注解解释 2.3 推测Spring实现过程 3.MQ消费源码分析 3.1 集成SpringBoot 启动过程 3.2 Broker投递消息给客户端过程 3.3 客户端消费过程 4. 总结 第十章-RabbitMQ之S…

【Linux】线程安全

文章目录1.线程互斥1.1.线程间互斥的相关概念1.2互斥量1.3互斥量接口1.4互斥量实现原理2.可重入VS线程安全3.常见锁概念3.1死锁3.2常见死锁情况3.2.1情况一:忘记释放锁3.2.2情况二:线程重复申请锁3.2.3情况三:双线程多锁申请3.3锁的相关概念4…

m在VBLAST协作MIMO系统分部使用LDPC,Turbo,卷积三种信道编译码进行误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 从上面的结构可知,整个卷积编码的结构可由CRC校验,卷积编码,打孔组成,其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。 …

一种在行末隐藏有效载荷的新供应链攻击技术研判

近期,Phylum检测到数十个新发布的Pypi软件包执行供应链攻击,在这些软件包中,通过隐藏的__import__将窃取程序投递到开发人员的机器上。攻击者利用代码审核者所使用IDE默认的不换行代码显示设置隐藏自身的行为与载荷,本文将就其中出…

栈简介、手写顺序栈、手写链栈和栈的应用

一. 简介 1. 什么是栈? 栈是一种只能从表的一端存取数据且遵循 "先进后出"("后进先出") 原则的线性存储结构。栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构。 C#中提供顺序栈:Stack&…

【MySQL基础】如何安装MySQL?如何将MySQL设置成服务?

目录 一、MySQL的安装 1、解压配置 2、步骤安装 💟 创作不易,不妨点赞💚评论❤️收藏💙一下 一、MySQL的安装 MySQL的安装有两种方式:解压配置和步骤安装 1、解压配置 需提前从官网直接下载压缩包,进…

【MySQL篇】第二篇——库的操作

目录 创建数据库 创建数据库案例 字符集和校验规则 查看系统默认字符集以及校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库删除 备份和恢复 备份 还原 注意事…

常见磁盘调度算法总结

磁盘调度算法📖1. 最短寻道时间优先(SSTF)📖2. 电梯算法(SCAN或C-SCAN)📖3. 最短定位时间优先(SPTF)📖4. 总结由于IO的高成本,操作系统在决定发送…

C语言 0 —— 计算机硬件架构及信息在计算机中的表示

当前的计算机系统,如Window ,Linux,Mac 基本都是基于冯诺依曼的驱动架构设计的。 冯诺依曼架构输入设备先输入公式,给运算器,运算器先算 先算2*5 ,临时放在CPU内部寄存器中,寄存器不够用的时候会…

vscode插件开发(四)Webview(1)

上一篇详细讲解了命令,这回我们一起来看一下Webview。vscode的插件其实可以分为两种,一种是webview插件,另一种是非webview插件。 webview插件的自由度很高,可以满足开发者的各种定制化的要求;而非webview插件只能使用…

我悟了!Mysql事务隔离级别其实是这样!

问题描述 ​ 最近几天在忙项目,有个项目是将业务收集到的数据变动,异步同步到一张数据表中。在测试的过程时,收到QA的反馈,说有订单的数据同步时好时坏。我怀着疑惑的表情打开了那段代码,它的逻辑大概是这样的&#x…

Zookeeper实现分布式锁的原理。

之前学习Redis时候,我们利用Redis实现了分布式锁。 黑马点评项目Redis实现分布式锁_兜兜转转m的博客-CSDN博客 为什么提出了分布式锁的概念呢? 因为在单体项目中,锁是基于JVM虚拟机实现的,在分布式情况下,JVM就不唯…

FullGC频繁,线程数持续增长排查

告警 线上应用fullgc频繁,收到告警 GC监控—堆内存不足 查看近12小时的监控,发现Survivor区一直处于 满状态、fullgc非常频繁、但没有内存溢出的现象,很明显是堆内存不足 GC日志分析—暂停时间并不长 因为fullgc相当频繁,抽…

项目管理(知识体系概述)

项目的定义:为创造独特的产品、服务或者成果进行的临时性工作。 项目的特性:1、独特的产品、服务、成果;2、临时性工作。 项目管理的目的(为了解决什么问题): 1、达成业务目标 2、满足相关方期望 3、提供项目的可预测性 4、提高项目的成果性。 5、在适当的时刻交付…

机器人运动学标定:基于考虑约束的指数积的运动学标定方法——只需要测量位置,避免冗余约束

文章目录写在前面为什么要消除归一化和正交化操作?只用位置而不是位姿去做标定的原因基于消除冗余约束步骤的参数辨识模型分析参考文献写在前面 基于指数积的运动学标定方法介绍: 机器人运动学标定:基于指数积的串联机构运动学标定 机器人运…