【Java项目中 利用Redis实现数据缓存】

news2024/11/14 23:33:52

文章目录

  • Java SpringBoot项目中 用Redis实现数据缓存
  • 1 环境搭建
    • 1.1 maven坐标
    • 1.2 配置文件
    • 1.3 配置类
  • 2 实现缓存短信验证码
  • 3 缓存菜品数据
  • 4 Spring Cache 缓存框架
    • 4.1 Spring Cache介绍
    • 4.2 Spring Cache常用注解
    • 4.3 Spring Cache使用方式

Java SpringBoot项目中 用Redis实现数据缓存

1 环境搭建

1.1 maven坐标

在项目的pom.xml文件中导入spring data redis的maven坐标:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

1.2 配置文件

在application.yml 中添加redis配置

redis: 
    host: 172.17.2.94
    port: 6379
    password: root@123456
    database: 0

1

1.3 配置类

在项目中加入配置类RedisConfig:

@Configuration 
public class RedisConfig extends CachingConfigurerSupport{
    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
    	//默认的Key序列化器为:JdkSerializationRedisSerializer 
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;	    
    } 
}

2 实现缓存短信验证码

实现思路:

在已经实现了移动端手机验证码登录的基础上,随机生成的验证码我们是保存在HttpSession中的。
现在需要改造为将验证码缓存在Redis中,具体的实现思路如下:

  1. 在服务端UserController中注入RedisTemplate对象,用于操作Redis
  2. 在服务端UserController的sendMsg方法中,将随机生成的验证码缓存到Redis中,并设置有效期为5分钟3、在服务端UserController的login方法中,从Redis中获取缓存的验证码,如果登录成功则删除Redis中的验证码
//注入
@Autowired 
private RedisTemplate redisTemplate;

//缓存到redis
//将生成的验证码缓存到Redis中,并且设置有效期为5分钟
redisTemplate.opsForValue().set(phone,code,timeout:5,TimeUnit.MINUTES);

//从Redis中获取缓存的验证码
Object codeInSession = redisTemplate.opsForValue().get(phone);

//如果用户登录成功,删除Redis中缓存的验证码
redisTemplate.delete(phone);

3 缓存菜品数据

实现思路:

前面我们已经实现了移动端菜品查看功能,对应的服务端方法为DishController的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。
具体的实现思路如下:

  1. 改造DishController的list方法,先从Redis中获取菜品数据,如果有则直接返回,无需查询数据库;如果没有则查询数据库,并将查询到的菜品数据放入Redis。
  2. 改造DishController的save和update方法,加入清理缓存的逻辑

缓存实现:

//动态构造key键
String key ="dish_" + dish.getCategoryId() + "_" + dish.getStatus();//dish_1397844391040167938_1
//先从redis中获取缓存数据
dishDtoList = (List<DishDto>)redisTemplate.opsForValue().get(key);

if(dishDtoList!= null){
	//如果存在,直接返回,无需查询数据库
	return R.success(dishDtoList);
}

//如果不存在,需要查询数据库,将查询到的菜品数据缓存到Redis

//查询操作。。。。

//存入缓存
redisTemplate.opsForValue().set(key, dishDtoList, timeout: 60, TimeUnit.MINUTEs) ;

*注意:*在使用缓存过程中,要注意保证数据库中的数据和缓存中的数据一致,如果数据库中的数据发生变化,需要及时清理缓存数据

  • 清理所有菜品数据缓存

    2

  • 清理对应分类下面的菜品缓存数据

    3

4 Spring Cache 缓存框架

4.1 Spring Cache介绍

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。

CacheManager是Spring提供的各种缓存技术抽象接口。

针对不同的缓存技术需要实现不同的CacheManager:

CacheManager描述
EhCacheCacheManager使用EhCache作为缓存技术
GuavaCacheManager使用Google的GuavaCache作为缓存技术
RedisCacheManager使用Redis作为缓存技术

4.2 Spring Cache常用注解

注解说明
@EnableCaching开启缓存注解功能 (在启动类上)
@Cacheable在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;
若没有数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用
@EnableCaching开启缓存支持即可。
例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。

4.3 Spring Cache使用方式

普通方式:

注入CacheManager

