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

文章目录

  • 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上,并且会记录该任务还需要走一圈时间轮才能执行。时间轮每移动一个刻度,就会执行当前刻度上的任务,一个刻度上的任务可能会有多个


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中String的split函数的详解及应用

文章目录 一、 split函数详解二、应用 一、 split函数详解 split(String regex)为java.lang.String类的方法,其功能通俗的说就是以传入的分隔符参数拆分该字符串 方法具体为: public String[] split(String regex) {return split(regex, 0); }方法内部…

4.2 SSAO算法 屏幕空间环境光遮蔽

一、SSAO介绍 AO 环境光遮蔽,全程Ambient Occlustion,是计算机图形学中的一种着色和渲染技术,模拟光线到达物体能力的粗略的全局方法,描述光线到达物体表面的能力。 SSAO 屏幕空间环境光遮蔽,全程 Screen Space Amb…

MySQL与MongoDB,该如何做技术选型?

hello,大家好,我是张张,「架构精进之路」公号作者。 引言 一般情况下,会考虑到MySQL与MongoDB如何做技术选型的时候,你一定是遇到了类似于非结构化数据JSON的存取难题,否则大家都直接MySQL开始搞起了。 为什…

matlab simulink PMSM_SVPWM PI转速控制

1、内容简介 略 8-可以交流、咨询、答疑 2、内容说明 略PMSM_SVPWM PI转速控制 PMSM SVPWM PI转速控制 3、仿真分析 4、参考论文 略

电脑办公最佳拍档 夸克网盘升级低耗能备份、PDF阅读器等功能

临近年终,上班族不仅要总结过去一年的成绩还要开始制定新规划,在这个过程中整理资料是必不可少的环节。对于经常需要使用文件备份和PDF的用户,推荐大家试一下夸克网盘电脑端,升级后的“低耗能备份”和“PDF阅读器”让备份体验更丝…

面试150题做题记录

面试150题做题记录 题目1: 合并两个有序数组 题目1: 合并两个有序数组 题目:https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 最优思路:利用原有数列的单调性质,从右往左遍历&#xff…

MySQL启动后反复重新启动故障

MySQL版本为5.6.45 系统为Ubuntu 20.04 LTS 该服务器重启后,MySQL需要手动执行启动。 运行执行脚本后发现异常,如下图: 提示MySQL服务在不停重复启动。 反复使用ps -ef |grep mysql命令查看,发现mysql进程号一直在变化&#x…

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架,一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视…

redis的分布式锁

分布式锁是一种用在分布式系统中实现同步和互斥访问的机制。 1、分布式锁概念 满足分布式系统或者集群模式下,多进程可见并且互斥的锁。 分布式锁的核心思想就是让分布式集群中的节点都适用同一把锁,只要大家使用的是同一把锁,就能锁住线程…

038-第三代软件开发-简易视频播放器-自定义Slider (二)

第三代软件开发-简易视频播放器-自定义Slider (二) 文章目录 第三代软件开发-简易视频播放器-自定义Slider (二)项目介绍简易视频播放器自定义Slider (二)横向纵向 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&…

我在Vscode学OpenCV 初步接触

OpenCV是一个开源的计算机视觉库,可以处理图像和视频数据。它包含了超过2500个优化过的算法,用于对图像和视频进行处理,包括目标识别、面部识别、运动跟踪、立体视觉等。OpenCV支持多种编程语言,包括C、Python、Java等&#xff0c…

golang 实现雪花算法

雪花算法概述 snowflake 是 twitter 开源的分布式ID生成算法,其核心思想为,一个long型的ID: 41 bit 作为毫秒数 - 41位的长度可以使用69年10 bit 作为机器编号 (5个bit是数据中心,5个bit的机器ID) - 10位…

【网络知识必知必会】聊聊网络层IP协议

文章目录 前言IP 协议格式总结 前言 在之前的博文中, 我们聊过了传输层中的两个重点协议 TCP 和 UDP, 本文我们再来聊聊网络层中的一个协议IP, 简单认识一下 IP 协议格式. IP 协议与 TCP 协议的复杂度也不妨多让, 不过我们在这里只是简单的聊一聊 IP 协议的报文格式就行, 毕竟…

图书馆书目推荐数据分析与可视化

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

【Java初阶练习题】-- 循环练习题

循环练习题 1. 根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)2. 判定一个数字是否是素数3. 打印 1 - 100 之间所有的素数4. 输出 1000 - 2000 之间所有的闰年5. 输出乘法口诀表6. 求两个正整数的最大公约数7. 求出0~999之…

图数据库Neo4j概念、应用场景、安装及CQL的使用

一、图数据库概念 引用Seth Godin的说法,企业需要摒弃仅仅收集数据点的做法,开始着手建立数据之间的关联关系。数据点之间的关系甚至比单个点本身更为重要。 传统的**关系数据库管理系统(RDBMS)**并不擅长处理数据之间的关系,那些表状数据模…

滚动条默认是隐藏的只有鼠标移上去才会显示

效果 在设置滚动条的类名中写 /* 滚动条样式 */.content-box::-webkit-scrollbar {width: 0px; /* 设置纵轴(y轴)轴滚动条 */height: 0px; /* 设置横轴(x轴)轴滚动条 */}/* 滚动条滑块(里面小方块) */.…

分享一下微信小程序抽奖链接怎么做

标题:微信小程序抽奖链接制作全攻略,轻松玩转营销抽奖活动 一、引言 在当今的数字化时代,抽奖活动已经成为一种高效的市场营销策略,而微信小程序作为一个功能强大的移动端平台,为企业和个人提供了制作抽奖链接的便捷…

浅析Redis大Key | 京东云技术团队

一、背景 在京东到家购物车系统中,用户基于门店能够对商品进行加车操作。用户与门店商品使用Redis的Hash类型存储,如下代码块所示。不知细心的你有没有发现,如果单门店加车商品过多,或者门店过多时,此Key就会越来越大…

不同源安装nginx

Nginx是一款高性能的Web服务器软件。在安装Nginx时,可以选择不同的安装源。 1.官方源:在官方网站下载Nginx的源代码,然后进行编译安装。 2.EPEL源:EPEL (Extra Packages for Enterprise Linux)源是针对Red Hat、CentOS、Scienti…