当前位置: 首页 > news >正文

Redis在SpringBoot中的使用

在SpringBoot项目中使用redis存储数据作为字典

本项目使用jdk1.8

一、添加依赖

<!-- spring boot redis缓存引入 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 缓存连接池-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency><!-- redis 存储 json序列化 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>
<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

二、配置yml

#spring: redis:host: 公网IPport: 6379database: 0password: (redis密码) #默认为空timeout: 3000ms #最大等待时间,超时则抛出异常,否则请求一直等待lettuce:pool:max-active: 20  #最大连接数,负值表示没有限制,默认8max-wait: -1    #最大阻塞等待时间,负值表示没限制,默认-1max-idle: 8     #最大空闲连接,默认8min-idle: 0     #最小空闲连接,默认0

三、写配置类

3.1 为什么写配置类

如果不写配置类,那么往redis存值,会存jdk序列化的数据,无法正常观看数据

3.2 配置类

package com.atguigu.srb.base.config;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);//首先解决key的序列化方式StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);//解决value的序列化方式Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);//序列化时将类的数据类型存入json,以便反序列化的时候转换成正确的类型ObjectMapper objectMapper = new ObjectMapper();//objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);// 解决jackson2无法反序列化LocalDateTime的问题objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);objectMapper.registerModule(new JavaTimeModule());jackson2JsonRedisSerializer.setObjectMapper(objectMapper);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);return redisTemplate;}
}

四、测试

4.1 存值

/*** FileName: RedisTemplateTest* Author: ccy* Description:redis测试* Date:   2025/4/21 22:23*/
@SpringBootTest(classes = ServiceCoreApplication.class)
@RunWith(SpringRunner.class)
public class RedisTemplateTest {@Resourceprivate RedisTemplate redisTemplate;@Resourceprivate DictMapper dictMapper;@Testpublic void saveDict() {Dict dict = dictMapper.selectById(1);//向数据库中存储string类型的键值对,过期时间5分钟redisTemplate.opsForValue().set("dict", dict, 5 , TimeUnit.MINUTES);}}

发现RedisTemplate默认使用了JDK的序列化方式存储了key和value

4.2 取值

package com.atguigu.srb;/*** FileName: RedisTemplateTest* Author: ccy* Description:redis测试* Date:   2025/4/21 22:23*/
@SpringBootTest(classes = ServiceCoreApplication.class)
@RunWith(SpringRunner.class)//
public class RedisTemplateTest {@Resourceprivate RedisTemplate redisTemplate;@Resourceprivate DictMapper dictMapper;@Testpublic void getDict() {Dict dict = (Dict)redisTemplate.opsForValue().get("dict");System.out.println(dict);}}

五、将数据字典存入Redis

本项目功能实际应用于尚融宝项目

 // ---------Controller---------/*** 延迟加载* @param parentId 前台传后台参数* @return R*/@ApiOperation("根据上级id获取子节点数据列表")@GetMapping("/listByParentId/{parentId}")public R listByParentId(@ApiParam(value = "上级节点id", required = true)@PathVariable Long parentId) {List<Dict> dictList = dictService.listByParentId(parentId);return R.ok().data("list", dictList);}// --------ServiceImpl-----------@Overridepublic List<Dict> listByParentId(Long parentId) {//用try-catch的原因是redis调用可能出错try {//首先查询redis中是否存在数据列表List<Dict> dictList = (List<Dict>)         redisTemplate.opsForValue().get("srb:core:dictList" + parentId);//如果存在,则从redis中直接返回数据列表if (dictList != null) {log.info("从redis中获取数据列表");return dictList;}} catch (Exception e) {//ExceptionUtils.getStackTrace(e): 拿到e对象错误跟踪栈字符串log.error("redis服务器异常:" + ExceptionUtils.getStackTrace(e));}// 如果不存在,则从数据库中查询,并把数据保存到redis中log.info("从数据库中获取数据列表");LambdaQueryWrapper<Dict> qW = Wrappers.lambdaQuery();qW.eq(Dict::getParentId, parentId);List<Dict> dictList = this.list(qW);//填充hashChildren字段dictList.forEach(dict -> {//判断当前节点是否有子节点,找到当前的dict下级是否有子节点boolean hasChildren = this.hasChildren(dict.getId());dict.setHasChildren(hasChildren);});try {//将数据存入redislog.info("将数据存入redis");redisTemplate.opsForValue().set("srb:core:dictList" + parentId, dictList, 5, TimeUnit.MINUTES);} catch (Exception e) {log.error("redis服务器异常:" + ExceptionUtils.getStackTrace(e));}//返回数据列表return dictList;}

相关文章:

  • Uniapp:swiper(滑块视图容器)
  • ubuntu20.04 远程桌面Xrdp方式
  • AR/VR衍射光波导性能提升遇阻?OAS光学软件有方法
  • AOSP Android14 Launcher3——RecentsView最近任务数据加载
  • Java面试实战:从Spring Boot到微服务的深入探讨
  • 双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
  • 用Java实现简易区块链:从零开始的探索
  • 智能电网第1期 | 工业交换机在变电站自动化系统中的作用
  • 【云馨AI-大模型】Dify 1.2.0:极速集成 SearXNG,畅享智能联网搜索新境界,一键脚本轻松部署SearXNG
  • 基于STM32、HAL库的MCP41010T数字电位器驱动程序设计
  • idea快捷键 Project tool window
  • 【Linux网络与网络编程】07.应用层协议HTTPS
  • 眼镜眨巴眨巴-一步几个脚印从头设计数字生命2——仙盟创梦IDE
  • 国产紫光同创FPGA实现SDI视频编解码+图像缩放,基于HSSTHP高速接口,提供2套工程源码和技术支持
  • 国产紫光同创FPGA实现SDI视频编解码,基于HSSTHP高速接口,提供3套工程源码和技术支持
  • 【Python】Selenium切换网页的标签页的写法(全!!!)
  • 学习思路分享---从0开始搭建基本web服务器
  • 飞搭系列 | 组件增加标记,提升用户体验
  • 动态加载内容时selenium如何操作?
  • KDD Cup 2017 数据集分析
  • 外媒:特朗普称或将“大幅降低”对中国的关税
  • 王忠诚出任四川遂宁代市长,此前为成都市政府秘书长
  • 具象的“南方”|一个海南艺术家的穷困与信爱
  • 周继红当选中国泳协主席,曾为国摘得首枚奥运跳水金牌
  • 万斯偕印裔妻子访问印度,4天行程能否推进美印贸易谈判?
  • 俄乌就不打击民用基础设施释放对话信号