redis的过期策略以及定时器的实现

news2025/1/21 18:57:42

 Redis是客户端服务器结构的程序,客户端与服务器通过网络通信,所以对于keys *这种的操作在大型企业中不太建议,生产环境下的key会非常多,Redis是但现成的服务器,执行keys*的时间非常长,就会导致redis服务器阻塞,无法给其他客户端提供服务。如果redis(缓存)被一个key阻塞了,其他的请求会直接到数据库。

expire用途 

expire作用是给指定的 key 设置过期时间,设置的时间单位是秒,key 存活时间超出这个指定的值,就会被自动删除
使用场景:手机验证码~~该验证码,5分钟内有效~~
基于 redis 实现分布式锁为了避免出现不能正确解锁的情况通常都会在加锁的时候设置一下过期时间.(所谓的使用redis 作为分布式锁就是给 redis 里写一个特殊的 key value)

redis的过期策略: 

不能直接整体遍历key,效率非常低,

redis整体策略是:定期删除和惰性删除

  • 定期删除:每次抽取一部分进行验证过期时间。保证抽取检查过程足够快。为了避免一次性删除大量过期键导致服务器阻塞,Redis将每次执行的删除数量限制在一个较小的范围内(否则会导致redis的CPU使用率增加)。
  • 惰性删除:当客户端尝试访问一个键时,Redis会检查该键是否已过期。如果键已过期,则会立即删除该键并返回空结果。

通过惰性过期和定期过期策略的结合,Redis可以高效地管理键的过期,并保持内存的合理使用
 

 为啥不使用定时器进行过期key删除

1.redis 中并没有采取 定时器 的方式来实现过期 key 删除

2.如果有多个 key 过期,也可以通过一个定时器来高效/节省cpu的前提下来处理多个 key ~~
基于 优先级队列 或者 基于 时间轮 都可以实现比较高效的定时器~~
为啥redis没有采取这种定时器的方式呢?
猜测: 基于定时器实现,势必就要引入多线程了.
 

定时器的实现原理:

定时器是在某个时间到达后去执行某个任务;

1. 基于优先级队列/堆

自定义优先级,优先级高的先出。

在Redis的key过期场景中,过期时间越早,优先级越高,此时队首元素就是过期时间最早的,优先级最高的。此时定时器只需要分配一个线程,让这个线程检查队首元素,看是否过期。

但是这个扫描线程不能扫描的太频繁(需要节省cpu开销),可以 根据当前时间和队首过期时间设置一个等待,当时间到了再唤醒这个等待。

如果在队首元素休眠过程中,有了一个新的任务,新任务比队首元素更快过期,可以在新任务添加的过程中,唤醒刚才线程重新检查队首元素,再根据时间差重新调整阻塞时间。

2.基于时间轮实现的定时器

它可以高效地管理大量的定时任务。

时间轮是一个环形的数据结构,分为多个槽(slot)。每个槽代表一个时间间隔,槽中存放着在该时间间隔内要执行的定时任务。时间轮按照固定的时间间隔进行旋转,当时间轮旋转到当前时间所在的槽时,就触发该槽中的定时任务。

时间轮的实现流程如下:
1. 初始化时间轮,确定时间间隔和槽数量。
2. 将定时任务添加到时间轮中,计算任务应该添加到哪个槽。
3. 时间轮按照固定的时间间隔开始旋转。
4. 当时间轮旋转到当前时间所在的槽时,触发该槽中的定时任务。
5. 定时任务执行完毕后,可以选择删除任务或重新添加到时间轮中。

通过使用时间轮,定时器可以高效地管理大量的定时任务,避免了每个任务都需要单独计时的开销。同时,时间轮还可以支持动态添加和删除任务,提供了灵活性。

几个基本的通用命令具体看redis官方文档

keys: 用来查看配规则的

eyexists: 用来判定指定 key 是否存在

del: 删除指定的 key

expire: 给keg设置过期时间

ttl: 查询 key 的过期时间

type: 查询 key 对应的 value 的类型

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

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

相关文章

Linux系统-----进程管理(进程的创建与控制)

目录 前言 进程 1.基本概念 2.特征 3.Linux系统的进程 进程的创建 1. fork()函数 2. 多进程的创建与输出 进程的控制 1. exec()系列 2. wait() 函数 3. execl( )和fork( )联合使用 4. exit( ) 前言 前面我们学习了Linux系统的基本指令以及如…

软文推广中什么样的热点值得追?

