项目实战典型案例1——redis只管存不管删除 让失效时间删除的问题
redis只管存不管删除 让失效时间删除的问题
- 一:背景介绍
- 二:思路&方案
- 三:代码模拟
- 1.错误示范
- 通过班级id查询课程名称
- 执行结果
- 通过班级id修改课程名称(并没有删除对应缓存)
- 执行结果
- 2.正确示范
- 在错误示范的更新接口上添加删除缓存的代码
- 四:总结
- 五:升华
一:背景介绍
本篇博客是对项目开发中出现的redis只管存不管删除 让失效时间删除的问题进行的总结和改进。目的是将经历转变为自己的经验。通过博客的方式分享给大家,大家一起共同进步和提高。

代码逻辑
- 通过redis查询该课程下所有班级的信息
- 如果没有从redis中查询到数据就从数据库中查询并存入到redis中一份
存在的问题
3. 并没有在更新课程下班级数据的时候删除缓存,会导致如果我更新了该课程下的班级数据,会导致缓存中的数据与数据中的数据不一致,当我再次查询数据的时候,如果我的key键没有过期会直接从redis中查询数据,但是查询的数据是没有更新之前的数据。如果我key键正好过期了才会从数据库中查询最新的数据,并更新到缓存中。
二:思路&方案
保证缓存数据与数据库中数据同步的方案。
- 查询的时候如果缓存存在则从缓存中获取,如果缓存不存在则从数据库中获取数据,并将获取到的数据存储在缓存中。
- 更新数据的时候删除缓存。
三:代码模拟
通过java maven项目模拟redis只管存不管删除 让失效时间删除的问题 进行错误示范和正确示范
代码环境:java maven项目、mysql,redis
pom.xml文件
<dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>compile</scope></dependency></dependencies>
1.错误示范
通过班级id查询课程名称
package org.example.controller;import org.example.dao.UserInfoDao;
import org.example.entity.CourseConfiguration;
import redis.clients.jedis.Jedis;/*** @author : [WangWei]* @version : [v1.0]* @className : UserInfoController* @description : [描述说明该类的功能]* @createTime : [2022/11/30 11:43]* @updateUser : [WangWei]* @updateTime : [2022/11/30 11:43]* @updateRemark : [描述说明本次修改内容]*/
public class SelectCourseNameByClassId {/** @description:通过班级id查询课程名称* @author: wangwei* @date: 2023/3/4 14:24* @param: [args]* @return: void**/public static void main(String[] args) {//构造jedis,连接redis 并设置超时时间为100秒,在jedis的默认构造方法中,超时的时间一般被默认设置为2000毫秒,也就是2秒。Jedis jedis=new Jedis("ip",端口号,100000);jedis.auth("密码");CourseConfiguration courseConfiguration=null;//查询redisString courseName = jedis.get("WangWei:ClassId");if(courseName==""||courseName==null){//从数据库中查询UserInfoDao userInfoDao=new UserInfoDao();courseConfiguration = userInfoDao.selectCourseNameByClassId(55801751);//存入redis 并设置过期时间60秒jedis.set("WangWei:ClassId",courseConfiguration.getCourse_name());jedis.expire("WangWei:ClassId",60);System.out.println(courseConfiguration.getCourse_name());}else {System.out.println(courseName);}}}
执行结果

通过班级id修改课程名称(并没有删除对应缓存)
package org.example.controller;import org.example.dao.UserInfoDao;
import org.example.entity.CourseConfiguration;
import org.example.utils.RedisConfig;
import redis.clients.jedis.Jedis;/*** @author : [WangWei]* @version : [v1.0]* @className : UpdateCourseNameByClassId* @description : [描述说明该类的功能]* @createTime : [2023/3/4 14:26]* @updateUser : [WangWei]* @updateTime : [2023/3/4 14:26]* @updateRemark : [描述说明本次修改内容]*/
public class UpdateCourseNameByClassId {/** @description:通过通过班级id修改班级名称* @author: wangwei* @date: 2023/3/4 14:27* @param: [args]* @return: void**/public static void main(String[] args) {//修改班级名称UserInfoDao userInfoDao=new UserInfoDao();userInfoDao.updateCourseNameByClassId(55801751,"ARPro计算机思维课程-开发班课");// //连接redis
// Jedis jedis=new Jedis("82.157.199.3",6379,100000);
// jedis.auth("000415");
// //删除key键
// jedis.del("WangWei:ClassId");System.out.println("修改成功!");}
}
执行结果

这个时候我们再执行 通过班级id查询课程名称的接口由于WangWei:ClassId这个key键还没有过期,会发现查询的还是之前没有修改的课程名称。数据出现不一致。

当key键WangWei:ClassId过期时由于查询的是数据库中的数据,所以数据是一致的。

2.正确示范
- 查询的时候如果缓存存在则从缓存中获取,如果缓存不存在则从数据库中获取数据,并将获取到的数据存储在缓存中。
- 更新数据的时候删除缓存。
在错误示范的更新接口上添加删除缓存的代码
package org.example.controller;import org.example.dao.UserInfoDao;
import redis.clients.jedis.Jedis;/*** @author : [WangWei]* @version : [v1.0]* @className : UpdateCourseNameByClassId* @description : [描述说明该类的功能]* @createTime : [2023/3/4 14:26]* @updateUser : [WangWei]* @updateTime : [2023/3/4 14:26]* @updateRemark : [描述说明本次修改内容]*/
public class UpdateCourseNameByClassId {/** @description:通过通过班级id修改班级名称* @author: wangwei* @date: 2023/3/4 14:27* @param: [args]* @return: void**/public static void main(String[] args) {//修改班级名称UserInfoDao userInfoDao=new UserInfoDao();userInfoDao.updateCourseNameByClassId(55801751,"ARPro计算机思维课程-开发班课");//连接redisJedis jedis=new Jedis("82.157.199.3",6379,100000);jedis.auth("000415");//删除key键jedis.del("WangWei:ClassId");System.out.println("修改成功!");}
}
通过以上的缓存同步测试,就可以保证缓存中的数据与实际数据库中的数据保持一致。
四:总结
1.出现这次redis只管存不管删除的问题,在于对于redis在实际项目中的使用不够熟悉了解,不清楚缓存同步的策略。推荐需要对redis参照官网进行系统性的学习,以及与其他高人进行讨论交流。
2.其实对于此次问题,如果没有遇到这个案例,自己也很有可能会同样的获取,由于自己本身对于redis的使用没有涉及到,以及考虑到redis缓存同步。
五:升华
通过这次的案例分析,对于认知上需要提升的点,自己也有了针对性提升对于知识认知上的方式方法。如思维导图,三篇读数法,参照官网对例如redis进行快速浏览,通过思维导图宏观了解,提升认知,不怕不知道就怕不知道。
相关文章:
项目实战典型案例1——redis只管存不管删除 让失效时间删除的问题
redis只管存不管删除 让失效时间删除的问题一:背景介绍二:思路&方案三:代码模拟1.错误示范通过班级id查询课程名称执行结果通过班级id修改课程名称(并没有删除对应缓存)执行结果2.正确示范在错误示范的更新接口上添…...
@RequestParam和@PathVariable的用法与区别
PathVariable PathVariable 映射 URL 绑定的占位符带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义通过 PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占…...
【大数据 AI 人工智能】数据科学家必学的 9 个核心机器学习算法
如今,机器学习正改变着我们的世界。借助机器学习(ML),谷歌在为我们推荐搜索结果,奈飞在为我们推荐观看影片,脸书在为我们推荐可能认识的朋友。 机器学习从未像在今天这样重要。但与此同时,机器学习这一领域也充斥着各种术语,晦涩难懂,各种机器学习的算法每年层出不穷…...
IronPDF for .NET 2023.2.4 Crack
适用于 .NET 2023.2.4 的 IronPDF 添加对增量 PDF 保存的支持。 2023 年 3 月 2 日 - 10:23新版本 特征 添加了对 IronPdfEngine Docker 的支持。 添加了对增量 PDF 保存的支持。 重新设计了 PDF 签名和签名。 删除了 iTextSharp 依赖项。 在文本页眉/页脚中添加了 DrawDivider…...
3.4-前端的10个问题
01、null和undefined undefined是全局对象的一个属性,当一个变量没有赋值或者访问一个对象不存在的属性,这时候都是undefined。 null:表示是一个空对象。在需要释放一个对象的时候,直接赋值为null即可。 02、箭头函数 箭头函数…...
开发手册——一、编程规约_9.其他
这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。 说明:不要在方法…...
23.3.4打卡 AtCoder Beginner Contest 291(Sponsored by TOYOTA SYSTEMS)A~E
F题题面都看不懂嘞!开摆! 没找到合适的markdown, 截图网页翻译了我真是天才 比赛链接: https://atcoder.jp/contests/abc291 A题 题意 给出一个字符串, 找到第一个大写字母的下标 简单题就不多说了, 直接放代码 代码 void solve() {cin>>str;nstr.size();str"…...
Gem5模拟器,一些运行的小tips(十一)
一些基础知识,下面提到的东西与前面的文章有一定的关系,感兴趣的小伙伴可以看一下: (21条消息) Gem5模拟器,全流程运行Chiplet-Gem5-SharedMemory-main(十)_好啊啊啊啊的博客-CSDN博客 Gem5模拟器…...
【JAVA】List接口
🏆今日学习目标:List接口 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰本期期数:第四期 🎉专栏系列:JAVA List接口一、ArrayList二、LinkedList总结一、ArrayList ArrayLis…...
Hbase RegionServer的核心模块
RegionServer是HBase系统中最核心的组件,主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系,包含多个各司其职的核心模块:HLog、MemStore、HFile以及BlockCache。 一、RegionServer内部结构 RegionServer是HBas…...
【Java开发】JUC进阶 01:Lock锁详解
1 Lock锁介绍已经在【JUC基础】04简单介绍过了,本文做进一步的拓展,比如公平锁和非公平锁、📌 明白锁的核心四个对象:线程,共享资源,锁,锁操作包括线程如何操作资源,使用锁锁哪个资源…...
关于登录校验的解决方案以及原理(回顾知识点)--项目开发那点事(自问自答版本)
开始前奏: 嘻嘻😄 通常一个完整的系统,需要安全性的保证。如登录校验,登录成功后,才可以访问服务资源。在服务端渲染项目中,我们通常使用 session来进行登录校验。在前后端分离的场景中,很多时…...
【数据结构】邻接矩阵和邻接图的遍历
写在前面 本篇文章开始学习数据结构的图的相关知识,涉及的基本概念还是很多的。本文的行文思路:学习图的基本概念学习图的存储结构——本文主要介绍邻接矩阵和邻接表对每种结构进行深度优先遍历和广度优先遍历先识概念话不多说,狠活献上学习思想等等&…...
设计跳表(动态设置节点高度)
最近学习redis的zset时候,又看到跳表的思想,突然对跳表的设置有了新的思考 这是19年设计的跳表,在leetcode的执行时间是200ms 现在我对跳表有了新的想法 1、跳表的设计,类似二分查找,但是不是二分查找,比较…...
基于神经辐射场(Neural Radiance Fileds, NeRF)的三维重建- 简介(1)
Nerf简介 Nerf(neural Radiance Fileds) 为2020年ICCV上提出的一个基于隐式表达的三维重建方法,使用2D的 Posed Imageds 来生成(表达)复杂的三维场景。现在越来越多的研究人员开始关注这个潜力巨大的领域,也…...
【AI面试】NMS 与 Soft NMS 的辨析
往期文章: AI/CV面试,直达目录汇总【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化 一、NMS 非极大值抑制(Non-Maximum Suppression,NMS),并不是深度学习时期,目标…...
一文让你彻底理解Linux内核多线程(互斥锁、条件变量、读写锁、自旋锁、信号量)
一、互斥锁(同步) 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在…...
利用python写一个gui小公举--环境搭建
文章目录背景搭建环境安装必要库添加工具快捷方式检验背景 在实习过程中遇到一个问题,某项目是通过python代码实现的,而且需要一直修改参数实现功能,过程有些繁琐。虽然师兄用PHP study搭了一个网站用于查看结果,但是还是过于繁琐…...
英飞凌Tricore实战系列02_ENDINIT属性看门狗原理及应用
目录 1.概述2.ENDINIT功能及使用2.1 ENDINIT属性2.2 改写受ENDINIT保护寄存器的步骤3. Tricore 看门狗介绍及使用3.1 看门狗系统介绍3.1.1 安全看门狗介绍3.1.2 CPU看门狗介绍3.2 看门狗模式介绍3.2.1 Time-out模式3.2.2 正常模式(Normal Mode)3.2.3 禁用模式(Disabled Mode…...
Java Number类
Java Number 类是一个抽象类,它是所有数字类的基类。Java 中的数字类包括 Byte、Short、Integer、Long、Float 和 Double,它们都继承自 Number 类。Java Number 类提供了一些常用的方法,可以用于将数字类型转换为不同的格式,以及进…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
