当前位置: 首页 > news >正文

【bugfix】解决Redis缓存键清理问题

前言

在Spring Boot应用中集成Redis作为缓存存储时,合理配置RedisTemplate是确保数据正确存储和检索的关键。本文将通过对比分析一段初始存在问题的Redis配置代码及其修正后的版本,探讨如何正确处理Redis键前缀,以避免清理缓存时遇到的问题。

初始问题代码

// 省略了注释和包声明以聚焦关键代码
private static class KeySerializer extends StringRedisSerializer {private final String keyPrefix;public KeySerializer(String redisKeyPrefix) {if (isNotEmpty(redisKeyPrefix)) {keyPrefix = redisKeyPrefix + "::";} else {keyPrefix = "";}}@Overridepublic String deserialize(byte[] bytes) {String key = super.deserialize(bytes);return keyPrefix + key;}// serialize 方法省略以聚焦问题
}

问题分析

该段代码存在的问题是,在deserialize方法中直接将键前缀添加到了解序列化得到的键值上。这意味着,当从Redis中获取键值对时,会将已经存在于键中的前缀再次添加,导致实际使用的键与存储时的键不一致,进而影响到后续的缓存管理和清理操作,比如使用KEYS命令或者CacheEvict注解进行清除时,可能因为键名不匹配而无法正确清理缓存。
在执行缓存清理操作时,由于反序列化Key时错误地再次添加了前缀,系统无法正确识别并定位到实际的Redis Key,进而导致清理操作失效。

修正方案

修正后的代码如下,重点在于调整了deserialize方法的逻辑,确保正确地去除前缀而非重复添加。

private static class KeySerializer extends StringRedisSerializer {private final String keyPrefix;public KeySerializer(String redisKeyPrefix) {if (isNotEmpty(redisKeyPrefix)) {keyPrefix = redisKeyPrefix + "::";} else {keyPrefix = "";}}@Overridepublic String deserialize(byte[] bytes) {String s = bytes == null ? null : new String(bytes);if (StringUtils.isBlank(s)) {return s;}int index = s.indexOf(keyPrefix);if (index != -1) {return s.substring(keyPrefix.length());}return s; // 如果没有找到前缀,则原样返回}// serialize 方法保持不变
}

解决方案分析

