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

 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.hqwc.cn/news/231284.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】101. 对称二叉树

101. 对称二叉树 难度:简单 题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出&#…

token认证机制,基于JWT的Token认证机制实现,安全性的问题

文章目录 token认证机制几种常用的认证机制HTTP Basic AuthOAuthCookie AuthToken AuthToken Auth的优点 基于JWT的Token认证机制实现JWT的组成认证过程登录请求认证 对Token认证的五点认识JWT的JAVA实现 基于JWT的Token认证的安全问题确保验证过程的安全性如何防范XSS Attacks…

Redis 基础、字符串、哈希、有序集合、集合、列表以及与 Jedis 操作 Redis 和与 Spring 集成。

目录 1. 数据类型 1.1 字符串 1.2 hash 1.3 List 1.4 Set 1.5 sorted set 2. jedis操作redis 3. 与spring集成 1. 数据类型 1.1 字符串 String是最常用的数据格式,普通的kay-value都归结为此类, value值不仅可以是string,可以是数字…

interface previously declared 的bug问题

其实就是重复定义了,只需要加如下的代码即可: 其中把APB的部分改成自己的接口名字就好了。

JS 绘制半径不一致的环形图进度条

HTML部分: <canvas id"mycanvas" width"100" height"100"></canvas>JS部分&#xff1a; const option {element: "mycanvas", // 元素count: 26, // 高亮数据totalCount: 129, // 总数据progressColor: #3266FB, // 进…

工会排队奖励模式:创新营销策略,实现共赢局面

在当今的商业环境中&#xff0c;创新营销策略的重要性日益凸显。工会排队奖励模式作为一种新型的营销策略&#xff0c;旨在通过结合线上和线下消费&#xff0c;激励消费者购买产品或服务&#xff0c;并获得返现奖励。这种模式通过将消费者的支出和商家的抽成资金纳入奖金池&…

goweb入门教程

本文是作者自己学习goweb时写的笔记&#xff0c;分享给大家&#xff0c;希望能有些帮助 前言&#xff1a; 关于web&#xff1a;本质 ​ ​ web中最重要的就是浏览器和服务器的request(请求)和response(响应)&#xff1b; ​ 一个请求对应一个响应。 一个请求对应一个响应&…

微信群发消息怎么发?如何突破200人限制?(最全攻略)

每到节假日或者各种大促节日&#xff0c;很多人都会发布或收到微信好友的节日祝福或活动通知。群发已经是很普遍的一件事了。 说到微信群发&#xff0c;大家是不是还在用微信自带的群发功能&#xff0c;或者说还在手动进行群发操作“复制粘贴”的形式进行&#xff1f; 如果好友…

传感器:探索Android中的传感器功能与使用

传感器&#xff1a;探索Android中的传感器功能与使用 一、传感器介绍1.1 Android 平台三大类传感器1.2 Android 平台支持的传感器1.3 传感器框架 二、传感器的使用2.1 识别传感器和传感器特性2.2 针对不同制造商的传感器或传感器的不同版本优化2.3 监控传感器事件2.4 处理不同的…

明确涉密测绘成果使用审批流程和责任人,未经批准,涉密测绘成果不得带离保密要害部门部位

1.单位内部涉密测绘成果使用流程规章制度&#xff1b; 2.明确责任人及岗位等文件材料&#xff1b; 3.涉密测绘成果提供使用台账。

【开发实践】使用jstree实现文件结构目录树

一、需求分析 因开发系统的需要&#xff0c;维护服务端导出文件的目录结构。因此&#xff0c;需要利用jstree&#xff0c;实现前端对文件结构目录的展示。 【预期效果】&#xff1a; 二、需求实现 【项目准备】&#xff1a; jstree在线文档&#xff1a;jstree在线文档地址 …

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

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