@Autowired
private CacheManager accheManager;
  • 开启并存储缓存

    /**
    *CachePut:将方法返回值放入缓存
    *value:缓存的名称,每个缓存名称下面可以有多个key
    *key:缓存的key
    */
    @CachePut(value ="userCache",key ="#result.id")
    @PostMapping public User save(User user){
    	userService.save(user);
        return user;
    }
    
  • 清理缓存

    /**
    *CacheEvict:清理指定缓存
    *value:缓存的名称,每个缓存名称下面可以有多个key 
    *key:缓存的key
    */
    @CacheEvict(value ="userCache",key ="#p0")
    //@CacheEvict(value ="userCache",key ="#root.args[0]")
    //@CacheEvict(value ="userCache",key ="#id") (建议此种)
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
    	userService.removeById(id);
    }
    
  • 查询缓存

    /**
    *Cacheable: 在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
    *value: 缓存的名称,每个缓存名称下面可以有多个key 
    *key: 缓存的key
    *condition: 满足条件时缓存数据
    *unless: 满足条件则不缓存
    */
    @Cacheable(value = "userCache", key = "#id", condition = "#result != null")
    @GetMapping("/{id}")
    public User getById(@ PathVariable Long id) {
    	User user = userService. getById(id);
        return user;
    }
    

使用Redis 缓存技术:

  1. 导入maven坐标
    spring-boot-starter-data-redis、spring-boot-starter-cache

  2. 配置application.yml

    spring: cache: redis: time-to-live:1800000 #设置缓存有效期

    4

  3. 在启动类上加入@EnableCaching注解,开启缓存注解功能

  4. 在Controller的方法上加入@Cacheable、@CacheEvict等注解,进行缓存操作

注意:

  • condition 条件中 返回结果result 不可用,unless可用

    unless = "#result == null"

  • 返回对象要实现序列化接口

    public class R<T> implements Serializable{}

  • 删除某项所有缓存

    @CacheEvict(value = "setmealCache", allEntries = true)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文了解Moonbeam互连合约

什么是互连合约Connected Contracts 简单来说&#xff0c;互连合约是通过Moonbeam连接其他区块链上的一个或多个智能合约&#xff0c;其允许目标链上的用户通过跨链消息传递协议在一个应用中操作不同链上的资产或是服务。 通过互连合约方案&#xff0c;不同迥异的公链技术架构…

计算机内部总线详解

文章目录 总线概述地址总线位宽 数据总线位宽CPU性能指标 例题 总线概述 众所周知&#xff0c;总线就是用来帮助连接两个或多个计算机组件&#xff0c;用于数据传输&#xff0c;计算机内部存在三种类型的总线&#xff1a; 地址总线&#xff1a;用于传输指示计算机中的内存或外…

【uboot1】常用指令

文章目录 1.U-Boot命令之常用命令&#xff1a;7.U-Boot命令之EMMC和SD卡操作命令&#xff1a;一般EMMC和SD卡是同一个东西&#xff0c;没特殊说明&#xff0c;统一MMC来代指EMMC和SD卡8.U-Boot命令之内存操作命令&#xff1a;直接对DRAM进行读写操作&#xff0c;uboot命令中的数…

MySQL数据库高级查询语句

MySQL数据库高级查询语句 一、语句SELECT ----显示表格中一个或数个字段的所有数据记录DISTINCT ----不显示重复的数据记录WHERE ----有条件查询AND OR ----且 或IN ----显示已知的值的数据记录BETWEEN ----显示两个值范围内的数据记录通配符 ----通常通配符都是跟 LIKE 一起使…

强化学习从基础到进阶-案例与实践[5]:梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

解决关于msvcp120.dll丢失的问题(解决方法)

msvcp120.dll是微软软件包的一部分。它是一个库文件&#xff0c;可用于支持软件运行时&#xff0c;msvcp120.dll的作用是提供计算机程序所需的标准库&#xff0c;msvcp120.dll还负责管理堆内存、线程和异常处理函数等。在使用windows编写的应用程序中&#xff0c;通常需要使用此…

【新星计划·2023】Linux系统的架构和组件讲解

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解Linux系统的架构和组件。 目录 一、Linux系统的架构 1、硬件层 2、内核层 3、进程管理子系统 4、内存管理子系统 5、…

JDBC和数据库应用总结

文章目录 1. JDBC介绍2. 相关jar包引入3. JDBC与数据库基本连接4. JDBC API 详解4.1 Connection 接口4.2 Statement 接口4.3 ResultSet 5. PreparedStatement 详解 1. JDBC介绍 JDBC是一套标准接口&#xff0c;这套接口用于操作所有的数据库&#xff0c;不同的数据库厂商对迎合…

在C#下运行Python:IronPython和Pythonnet