  • 修正deserialize方法:在解序列化时,首先检查键是否以设定的前缀开始,如果是,则移除前缀后再返回。这样确保了从Redis读取的键值能准确匹配到业务逻辑中使用的键。
  • 保持键值一致性:通过在序列化和反序列化过程中统一处理键前缀,确保了存入和取出的键值对在结构上保持一致,从而解决了清理缓存时的键名不匹配问题。
  • 在修正后的版本中,deserialize方法首先检查获取到的字符串是否包含前缀,如果是,则移除该前缀再返回Key,确保了当从Redis检索Key用于匹配或删除时,能够正确无误地识别每一个Key。

总结

在Spring Boot应用中配置Redis作为缓存服务时,正确处理键的序列化和反序列化至关重要。通过上述案例的对比分析,我们了解了不当处理键前缀可能导致的问题及其实现上的修正策略。修正后的代码确保了Redis缓存的键值在序列化与反序列化过程中的精确匹配,有效避免了缓存清理时可能遭遇的障碍,提升了应用的稳定性和运维效率。在进行类似配置时,务必注意此类细节处理,以保证系统的健壮性和易维护性。

相关文章:

【bugfix】解决Redis缓存键清理问题

前言 在Spring Boot应用中集成Redis作为缓存存储时,合理配置RedisTemplate是确保数据正确存储和检索的关键。本文将通过对比分析一段初始存在问题的Redis配置代码及其修正后的版本,探讨如何正确处理Redis键前缀,以避免清理缓存时遇到的问题。…...

泛微开发修炼之旅--15后端开发连接外部数据源,实现在ecology系统中查询其他异构系统数据库得示例和源码

文章链接:15后端开发连接外部数据源,实现在ecology系统中查询其他异构系统数据库得示例和源码...

弹幕逆向signature、a_bogus

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许可禁止转载&a…...

jEasyUI 使用标记创建树形菜单

jEasyUI 使用标记创建树形菜单 jEasyUI 是一个基于 jQuery 的用户界面插件库,它提供了一系列的组件,用于快速构建网页用户界面。其中,树形菜单(Tree Menu)是 jEasyUI 提供的一个非常实用的组件,它可以帮助…...

IT人的拖延——拖是因为不想离开“舒适区”?

人都是求“稳”的,在一个区域内呆了很久,也很舒适了,如果冒险离开进入未知的区域,万一结果不好怎么办?万一自己不适合怎么办?万一这个区域有着自己难以忍受的东西怎么办?这些对未知区域的恐惧感让我们在面对应该要做的事情时,不自觉地又拖延了起来。比如,我们在面临需…...

JUnit 5学习笔记

JUnit 5 学习笔记 1.JUnit5的改变2.JUnit5常用注解及测试2.1 DisplayName/Disabled/BeforeEach/AfterEach/BeforeAll/AfterAll2.2 Timeout2.3 RepeatedTest 3.断言3.1 简单断言3.2 数组断言3.3 组合断言3.4 异常断言3.5 超时断言3.6 快速失败 4.前置条件5.嵌套测试6.参数化测试…...

西格玛 ------ 第18个希腊字母学习

名词解释 在数学中,我们把∑作为求和符号使用,用小写字母σ,表示标准差。 ∑符号表示求和,读音为sigma,英文意思为Sum,Summation,汉语意思为“和”“总和”。 例1 公式使用说明:…...

【C语言】assert.h——断言

文章目录 主要内容调试和发布模式使用示例用法总结与注意事项 断言是一种用于在程序执行过程中进行调试的工具,能够帮助开发者验证程序的某些假设是否为真。如果断言失败,程序会终止,并输出一个错误消息,通常包含出错的文件名和行…...

HTML静态网页成品作业(HTML+CSS)—— 零食商城网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…...

虚函数机制-动态绑定的应用

虚函数使得程序在运行的时候根据指针指向对象的类型来确定调用哪个函数。 下图中:都为静态绑定。因为在编译器就确定了可以调用的函数 此时当基类指针指向派生类对象时,因为没有virtual关键字,所以在编译阶段就根据指针类型确定了要指向的函…...

MOS开关电路应用于降低静态功耗

本文主要讲述MOS开关电路的应用,过了好久突然想整理一下,有错误的地方请多多指出,在做电池类产品,需要控制产品的静态功耗,即使让芯片进入休眠状态,依旧功率很大,所以在电路中加一组软开关,防止…...

【每日刷题】Day65

【每日刷题】Day65 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. LCR 175. 计算二叉树的深度 - 力扣(LeetCode) 2. 序列找数_牛客题霸_牛客网…...

Oracle数据库连接并访问Microsoft SQL Server数据库

Oracle数据库连接并访问Microsoft SQL Server数据库 说明:  1.实际开发中,Oracle数据库与SQLServer数据库之间可能需要相互进行访问,方便业务数据抽取,编写视图及表等操作。  2.SQLServer访问Oracle数据库配置相对较为简单&…...

SQL 入门教程

SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系数据库管理系统的编程语言。它被设计用来查询、更新、插入和删除数据库中的数据。SQL是一种标准化的语言,尽管在不同的数据库系统中可能存在一些差异&…...

Java—装饰器模式

介绍 装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地将行为添加到现有的对象中,而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。 主要角色 Component:定义一个对…...

服务器远程桌面经常连接不上,造成远程桌面连接不上的原因都有哪些

服务器远程桌面连接不稳定或经常连接不上是一个较为常见的技术问题,其可能的原因涉及多个层面,包括网络设置、服务器配置、系统安全等方面。下面将详细探讨一些可能造成远程桌面连接问题的主要原因: 首先,网络连接不稳定是导致远…...

C#|Maui|BootstrapBlazor|Bootstrap Blazor 组件库改模板 | Bootstrap Blazor 组件库改布局,该怎么改?

先copy一个项目下来:Bootstrap Blazor 组件库 一套基于 Bootstrap 和 Blazor 的企业级组件库 发现不是很满足我的需求,我要把右下角的admin移动到左边去,该怎么移动? 先改代码 点进去到Layout.razor 文档,改成如下&am…...

【Linux】I/O多路复用

文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源,主进程/线程用于监听和接受连接,再创建多个子进程/子线程来完成与连接的各个客户端…...

ubuntu20.0.4下安装PyTorch

参考文档 https://datawhalechina.github.io/thorough-pytorch/%E7%AC%AC%E4%B8%80%E7%AB%A0/1.2%20PyTorch%E7%9A%84%E5%AE%89%E8%A3%85.html 1:安装Anaconda 登录Anaconda | Individual Edition,https://www.anaconda.com/download/success &#xff…...

Android屏幕旋转流程(1)

(1)Gsensor的注册和监听 App -->I2C过程:App通过SensorManager.getSystemServer调用到SystemSensorManager,SystemSensorManager通过jni调用到SensorManager.cpp,后通过binder调用到SensorService。SensorService通…...

JS常见的运算符有哪些?

在JavaScript中,常见的运算符可以分为以下几类: 算术运算符: :加法-:减法*:乘法/:除法%:取余(模运算):递增--:递减**:幂运…...

【scikit-learn入门指南】:机器学习从零开始

1. 简介 scikit-learn是一款用于数据挖掘和数据分析的简单高效的工具,基于NumPy、SciPy和Matplotlib构建。它能够进行各种机器学习任务,如分类、回归和聚类。 2. 安装scikit-learn 在开始使用scikit-learn之前,需要确保已经安装了scikit-le…...

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal(最小可检测信号)是指当信号-噪声比(Signal-to-Noise Ratio, SNR)等于1时的输入信号水平。简单来说,MDS 是一个系统能够分辨出信号存在的最低输入信号…...

Windows运维:找到指定端口的服务

运维过windows的或多或少都遇到过需要找到一个端口对应的服务,或者是因为端口占用,或者是想看下对应的服务是哪个,那么如何操作呢?看看本文吧。 1、按照端口找到进程ID 例如想找8000端口的进程ID netstat -ano | findstr :8000 2…...

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时,我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS(文件系统标准层次结构)。来帮助Linux系统的…...

mysql集群,两主两从,使用mysql-proxy实现读写分离

主从复制 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132master1的从slave1192.168.100.134slave1的从slave2192.168.100.135slave2的从mysql-proxy192.168.100.137 二、具体配置 1.master1 ​ 配置ip:192.168.100.131 ​ …...

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令,脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本,但侧重点各不相同,grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对…...

Linux启动KKfileview文件在线浏览时报错:启动office组件失败,请检查office组件是否可用

目录 1、导论 2、报错信息 3、问题分析 4、解决方法 4.1、下载 4.2、安装步骤 1、导论 今天进行项目部署时,遇到了一个问题。在启动kkfileview时,出现了报错异常: 2024-06-09 06:36:44.765 ERROR 1 --- [ main] cn.keking.service.Of…...

React <> </>的用法

React &#xff1c;&#xff1e; &#xff1c;/&#xff1e;的用法 介绍为什么使用 <>&#xff1f;例子解释 关于顶级元素总结 介绍 在 React 中&#xff0c;使用 <> 表示一个空标签或片段&#xff08;Fragment&#xff09;&#xff0c;这是一个简洁的方式来包裹一…...

is not null 、StringUtils.isNotEmpty和StringUtils.isNotBlank之间的区别?

这三者主要是针对对象是否为空、是否为空串和是否为空白字符串有不同的功能。 is not null 只是说明该对象不为空&#xff0c;没有考虑是否为空串和空白字符串。 StringUtils.isNotEmpty检查字符串是否不为 null且长度大于零&#xff0c;不考虑字符串中的空白字符。 StringU…...

做报告的网站/市场调研的方法有哪些

之前设置了文件夹的共享属性&#xff0c;添加了一个everyone用户&#xff0c;并分配了完全控制的权限&#xff0c;结果文件夹内有很多文件提示没有访问权限&#xff0c;打不开也删不掉&#xff0c;应该是我之前想设置不会被删的时候出了错 解决办法 右键属性>安全>高…...

做软装找产品上哪个网站/知名网络推广

maven项目 update clean install 重启 服务消费者转载于:https://www.cnblogs.com/qingfengzhuimeng/p/7281885.html...

湖南免费网站建设/中小企业管理培训课程

&#xff08;原标题&#xff1a;湖南省妇幼保健院自主开发国内首个妇幼移动就医平台&#xff09; 湖南省妇幼保健院自主开发国内首个妇幼移动就医平台—— 妇幼&#xff0c;就医方便在掌上 记者 段涵敏 通讯员 周文奕 “手机装了‘掌上妇幼’后&#xff0c;我再也不用到窗口…...

wordpress打开xml-rpc/品牌营销策略分析

今天学习了Wildfly V9.0服务器环境的基本管理与运营&#xff0c;包括启动、停止、修改端口、在同一台机器上运行多个实例。配置DB2数据源。...

未来的门户网站/线上推广引流渠道

三维在理解了如何绘制2D元素之后&#xff0c;我们尝试绘制3D元素。 其实多个三角形也能够成四面体&#xff0c;多个长方形也能够成六面体&#xff0c;所以绘制3D元素的时候&#xff0c;只要顶点数量匹配就行了 这里我们尤其注意&#xff0c;我把绘制之前的三个平移和三个旋转单…...

html5网站建设基本流程/枸橼酸西地那非片多长时间见效

Content-Type: text/html如果您设置此标头意味着您必须向用户发送HTML.您可以决定使用像TinyMCE这样的东西让用户在Word样式的编辑器中编写消息并使用它的HTML输出.或者将标题设置为纯文本.Content-Type: text/plain编辑&#xff1a;试试这个$to exampleexample.com;$subject …...