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

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;}

http://www.xdnf.cn/news/1027.html

相关文章:

  • 神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)
  • 安全文件共享实际上是什么样的呢?
  • el-date-picker时间范围 赋值报错问题
  • 当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?
  • LeetCode---整数反转
  • unity脚本-FBX自动化模型面数校验
  • vscode本地docker gdb调试python
  • UE5.2+VarjoXR3,Lumen、GI、Nanite无效的两种解决方案
  • SQLiteDatabase 增删改查(CRUD)详细操作
  • 企业微信私域运营,基于http协议实现SCRM+AI完整解决方案
  • autohue.js - 基于 JavaScript 开发的图片背景色提取开源库,能让图片和背景融为一体
  • gbase8s触发器使用
  • CentOS创建swap内存
  • 锂电池4.2V升压24V推荐哪些升压芯片?高效率国产SL4013输入耐压2.7V-25V
  • 黑马点评redis改 part 4
  • List findIntersection getUnion
  • 分别配置Github,Gitee的SSH链接
  • 扩散模型(Diffusion Models)
  • Linux-信号
  • 媒体关注:联易融聚焦AI+业务,重塑供应链金融生态
  • 【k8s】PV,PVC的回收策略——return、recycle、delete
  • 开源模型应用落地-Podcastfy-从文本到声音的智能跃迁-Docker(二)
  • CSS预处理器对比:Sass、Less与Stylus如何选择
  • 如何改电脑网络ip地址完整教程
  • Python常用的第三方模块之数据分析【pdfplumber库、Numpy库、Pandas库、Matplotlib库】
  • Docker 部署 Redis 缓存服务
  • 路由器转发规则设置方法步骤,内网服务器端口怎么让异地连接访问的实现
  • 一键配置多用户VNC远程桌面:自动化脚本详解
  • linux下使用wireshark捕捉snmp报文
  • 开源状态机引擎,在实战中可以放心使用