【Redis】redis的过期策略如何实现有关定时器的补充

news2025/7/20 14:16:48

文章目录

  • redis的过期策略如何实现
  • 关于定时器的补充
    • 基于优先级队列/堆实现的定时器
    • 基于时间轮实现的定时器

redis的过期策略如何实现

注意:不能直接遍历所有的key来判断当前key是否过期,这样子效率非常低,redis整体策略是:定期删除和惰性删除

  • 定期删除:每次抽取一部分进行验证过期时间。保证抽取检查过程足够快。为了避免一次性删除大量过期键导致服务器阻塞,Redis将每次执行的删除数量限制在一个较小的范围内。
    • 对于定期删除的时间有明确的要求,因为redis是单线程程序,如果扫描过期key消耗的时间太多,就可能导致正常处理请求的命令被阻塞
  • 惰性删除:假设这个key已经到了过期时间了,但是暂时还没有删除它,这个key还存在,当客户端尝试访问一个键时,Redis会检查该键是否已过期。如果键已过期,则会立即删除该键并返回空结果(nil)。

通过惰性过期和定期过期策略的结合,Redis可以高效地管理键的过期,并保持内存的合理使用,并且还提供了一系列的内存淘汰策略


注意:redis当中并没有采用定时器的方式来实现过期key的删除,因为如果基于定时器来实现,可能要引入多线程,不符合redis单线程执行流的初衷

关于定时器的补充

redis并没有采取下述的两种定时器方案,但是下述两种都是属于高效的定时器的实现方式

定时器:在某个时间到达之后,执行某些特定的任务

基于优先级队列/堆实现的定时器

优先级队列:按照指定的优先级先进先出,在redis过期key的场景中,可以通过 “过期时间越早,优先级越高”

例子:假设有很多key设置了过期时间,就可以把这些key加入到一个优先级队列当中,指定优先级规则是过期时间早的先出队列,此时队头元素就是最早的要过期的key,此时定时器当中只要分配一个线程,让这个线程去检查队首元素,查看是否过期即可,如果队头元素都没有过期,那么后续元素一定没有过期

注意:

1.扫描线程不需要遍历所有的key,只需要盯住队头元素即可,如果队头元素没有过期,那么后续元素一定没有过期

2.扫描线程检查元素过期时间也不能太频繁,可以根据当前时刻和队头元素的过期时间的差值设置一个等待时间,当时间差不多到了的时候,系统再去唤醒这个扫描线程。此时扫描线程不需要高频扫描队头元素,把CPU的开销也节省下来了

3.但是如果在线程休眠的时候来了一个新任务,该新任务可能过期时间比较早,此时可以在新任务添加的时候,唤醒一下扫描线程,重新检查队头元素,再根据时间差距重新调整阻塞时间


基于时间轮实现的定时器

时间轮算法是通过一个时间轮去维护定时任务,按照一定的时间单位对时间轮进行划分刻度。然后根据任务延时计算任务落在该时间轮的第几个刻度上,如果任务时长超出了刻度数量,则需要增加一个参数记录时间轮需要转动的圈数

优点:实现相对简单

