当前位置: 首页 > 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通…...

【独家逆向分析】:2026年Python官方AOT预编译包(.so/.dylib/.dll)签名验证失败报错的底层机制——绕过签名强制校验的合规临时方案

第一章:Python原生AOT编译方案2026报错解决方法总览Python原生AOT(Ahead-of-Time)编译在2026年生态中已进入稳定试用阶段,但开发者常遭遇如 ModuleNotFoundError: No module named _aot_runtime、Unsupported AST node: Match 或 …...

02.Linux常用文件操作命令

1.mkdir 目录名:创建目录 mkdir 目录名 mkdir -p a/b/c 创建多级目录 2.touch 创建空文件 touch 文件名 touch 文件名 文件名 创建多个文件 3.文件写入内容 echo写入 覆盖写入 echo 文件内容 >文件名 追加写入(日志必用) echo 文件内容 >…...

开源工具Jellyfin豆瓣插件高效配置指南:打造完美中文媒体库

开源工具Jellyfin豆瓣插件高效配置指南:打造完美中文媒体库 【免费下载链接】jellyfin-plugin-douban Douban metadata provider for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-douban 在数字媒体收藏日益增长的今天&#xff0…...

Harness Engineering:Agent 时代,工程师的新战场

关注 AI 的同学大概率对这两个词已经不陌生了:提示词工程(Prompt Engineering)和上下文工程(Context Engineering)。前者教你怎么跟模型说话,后者教你往模型的上下文窗口里塞什么内容。但从 2026 年初开始&…...

计算机毕业设计springboot基于的游戏后台管理系统 基于SpringBoot的网游运营管理平台的设计与实现 基于SpringBoot架构的电子竞技服务支撑系统的设计与实现

计算机毕业设计springboot基于的游戏后台管理系统(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展和智能终端设备的全面普及,游戏产业已迅速…...

PowerShell效率提升秘籍:10个必备插件让你的终端飞起来

PowerShell效率革命:10款生产力插件深度评测与实战指南 对于每天与终端打交道的开发者来说,PowerShell的默认功能往往难以满足高效开发的需求。本文将深入剖析10款经过实战检验的效率工具,从智能补全到目录导航,从文件操作到命令解…...

知识引导上下文优化(KgCoOp):一种解决灾难性遗忘的 Prompt Tuning 机制

来源:DeepHub IMBA 本文约3000字,建议阅读5分钟本文提出了一种简单有效的约束机制。视觉-语言模型(VLMs)如 CLIP 彻底改变了零样本图像识别的处理方式。这类模型在包含 4 亿个图像-文本对的大规模数据集上进行训练,捕获…...

如何通过3个步骤快速掌握BetaFlight黑匣子日志分析

如何通过3个步骤快速掌握BetaFlight黑匣子日志分析 【免费下载链接】blackbox-log-viewer Interactive log viewer for flight logs recorded with blackbox 项目地址: https://gitcode.com/gh_mirrors/bl/blackbox-log-viewer 你是否曾经在调试无人机飞行问题时感到束手…...

3个步骤玩转虚拟手柄模拟:ViGEmBus驱动从入门到精通

3个步骤玩转虚拟手柄模拟:ViGEmBus驱动从入门到精通 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus Windows虚拟手柄驱动技术为游戏玩家和开发者…...

Kali实战:CTF杂项题必备工具全解析

1. Kali Linux与CTF杂项题简介 第一次参加CTF比赛时,面对五花八门的杂项题完全无从下手。直到发现Kali Linux这个"瑞士军刀",才真正打开了解题新世界。Kali Linux预装了300安全工具,其中约20%专门用于处理隐写术、文件分析等杂项题…...