互联网应用主流框架整合之Spring缓存机制和Redis结合

news/2025/1/16 5:08:42/

Redis和数据库的结合

在实际的商用软件使用中,通常都是Redis和关系型数据配置使用,单纯使用Redis来存数据成本太高,并且其持久化和计算能力偏差,这两块无法和关系型数据相比较,而Redis和关系型数据库共存的场景就会带来另一个问题,就是在两者之间的数据一致性的问题,有太多的情况会导致Redis中的数据和关系型数据中的数据不一致,比如关系型数据库事务是完善的,Redis的事务没那么严格出现异常回滚,再比如Redis数据更新了但还没有像关系型数据库同步完成,再比如两个业务线的Redis都会同步关系型数据库数据,一边更新了而另一边就变成了脏数据等等

Redis和数据库读操作

从业务角度而言缓存不应该是永久的,这样极其容易造成脏数据的产生,而Redis也需要时进行垃圾回收给新数据腾出空间,因此一般来说应该加入一个超时时间,这样一旦数据超时,Redis就没法读出超时数据,这时候就会触发程序读取数据库,同步刷新缓存数据并设置超时时间,这样就完成了读操作,如下图所示
在这里插入图片描述
伪代码可以这样写

public DataObject readMethod(args){//尝试从Redis中读取数据DataObject data = getFromRedis(key);if (data != null){return data;}//从Redis读入不成功,从数据库中获取data = getFromDataBase();//写入RediswriteRedis(key, data);//设置key的超时时间为5分钟setRedisExprie(key,5);return data;
}

Redis和数据库写操作

写操作要考虑数据一致性的问题,所以首先应该从数据库中读取最新数据,然后对数据进行操作
在这里插入图片描述
写入数据是不能信任缓存的,从数据库中读取最新数据,然后进行业务操作,更新业务数据到数据库,再用新数据刷新Redis缓存,这样就完成了写操作,伪代码可以这样写

public DataObject writeMethod(args){//从数据库中读取最新数据DataObject dataObject = getFromDataBase(args);//执行业务逻辑execLogic(dataObject);//更新数据库数据updateDataBase(dataObject);//刷新缓存updateRedisData(key, dataObject);//设置超时时间setRedisExpire(key,5);
}

使用Spring的缓存机制整合Redis

首先建个项目的基本结构和必要基础数据,如下所示

<dependencies><!-- Spring核心包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.1.RELEASE</version></dependency><!-- Spring Bean包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.1.RELEASE</version></dependency><!-- Spring Context包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.1.RELEASE</version></dependency><!-- Spring Context支持包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.2.1.RELEASE</version></dependency><!-- Spring 表达式包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.2.1.RELEASE</version></dependency><!-- Spring面向切面(AOP)包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.1.RELEASE</version></dependency><!-- Spring JDBC包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.1.RELEASE</version></dependency><!-- dbcp2包 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.5</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.3</version></dependency><!-- MyBatis包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.3</version></dependency><!-- MySQL驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.29</version></dependency><!-- 实现slf4j接口并整合 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.26</version></dependency><!-- Spring Web 和 MVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.1.RELEASE</version></dependency><!-- POJO的验证 --><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.1.0.Final</version></dependency><!-- EXCEL --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.10.1</version></dependency><dependency><groupId

http://www.ppmy.cn/news/1518564.html

相关文章

Electron 项目实战 02:打包和自动更新

技术选型 electron-forgeelectron-builder electron-forge 是Electron 官方文档介绍的&#xff0c;打包和发布都包含了&#xff0c;但是包含的坑也非常多。electron-builder下载量和集成打包非常顺利&#xff0c;本教程也是采用electron-buid来介绍打包。大家在技术选型的时候…

RabbitMQ练习(Routing)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》和《RabbitMQ练习&#xff08;Work Queues&#xff09;》。 确保RabbitMQ、Sender、Receiver、Receiver2容器…

ip地址变化是什么意思?手机地址ip一直变化怎么办

IP地址作为互联网设备的唯一标识&#xff0c;‌其稳定性对于网络连接至关重要。‌然而&#xff0c;‌手机IP地址频繁变动可能带来一系列问题。‌本文将深入探讨IP地址变化的含义、‌IP地址频繁变动的原因&#xff0c;‌以及提供手机地址IP一直变化的有效应对策略。‌ 一、IP地址…

LLaMA-Factory微调入门个人重制版

LLaMA-Factory微调入门个人重制版 说明&#xff1a; 首次发表日期&#xff1a;2024-08-30LLaMA-Factory 官方Github仓库&#xff1a; https://github.com/hiyouga/LLaMA-Factory 关于 本文是对LLaMA-Factory入门教程 https://zhuanlan.zhihu.com/p/695287607 的个人重制版&…

每天一个数据分析题(五百零二)- 分割式聚类算法

以下哪个选项是分割式聚类算法? A. K-Means。 B. Centroid Method C. Ward’s Method D. 以上皆非 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#xff0c;SQL&#xff0c;统计学&#…

Spring MVC中的DispatcherServlet:核心调度者

在Spring MVC框架中&#xff0c;DispatcherServlet扮演着至关重要的角色&#xff0c;它是整个请求处理流程的核心组件和调度者。本文将深入探讨DispatcherServlet的工作原理、主要职责以及在Spring MVC应用中的重要作用。 一、引言 Spring MVC是一种基于Java的实现了Web MVC设…

优化系统性能:深入探讨Web层缓存与Redis应用的挑战与对策

Web层缓存对于提高应用性能至关重要&#xff0c;它通过减少重复的数据处理和数据库查询来加快响应时间。例如&#xff0c;如果一个用户请求的数据已经缓存&#xff0c;服务器可以直接从缓存中返回结果&#xff0c;避免了每次请求都进行复杂的计算或数据库查询。这不仅提高了应用…

File类和 IO流

File类和 IO流 1.文件(file类) 文件在程序中是以流的形式来操作的 创建文件对象相关构造器和方法 相关方法 new File(String pathname) // 根据路径构建一个File对象 new File(File parent,String child) // 根据父目录文件子路径构建 new File(String parent,String chil…