解决Reids过期方案 游标遍历清除Redis过期的key
游标遍历清除Redis过期的key
为什么要清除Redis过期的Key
Redis的过期清理是一种懒惰的清理方案,他不会过期后立刻清除,而是在Key被访问的时候进行删除,Redis这么做的目的就是为了提高性能降低资源开销。
具体来说,一个Key过期的时候,Redis不会立刻从内存中删除。相反我们客户端进行访问的时候Reids会检查当前key是否过期,如果过期就进行删除,这也就是意味着只有被访问的时候才会被删除。而不是真正的过期就立刻删除。
虽然我们的Reids会自动清除我们过期的Key,但是这个过期清除不是实时的,这个清理过程是在我们访问Key的时候,所以如果有很多Key的过期没有被访问,他们会在内存中存活一段时间,所以一些对过期Key清理要求严格的场景下需要借助其他机制和工具进行清理。
Redis自身的清除机制
读取和写入的时候
当我们读取和写入的时候我们Reids会检测是否过期,如果过期了就会在读区或写入之前将它立即删除。
定期清理
Reidis会在一定时间间隔执行清理操作,清除过期的Key,这个时间间隔有配置项hz(每秒运行周期性操作的次数)和timeout(扫描时间限制)来决定,默认情况下,每秒运行10次周期性操作。每次周期性操作就是选择一些Key,这些Key可能过期了也可能没有过期,如果过期了就删除。
懒惰清理
每次访问的时候查看这个Key是否过期,如果过期了就把他删除。
什么是游标操作或者分页操作
在Redis游标时一种用于分批处理数据的机制,当需要遍历大量数据或进行大型操作的时候Redis提供了一些分页式的便利方式,使用游标来表示当前遍历的位置,通过多次迭代获取完整的操作。
游标就是记录当前遍历的位置,一遍下一次遍历的时候从上一次停止的位置进行操作。通过游标可以有效处理大型数据集,避免一次性将所有数据加载到内存中。
在Rdis可以使用scan进行遍历操作,可以通过传递游标参数来控制遍历的位置,直到游标变成0。
使用游标的优势就是可以在遍历的过程中处理大量的数据,并且不会对Redis服务器造成过大的负担。游标可以在多个客户端之间进行共享,以支持并发遍历操作。
需要注意!!!
游标直表示当前遍历的位置,而不是一个唯一的标识符或键值。在不同的遍历中可能出现相同Key返回多次的情况,我们可以处理遍历结果进行去重进行处理。
游标遍历的缺点
1.不保证实时性
游标遍历是一个迭代的操作,通过每次返回的游标来获取下一批数据,这意味着在遍历的过程中,增加和删除都是会重复处理一些Key。
2.对Redis服务器资源的占用
游标遍历需要保持和Redis服务器的链接,而且需要持续发送命令获取下一批数据。这可能占用服务器网络宽带和处理能力,如果遍历过程中可能会持续较长时间,并且占用服务器资源。
3.潜在的性能问题
当数据集很大的时候,使用游标遍历会对我们服务器的性能产生一定的影响。每次遍历迭代都会进行网络通信和执行命令,可能会引入一定的延迟和性能的开销。
4.遍历过程中的数据变动。
Redis是一个并发数据库,遍历过程中可能会有其他客户端对Key进行修改、删除、增加操作,这会影响到我们遍历结果的一致性。
5.不适合实时查询
如果需要实时查询满足特定的条件的Key,游标遍历可能并不是最佳的选择。游标遍历睡一个逐步迭代的过程,需要遍历整个数据集才能找到满足的条件的Key。
Springboot定时任务+Redis游标处理过期Key
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class ExpiredKeyCleanupTask {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行一次任务public void cleanupExpiredKeys() {RedisConnection connection = redisConnectionFactory.getConnection();try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match("*").count(100).build())) {while (cursor.hasNext()) {byte[] keyBytes = cursor.next();String key = new String(keyBytes);if (connection.ttl(keyBytes) <= 0) {redisTemplate.delete(key);}}}}
}
- 在上述代码中,使用了
@Autowired注解将RedisTemplate和RedisConnectionFactory注入到定时任务类中。 - 使用
@Scheduled注解标记cleanupExpiredKeys方法为定时任务,并指定执行时间表达式,例如cron = "0 0 1 * * ?"表示每天凌晨1点执行任务。 - 在
cleanupExpiredKeys方法中,执行游标遍历逻辑,使用scan方法遍历 Redis 键空间,并根据ttl方法判断键是否过期,如果过期则使用delete方法删除键。 - 可根据需要调整时间表达式和其他参数,确保定时任务按预期执行。
相关文章:
解决Reids过期方案 游标遍历清除Redis过期的key
游标遍历清除Redis过期的key 为什么要清除Redis过期的Key Redis的过期清理是一种懒惰的清理方案,他不会过期后立刻清除,而是在Key被访问的时候进行删除,Redis这么做的目的就是为了提高性能降低资源开销。 具体来说,一个K…...
K8s基础10——数据卷、PV和PVC、StorageClass动态补给、StatefulSet控制器
文章目录 一、数据卷类型1.1 临时数据卷(节点挂载)1.2 节点数据卷(节点挂载)1.3 网络数据卷NFS1.3.1 效果测试 1.4 持久数据卷(PVC/PV)1.4.1 效果测试1.4.2 测试结论 二、PV、PVC生命周期2.1 各阶段工作原理…...
oracle系统查询~3
查看实例的基本信息 SQL> col host_name for a25 col instance_name for a15 col version for a15 col status for a10 set linesize 600 col host_name for a20 select instance_number,instance_name,host_name,version,startup_time,status,archiver f…...
Mybatis源码(九)— chche
Mybatis中共有三级缓存,其中一级缓存默认开启,作用范围是在sqlSession对象(同一个会话),二级缓存需要手动配置开启,作用范围是在sqlSessionFactory对象下的同一个namespace范围(所以二级缓存是可…...
回溯法--N皇后问题
N皇后问题 一、问题描述二、示例2.1 四皇后的2个可行解2.2 过程图示 三、问题分析3.1涉及到的概念递归回溯 3.2 分析 四、 代码实现4.1 实现思路宏观:微观: 4.2 递归函数NS图4.3 代码 一、问题描述 1、按照国际象棋的规则,皇后可以攻击与之处…...
ajax请求
ajax的优点 可以无需刷新页面而与服务器进行通信允许你根据用户事件来更新部分页面内容 ajax的缺点 没有浏览历史,不能回退存在跨域问题SEO不友好 get请求 <button>点击发送请求</button><div id"result"></div><script>…...
K8S系列之污点和容忍度详细分析
架构图 本篇文档主要介绍污点和容忍度的关系。 污点和容忍度 污点顾名思义就是脏的东西,给节点添加污点来限制pod调度到该节点上,如果pod可以容忍这种污点就可以被调度到有污点的节点上,如果不能容忍就不能被调度到该节点上。 污点作用于节…...
【算法】Minimum Moves to Move a Box to Their Target Location 推箱子
文章目录 Minimum Moves to Move a Box to Their Target Location 推箱子问题描述:分析代码 Tag Minimum Moves to Move a Box to Their Target Location 推箱子 问题描述: 问题 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓…...
决策引擎平台建设方案
文档修订历史 时间版本主要内容2023.05.12v1.0.0初始化 1. 概述 1.1 需求 1.1.1 需求背景 当同一个业务场景中,有非常多的业务分支后,需要有非常多的 if 判断,来承载这些简单的业务逻辑,但随着业务的发展,业务逐渐…...
SpringBoot Starter 作用及原理
本文会以 mybatis 为例,通过对比 mybatis-spring 和 mybatis-spring-boot-starter 代码示例,了解 Starter 的作用。并对 mybatis-spring-boot-starter 进行简单剖析,了解 Starter 原理。 下面还有投票,一起参与进来吧👍…...
【rust】| 05——语法基础 | 流程控制
系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 流程控制1. 条…...
解决Makefile: recipe for target ‘xxx‘ failed
author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 问题 在android编译Kernel调用makefile引起的recipe for target 很多文章写的是由于编译文件路径引起或者是makefile代码中的空格引起的 分析 但是如果makefile文件不是手动配置的而且源代码提供的,…...
小黑子—多媒体技术与运用基础知识三:数字图形图像处理技术
多媒体技术与运用3.0 多媒体系列第三章1. 颜色科学1.1 颜色的性质1.1.1 颜色的物理性质1.1.2颜色三特性1.1.3三原色与三补色 1.2 颜色空间1.2.1 与设备无关的颜色空间1.2.1 与设备相关的颜色空间 1.3 常见的多媒体系统颜色空间1.3.1 RGB颜色空间1.3.2 CMYK颜色模型1.3.3 HSB颜色…...
Nginx实现ChatGPT API代理
文章目录 一、前言说明二、前置准备三、nginx配置三、代理域名用途 一、前言说明 本篇文章可以直接用于公司生产级的使用,所需要的资源直接改为公司级的即可平替使用文章均已通过实践应用,保证文章准确性,但因不同环境的不同可能效果不一致可…...
FileNotFoundError: [Errno 2] No such file or directory: ‘dot‘
FileNotFoundError: [Errno 2] No such file or directory: ‘dot’ 在绘制树形结构图的时候出现上述报错:已安装环境为ubuntu,python3.9 解决方案: 1、在终端输入sudo apt-get install graphviz,按回车键,输入密码&a…...
【分布族谱】正态分布和二项分布的关系
文章目录 正态分布二项分布验证 正态分布 正态分布,最早由棣莫弗在二项分布的渐近公式中得到,而真正奠定其地位的,应是高斯对测量误差的研究,故而又称Gauss分布。测量是人类定量认识自然界的基础,测量误差的普遍性&am…...
7.设计模式之责任链模式
前言 责任链,即将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递, 链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。为了避免请求发送者与多个请求处理者耦合在…...
JAVA8的新特性——Stream
JAVA8的新特性——Stream 在这个深夜写下这篇笔记,窗外很安静,耳机里是《季节更替》,我感触还不是很多,当我选择封面图片的时候才发现我们已经渐渐远去,我们都已经奔赴生活,都在拼命想着去换一个活法&#…...
alias设置快捷键vim使用说明(解决服务器上输入长指令太麻烦的问题)
1. vi ~/.bashrc打开 2. (watch -n 1 gpustat 查看gpu使用情况 太麻烦)输入i进行编辑,最后一行输入 alias watchgpuwatch -n 1 gpustat alias gpuwatch -n 1 gpustat alias torch180source activate torch180 3. 按esc,然后输入:wq保存退出 4. source…...
英语基础句型之旅:从基础到高级
英语句型之旅:从基础到高级 一、起步:掌握英语基础句型 (Getting Started: Mastering Basic English Sentence Structures)1.1 英语句子的基本构成 (The Basic Components of English Sentences)1.2 五大基本句型解析 (Analysis of the Five Basic Sente…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
