SpringBoot 整合Redis 实战篇

一、解决数据乱码问题🍉

在上篇文章中我们整合了redis,当我们存入一个对象时会发现redis中的数据存在乱码问题,这是jdk编码的问题
在这里插入图片描述

springboot整合redis时提供了两个模板工具类,StringRedisTemplate和RedisTemplate.

1.使用RedisTemplate时需要为key和value设置序列化🥝

在这里插入图片描述

package com.lzq.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<String ,Object> template = new RedisTemplate<>();StringRedisSerializer redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);template.setConnectionFactory(factory);//key序列化方式template.setKeySerializer(redisSerializer);//value序列化template.setValueSerializer(jackson2JsonRedisSerializer);//value hashmap序列化  filed valuetemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.setKeySerializer(redisSerializer);return template;}
}

2.测试🥝

在这里插入图片描述
在这里插入图片描述

当我们配置好序列化文件之后就不需要转换类型或者在进行序列化操作,直接可以向redis中填入对象类型也不存在编码问题,方便了我们的编码操作

package com.lzq;import com.lzq.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@SpringBootTest
class RedisSpringbootApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid contextLoads() {//对key进行序列化redisTemplate.setKeySerializer(new StringRedisSerializer());//对value进行序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("k1","v1");//存储的都是字符串类型,看到存放的数据乱码---对key进行序列化时采用的是默认的JDK序列化方式。要对应的类必须实现序列接口System.out.println(valueOperations.get("k1"));valueOperations.set("k31",new User("张三",28));Object user = valueOperations.get("k3");System.out.println(user);}@Testpublic void test03(){ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("k22","v22");valueOperations.set("k23",new User("阿娇",18));}}

二、 springboot使用redis集群模式🍉

1.更改配置文件🥝

在这里插入图片描述

2.打开redis集群模式🥝

在这里插入图片描述
在这里插入图片描述

3.测试连接🥝

在这里插入图片描述

  @Testpublic void test04(){ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("kkk","vvv");Object kkk = valueOperations.get("kkk");System.out.println(kkk);}

三、使用redis作为缓存🍉

在这里插入图片描述
Redis因为其自身高性能的数据读取能力,因此会经常被应用到缓存的场景中

1.连接数据库配置数据源🥝

在这里插入图片描述

#redis?????--??
#spring.redis.host=192.168.179.129
#spring.redis.port=6379
# nginx??redis??
spring.redis.cluster.nodes=192.168.179.129:7001,192.168.179.129:7002,192.168.179.129:7003,192.168.179.129:7004,192.168.179.129:7005,192.168.179.129:7006spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db2?serverTimezone=Asia/Shanghai&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

在这里插入图片描述

2.实现单表操作的缓存🥝

在这里插入图片描述

package com.lzq.service;import com.lzq.dao.StudentDao;
import com.lzq.pojo.Student;
import javafx.scene.DepthTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class StudentService {@Autowiredprivate StudentDao studentDao;@Autowiredprivate RedisTemplate redisTemplate;//查询操作public Student findByid(Integer id){//创建redis操作字符串对象ValueOperations valueOperations = redisTemplate.opsForValue();//查看缓存是否存在该数据  有缓存则不需要对数据库进行操作Object o = valueOperations.get("student:" + id);//判断产看是否为空  并且为需要的student对象if (o!=null && o instanceof Student){return (Student) o;}//查看数据库Student student = studentDao.selectById(id);if (student!=null){//把查出的数据放到缓存中  key  value  过期时间 过期单位valueOperations.set("student:"+id,student,30, TimeUnit.HOURS);}return student;}//修改操作public Student update(Student student){ValueOperations valueOperations = redisTemplate.opsForValue();//先删除数据库中的缓存redisTemplate.delete("student:"+student.getSid());//再修改数据库中的数据studentDao.updateById(student);return student;}//添加操作public Student insert(Student student){studentDao.insert(student);return student;}//删除操作public int delete(int id){//先删除缓存数据redisTemplate.delete("student:"+id);//再对数据库进行操作int i = studentDao.deleteById(id);return i;}}

思考: AOP—可以把一些非核心业务代码抽象----抽取为一个切面类@Aspect. 在结合一些注解完成相应的切面功能。 Spring框也能想到,Spring在3.0以后提高了缓存注解。可以帮你把功能抽取。

3.使用注解简化缓存操作🥝

1)配置缓存配置🍓

在这里插入图片描述

package com.lzq.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<String ,Object> template = new RedisTemplate<>();StringRedisSerializer redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);template.setConnectionFactory(factory);//key序列化方式template.setKeySerializer(redisSerializer);//value序列化template.setValueSerializer(jackson2JsonRedisSerializer);//value hashmap序列化  filed valuetemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.setKeySerializer(redisSerializer);return template;}@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//解决查询缓存转换异常的问题ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置序列化(解决乱码的问题),过期时间600秒RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化.disableCachingNullValues();RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();return cacheManager;}
}