缺点:是无法精确、准时地执行定时任务,只能是近似执行`


时间轮结构

image-20231025101846417

时间轮类似于一个时钟,它和时钟一样是有刻度的,每个刻度大小可以是100ms也可以是1ms,上图的时间轮有6个刻度,每个刻度大小是100ms,也就是每过100ms会顺时针移动一个刻度,走完一圈需要600ms

工作原理:每往时间轮提交一个延时任务,会判断该任务的执行时间要放在哪个刻度上,比如在时间轮启动后的第100ms,提交了一个延时400ms执行的任务,那么该任务应该放在刻度5上,如果提交了一个延迟700ms执行的任务,那么该任务会放在刻度2上,并且会记录该任务还需要走一圈时间轮才能执行。时间轮每移动一个刻度,就会执行当前刻度上的任务,一个刻度上的任务可能会有多个


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

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

相关文章

系列十五、idea全局配置

一、全局Maven配置 IDEA启动页面>Customize>All settings>Build,Execution,Deployment>Build Tools>Maven 二、全局编码配置 IDEA启动页面>Customize>All settings>Editor>File Encodings 三、全局激活DevTools配置 IDEA启动页面>Customize>A…

企业通过ISO/IEC 27001的必要性阐述

文章目录 什么是ISO 27001?ISO 27001认证的必要性1,保护信息资产2,合规性要求3,提高客户信任4,降低安全风险5,提高内部效率6,改进供应链安全7,提高员工意识8,连续改进 推荐阅读 什么…

二叉树问题——前中后遍历数组构建二叉树

摘要 利用二叉树的前序,中序,后序,有序数组来构建相关二叉树的问题。 一、构建二叉树题目 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 889. 根据前序和后序遍历构造二叉树 617. 合并二叉树 226. 翻转二…

Hadoop相关知识点

文章目录 一、主要命令二、配置虚拟机2.1 设置静态ip2.2 修改主机名及映射2.3 修改映射2.4 单机模式2.5 伪分布式2.6 完全分布式 三、初识Hadoop四、三种模式的区别4.1、单机模式与伪分布式模式的区别4.2、特点4.3、配置文件的差异4.3.1、单机模式4.3.2、伪分布式模式4.3.3、完…

JVM虚拟机:堆结构的逻辑分区

堆内存的逻辑分区 堆内存的逻辑分区如下所示: 堆内存中分为新生代和老年代,二者空间大小1:3。在新生代里面分为两类区域(eden、survivor),三个区域(eden、survivor、survivor),三个区大小比例为8:1:1。 对象存放的位置 栈 当我们new一个对象的时候,首先会将对象…

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】

一、网关简介 大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用。 这样的架构,会存在着诸多…

我在Vscode学OpenCV 处理图像

既然我们是面向Python的OpenCV(OpenCV for Python)那我们就必须要熟悉Numpy这个库,尤其是其中的数组的库,Python是没有数组的,唯有借助他库才有所实现想要的目的。 # 老三样库--事先导入 import numpy as np import c…

高性能消息中间件 - Kafka3.x(二)

文章目录 高性能消息中间件 - Kafka3.x(二)Kafka生产者⭐生产者发生原理⭐RecordAccumulator源码简单分析⭐Java Api生产者的重要参数⭐环境准备创建一个名为java-api-test的topic主题⭐命令行开启一个consumer消费者监听名为java-api-test的topic⭐pom.…

5、QtCharts 曲线美化

文章目录 效果ui 设置dialog.hdialog.cpp 效果 ui 设置 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QtCharts> #include <QLineSeries> #include <QGraphicsScene> #include <QTimer> #include <QSplineSerie…

陕西某小型水库雨水情测报及大坝安全监测项目案例

项目背景 根据《陕西省小型病险水库除险加固项目管理办法》、《陕西省小型水库雨水情测报和大坝安全监测设施建设与运行管理办法》的要求&#xff0c;为保障水库安全运行&#xff0c;对全省小型病险水库除险加固&#xff0c;建设完善雨水情测报、监测预警、防汛道路、通讯设备、…

如何有效使用蜂邮EDM和vba批量发送邮件?

蜂邮EDM和vba批量发送邮件的方法&#xff1f;怎么使用蜂邮EDM和vba代码群发电子邮件&#xff1f; 批量发送邮件已经成为一种不可或缺的沟通方式。蜂邮EDM和VBA是两个功能强大的工具&#xff0c;可以帮助您在邮件营销和业务通信中实现高效的批量发送邮件操作。接下来将介绍如何…

关于Goby反制上线CS中的各种问题

前言 ​ Goby作为新一代网络安全技术&#xff0c;通过为目标建立完整的资产数据库&#xff0c;实现快速的安全应急&#xff0c;日常为广大师傅提供了便捷的渗透体验。最近有观察到有关于某些蜜罐出现了Goby反制的指纹&#xff0c;顿时就起了兴趣进行研究Goby的反制&#xff0c…

AIGC究竟是什么?为什么今年大家都在讨论?

目录 一、什么是AIGC 二、AIGC发展阶段 三、AIGC的技术应用 AIGC的应用场景 四、AIGC的伦理、风险与未来 五、说在最后 在23年初&#xff0c;大家的视野范围内突然出现了一种叫ChatGPT的产品&#xff0c;这是由OpenAI研发的一种基于深度学习和自然语言处理技术的文本生成…

SpringBoot_mybatis-plus使用json字段

mybatis-plus使用json字段 1.前言2.方案分析2.1 为什么是json2.2 数据库的选择 3. 实战3.1 使用text字段(h2数据库)3.1.1 建表语句3.1.2 数据操作与查询 3.2 使用json字段(mysql数据库)3.2.1 建表语句3.2.2 数据操作与查询 4. 附录4.1 MySQL JSON索引用法 5. 参考文档 1.前言 …

无需服务器内网穿透Windows下快速搭建个人WEB项目

&#x1f4d1;前言 本文主要是windows下内网穿透文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

今日温馨早安问候语,祝大家平安健康早安吉祥

用清晨的阳光沐浴&#xff0c;给你舒展;用清新的空气洗漱&#xff0c;给你舒心;伴清莹的雨露散步&#xff0c;给你舒情;向美好的一天欢呼&#xff0c;给你舒怀&#xff0c;用快乐的词汇凝聚&#xff0c;给你祝福&#xff0c;祝你在绚丽的晨光中走好每一天。朋友&#xff0c;早安…

算法升级之路(六)

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]] 解题思路&…

中国教育企业出海 新兴技术助力抢占先机

继游戏、电商、短视频等领域轮番出海之后&#xff0c;国内教育企业纷纷开启了出海之路。近日发布的《2023年教育应用出海市场洞察》报告显示&#xff0c;在中国教育企业出海市场中&#xff0c;语言学习是最主要的赛道&#xff0c;但赛道竞争更为激烈。 报告指出&#xff0c;全…

高性能消息中间件 - Kafka3.x(三)

文章目录 高性能消息中间件 - Kafka3.x&#xff08;三&#xff09;Kafka Broker ⭐Kafka Broker概念Zookeeper&#xff08;新版本可以不使用zk了&#xff09;⭐Zookeeper的作用 Kafka的选举1&#xff1a;Broker选举Leader⭐Broker核心参数⭐案例&#xff1a;服役新节点和退役旧…

多测师肖sir_高级金牌讲师_jmeter 反向代理录制脚本

jemeter自带的录制脚本功能&#xff0c;是利用代理服务器来进行录制的 1&#xff0c;新建一个线程组 2&#xff0c;新建一个代理服务器 右击工作台-添加-非测试元件-http代理服务器 3&#xff0c; 配置http代理服务器 端口&#xff1a; 默认为8888&#xff0c;可修改。但…