在C#下运行Python可能有不同的原因。其中一些原因包括&#xff1a; 使用C#应用程序中不可用的特定Python功能或库。结合Python的简单性和表现力以及C#的性能和稳健性&#xff0c;完成不同任务。与基于Python的系统或服务进行集成。 为实现Python和C#之间的互操作性&#xff0…

Java日志框架介绍

​今天来聊一聊 Java 日志框架&#xff0c;不管是在项目开发阶段的调试&#xff0c;还是项目上线后的运行&#xff0c;都离不开日志。日志具有处理历史数据、定位程序问题、理解程序运行过程等重要作用。在 Spring 项目开发过程中我们常见的日志框架可能就是 logback、log4j2 和…

Go学习圣经:Go语言实现高并发CRUD业务开发

说在前面&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer&#xff0c;并且是非常优质的offer&#…

APP/小程序嵌入游戏,游戏飞跃的赛道

APP/小程序接入游戏运营已不是新鲜事&#xff0c;然而&#xff0c;其仍具有巨大的发展潜力&#xff0c;尤其是社交类APP&#xff0c;多以加入娱乐游戏增加互动&#xff0c;获取目标客户&#xff0c;同时为产品增加变现渠道&#xff0c;实现双赢。 对于APP嵌入式游戏&#xff0…

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 一、微服务介绍1、系统架构演变1&#xff09;单体应用架构2&#xff09;垂直应用架构3&#xff09;分布式4&#xff09;SOA架构5&#xff09;微服务框架6&#xff09;常见微服务架构 2、SpringCloud Alibaba介绍3、S…

【C语言督学训练营 第十四天】二叉树真题实战 ----- 层序建树、前中后序遍历、求树的WPL

文章目录 前言树概念二叉树层序建树四种遍历二叉树的方式层次遍历前序遍历中序遍历后续遍历 真题实战&#xff01; 前言 今天进行总结的是考研408有关二叉树的基础知识&#xff0c;是王道C语言督学营的第十四天&#xff0c;随着课程的深入&#xff0c;代码实战的难度慢慢的上来…

MyCat01——如何实现MySQL中的主从复制

1 问题 数据对于我们来说是一项最重要的资产&#xff0c;因为数据丢失带来的损失&#xff0c;对于一家公司来说&#xff0c;有时也是毁灭性的。 那么如何确保数据安全&#xff0c;不因断电或系统故障带来数据丢失呢&#xff1f; 当用户增加&#xff0c;对数据库的访问量也随…

推荐一款好用的时序预测工具——Alibaba DChain Forecast

前言 绝大部分行业场景&#xff0c;尤其是互联网、量化行业&#xff0c;每天都会产生大量的数据。金融领域股票价格随时间的走势&#xff1b;电商行业每日的销售额&#xff1b;旅游行业随着节假日周期变化的机票酒店价格等。我们称这种不同时间收到的&#xff0c;描述一个或多…

Ajax技术的秘密揭秘:异步传输,高效交互

文章目录 I. 什么是AjaxAjax的定义和起源Ajax与传统的Web应用程序之间的区别 II. Ajax的工作原理Ajax的基本原理Ajax如何通过异步传输实现无需刷新页面 III. Ajax的应用场景在Web应用程序中应用Ajax的优势Ajax在哪些场景中使用 IV. Ajax的组成部分和APIXHR对象FormData对象Fetc…

用postman进行web端自动化测试

目录 前言 一、抓包&#xff08;使用Charles抓包工具&#xff09; 二、选择请求方法 三、填写url地址 四、填写Header 五、填写body 六、断言&#xff08;Tests页&#xff09; 七、获取动态参数——例如token 八、设置静态参数&#xff08;请求地址、账号密码等&#x…

【Django-功能优化】存储、循环、操作选择对代码性能的影响

功能开发背景 港口货轮需要进行集装箱的装卸任务&#xff1a; 船上的每一个集装箱&#xff0c;可以用三个维度的坐标来唯一定位&#xff1a;(bay, column, layer)&#xff0c;这三个维度结合其他一些固有信息&#xff0c;构成了一个箱子的字段属性&#xff0c;存储在箱子数据表…

百度的人脸识别的技术

百度的人脸识别的技术 1.基本概念 分组&#xff1a;分组ID&#xff08;group_id&#xff09;&#xff1a;分组ID用于对一组相关的人脸进行分组和管理。你可以根据自己的需求&#xff0c;将不同的人脸数据分配到不同的分组中。例如&#xff0c; 你可以根据人员的职位、部门或其…