2)开启缓存注解🍓

在这里插入图片描述

@EnableCaching//开启缓存注解驱动  也可以再配置类中添加

3)使用缓存注解🍓

在这里插入图片描述

package com.lzq.service;import com.lzq.dao.StudentDao;
import com.lzq.pojo.Student;
import javafx.scene.DepthTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class StudentService {@Autowiredprivate StudentDao studentDao;@Autowiredprivate RedisTemplate redisTemplate;//查询操作public Student findByid(Integer id){//创建redis操作字符串对象ValueOperations valueOperations = redisTemplate.opsForValue();//查看缓存是否存在该数据  有缓存则不需要对数据库进行操作Object o = valueOperations.get("student:" + id);//判断产看是否为空  并且为需要的student对象if (o!=null && o instanceof Student){return (Student) o;}//查看数据库Student student = studentDao.selectById(id);if (student!=null){//把查出的数据放到缓存中  key  value  过期时间 过期单位valueOperations.set("student:"+id,student,30, TimeUnit.HOURS);}return student;}//修改操作public Student update(Student student){ValueOperations valueOperations = redisTemplate.opsForValue();//先删除数据库中的缓存redisTemplate.delete("student:"+student.getSid());//再修改数据库中的数据studentDao.updateById(student);return student;}//添加操作public Student insert(Student student){studentDao.insert(student);return student;}//删除操作public int delete(int id){//先删除缓存数据redisTemplate.delete("student:"+id);//再对数据库进行操作int i = studentDao.deleteById(id);return i;}//查询操作//使用于查询的缓存注解: 缓存的名称叫做: cacheNames::key//先从缓存中找名字叫:cacheNames::key 如果存在,则方法不执行。如果不存在会执行方法,并把改方法的返回值作为缓存的值.//必须开启缓存注解驱动@Cacheable(cacheNames = "dept",key="#id")public Student findByid2(Integer id){//创建redis操作字符串对象ValueOperations valueOperations = redisTemplate.opsForValue();//查看缓存是否存在该数据  有缓存则不需要对数据库进行操作Object o = valueOperations.get("student:" + id);//判断产看是否为空  并且为需要的student对象if (o!=null && o instanceof Student){return (Student) o;}//查看数据库Student student = studentDao.selectById(id);if (student!=null){//把查出的数据放到缓存中  key  value  过期时间 过期单位valueOperations.set("student:"+id,student,30, TimeUnit.HOURS);}return student;}//修改操作//先执行方法体,并把方法的返回结果作为缓存的值。修改缓存的值。@CachePut(cacheNames = "dept",key="#dept.id")public Student update2(Student student){ValueOperations valueOperations = redisTemplate.opsForValue();//先删除数据库中的缓存redisTemplate.delete("student:"+student.getSid());//再修改数据库中的数据studentDao.updateById(student);return student;}//添加操作public Student insert2(Student student){studentDao.insert(student);return student;}//删除操作//删除缓存再执行方法体@CacheEvict(cacheNames = "dept",key = "#id")public int delete2(int id){//先删除缓存数据redisTemplate.delete("student:"+id);//再对数据库进行操作int i = studentDao.deleteById(id);return i;}}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划—兑换零钱(一)解析+代码

兑换零钱&#xff08;一&#xff09; 题目链接&#xff1a;兑换零钱&#xff08;一&#xff09; 题目描述&#xff1a; 题目既要求要刚好组成该钱数&#xff0c;又要求是组成该钱数的最少货币数。 面对不同面额的零钱&#xff0c;我们无法直接确定其所需数量&#xff0c;也不…

白盒测试扫盲

目录 前言&#xff1a; 什么是白盒测试 白盒测试中验证什么 如何执行白盒测试 步骤1&#xff1a;理解源代码 步骤2&#xff1a;创建测试用例并执行 白盒测试示例 白盒测试技术 白盒测试的类型 单元测试 测试内存泄漏 其他 白盒测试的优势 白盒测试的缺点 结束语…

Matlab把两个不同的x轴和y轴画在同一个图里

我们知道画两个y轴可以用yyaxis. 那么画两个x轴呢? 这时候可以用神奇的tiledlayout. % 创建两组数据 x1 0:0.1:40; y1 4.*cos(x1)./(x12); x2 1:0.2:20; y2 x2.^2./x2.^3;t tiledlayout(1,1); % 创建一个tiledlayout % 第一个坐标系 ax1 axes(t); % 创建坐标系, 指定t为…

网络安全之反序列化漏洞分析

简介 FastJson 是 alibaba 的一款开源 JSON 解析库&#xff0c;可用于将 Java 对象转换为其 JSON 表示形式&#xff0c;也可以用于将 JSON 字符串转换为等效的 Java 对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONStrin…

Tomcat 部署优化

目录 一.Tomcat介绍 二.了解Tomcat里面里面是放什么的 三. Tomcat&#xff1a;是一个特殊的服务 有两个领域 四.tomcat概述 五.再加上那个扩展java虚拟机&#xff08;JVM&#xff09; 调优 tomcat 优化分两种 六.Tomcat核心组件 ​编辑 容器&#xff1a;什么是容器 …

C/C++内存管理详解

去年的今日&#xff0c;博主第一次发文&#xff0c;那时初出茅庐&#xff0c;没什么经验。时隔一年&#xff0c;更加优质的博文献上&#xff0c;希望可以帮助到更多的人❤️❤️❤️ 文章目录 &#x1f4ac; 前言一、C/C内存分布二、C语言中动态内存管理方式三、C内存管理方式1…

密码学—Vigenere破解Python程序

文章目录 概要预备知识点学习整体流程技术名词解释技术细节小结代码 概要 破解Vigenere需要Kasiski测试法与重合指数法的理论基础 具体知识点细节看下面这两篇文章 预备知识点学习 下面两个是结合起来使用猜测密钥长度的&#xff0c;只有确认了密钥长度之后才可以进行破解。 …

旅游卡app软件开发解决方案

旅游业的不断发展&#xff0c;旅游卡作为一种便捷的旅游方式越来越受到人们的青睐。旅游卡可以帮助游客节省旅游开支&#xff0c;同时也能让游客更好地规划自己的旅游行程。针对这种情况&#xff0c;开发一款旅游卡app软件是非常必要的。本文将介绍旅游卡app软件开发的解决方案…

基于高校图书馆的用户画像、可视化、模型预测、推荐算法项目实现

需要本项目的可以私信博主获取源码及项目&#xff01;&#xff01;&#xff01; 本研究基于高校图书馆的借阅信息、馆藏图书信息、读者入馆信息、用户信息等多维度的数据表&#xff0c;首先将不同年份的数据拼接在一起&#xff0c;按照时间维度进行整合&#xff0c;并保证数据…

JVM原理:JVM运行时内存模型(通俗易懂)

目录 前言正文虚拟机栈局部变量表操作数栈动态链接方法返回地址 本地方法栈本地方法存在的意义本地方法的调用 虚拟机堆堆结构Eden区Survivor区域老年代Old区常用参数指令 方法区常量池 运行时常量池方法信息类信息域信息JDK1.7前的方法区JDK1.7时的方法区JDK1.7后的方法区 程序…

【MYSQL篇】Update语句原理详解

文章目录 前言缓冲池Buffer PoolInnoDB 内存结构redo logundo logBinlog 总结 前言 前面的文章我们已经对MySQL的查询语句的执行流程进行了说明&#xff0c;感兴趣的可以去看看&#xff1a; 【MySQL篇】Select语句原理详解 本篇文章我们来聊聊 MySQL更新语句的执行原理。更新…

【JavaSE】方法

目录 【1】一个小例子 【2】方法概念及使用 【2.1】什么是方法(method) 【2.2】方法定义 【2.3】方法调用的执行过程 【2.4】实参和形参的关系(重要) 【1.5】没有返回值的方法 【2】函数重载 【2.1】为什么需要方法重载 【2.2】方法重载概念 【2.3】方法签名 【3】…