只要媒体存在一日,那世界上就不会缺热点,追热点应该是每个运营er的必备技能,但是市面上的热点层出不穷,什么样的热点才值得追呢?接下来媒介盒子就和大家聊聊:判断热点值不值得追的三大要素。 一、 事件属性…

【机器学习 | 可视化】回归可视化方案

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

Redis 通用命令和数据类型

get和set get和set两个命令是最基本也是最常用的命令,主要用于操作字符串类型的数据。 1.SET 命令: SET 命令用于设置指定 key 的值。如果 key 已经持有其他值,SET 就覆写旧值,无视类型。具体的命令格式如下: SET key value例如…

在PyCharm中配置PyQt5环境

在PyCharm中配置PyQt5环境 文章目录 1.安装第三方库2.PyQt5设计器3.PyUIC转换工具 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ&#x1…

redis 内存机制探索篇

info memory 查看redis 内存使用情况出现的问题,公司在导入大量redis key 的时候,想要看一下redis 内存使用情况 ,发现used_memory_peak_perc 和 used_memory_dataset_perc 马上达到100%,这个时候很慌张,是不是当前red…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-12:内存管理)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。 注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

王道p18 04.从有序顺序表中删除其值在给定值s与1之间(要求s<1)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。(c语言代码实现)

视频讲解在这里哦(感谢支持!)👇 p18 第四题王道数据结构课后算法题(c语言代码实现)_哔哩哔哩_bilibili 本题代码如下 void deletest(struct sqlist* L, int s, int t) {int i 0;int j 0;if (s > t …

使用 graph_tool 绘制网络关系图

目标 使用python的graph_tool包,根据以下表格,生成网络关系图。 采样方法大类小类低空遥感解译地面裸土地,人工地面地面影像解译水生植物水葫芦,荷叶,苦草,黑藻,水华,水白菜RTK测量禾本植物狗牙根,华克拉莎,斑茅,苔草,芦苇,芦竹,杂茅RTK测量竹风箱树,马…

LESS的叶绿素荧光模拟实现——任意波段荧光模拟

目录 前言一、任意波段荧光模拟的实现二、需要注意的输入参数 前言 此专栏默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有一定的了解。当然,您也可以在这里下载中…

NX二次开发UF_CURVE_create_joined_feature 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_joined_feature Defined in: uf_curve.h int UF_CURVE_create_joined_feature(UF_STRING_p_t uf_curve_string, int creation_method, tag_t * joined_curve_featur…

kafka C++实现生产者

文章目录 1 Kafka 生产者的逻辑2 Kafka 的C API2.1 RdKafka::Conf2.2 RdKafka::Message2.3 RdKafka::DeliveryReportCb2.4 RdKafka::Event2.5 RdKafka::EventCb2.6 RdKafka::PartitionerCb2.7 RdKafka::Topic2.8 RdKafka::Producer(核心) 3 Kafka 生产者…

报错解决:You may need an additional loader to handle the result of these loaders.

报错信息如下 vue 项目 Module parse failed: Unexpected token (1:9) File was processed with these loaders:* ./node_modules/vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js* ./node_modules/babel-loader/lib/index.js* ./node_modules/eslint-loader/in…

OpenCV | 图像梯度sobel算子、scharr算子、lapkacian算子

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 1、sobel算子 img cv2.imread(pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow(img,img) cv2.waitKey() cv2.destroyAllWindows() pie图片 dst cv2.S…

4G5G防爆执法记录仪、防爆智能安全帽赋能智慧燃气,可视化巡检巡线,安全生产管控

随着燃气使用的普及,燃气安全问题日益突出。传统应急安全问题处理方式暴露出以下问题: 应急预案不完善:目前一些燃气企业的应急预案存在实用性不高、流程不清晰等问题,导致在紧急情况下难以迅速启动和有效执行。 部门协同不流畅…

Python将Labelme的Json标注文件进行增、删、改、查

Python将Labelme的Json标注文件进行增、删、改、查 前言前提条件相关介绍实验环境Json标注文件的增、删、改、查增代码实现输出结果 删代码实现输出结果 改代码实现输出结果 查代码实现输出结果 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精…

人机交互3——多主题多轮对话

1.主动切换 2.被动切换 3.多轮状态记忆

第二十章总结。。。

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thread…

Sui主网升级至V1.14.2版本

Sui主网现已升级至V1.14.2版本,同时Sui协议升级至31版本。其他升级要点如下所示: #14875: [修复] 为所有权限设置共识度量值。 #14811: [Narwhal] 改进每个权限的共识信息度量的可用性。 完整变更日志:Release mainnet-v1.14.2 MystenL…