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

尚硅谷redis7 93-97 springboot整合reids之总体概述

93 springboot整合reids之总体概述

总体概述

jedis-lettuce-RedisTemplate三者的联系

名称类型作用描述和其它的关系
JedisRedis 客户端早期主流的 Java Redis 客户端,基于阻塞 I/O,同步操作可作为 RedisTemplate 的底层连接实现
LettuceRedis 客户端基于 Netty、支持异步/响应式编程,更适合高并发场景也可作为 RedisTemplate 的底层连接实现
RedisTemplateSpring 封装类Spring Data Redis 提供的操作 Redis 的高级模板,简化开发底层依赖 Jedis 或 Lettuce

本地java连接Redis常见问题,小白注意

redis.conf配置文件中bind配置请注释掉

保护模式设置为no

linux系统的防火墙设置

redis服务器的ip地址和密码是否正确

忘记写访问redis服务端口号和auth密码

集成Jedis

略 跟着视频操作即可

集成lettuce

每次连接redis都要new一个对象非常消耗资源。

Jedis和Lettuce的区别

jedis和Lettuce都是Redis的客户端,它们都可以连接Redis服务器,但是在SpringBoot2.0之后默认都是使用的Lettuce这个客户端连控Redis服务器。因为当使用Jedis客户端连接Redis服务器时候,每个线程都要拿自己创建的Jedis实例去连接Redis客户端,当有很多个线程的时候,不仅开销大需要反复的创建关闭一个Jedis连接,而且也是线程不安全的,一个线程通过Jedis实例更改Redis服务器中的数据之后会影响另一个线程;

但是如果使用Lettuce这个客户端连接Redis服务器的时候,就不会出现上面的情况,Lettuce底层使用的是Netty.当有多个线程都需要连接Redis服务器的时候,可以保证只创建一个Lettuce连接,使所有的线程共享这一个Lettuce连接,这样可以减少创建关闭一个Lettuce连接时候的开销;而且这种方式也是线程安全的,不会出现一个线程通过Lettuce更改Redis服务器中的数据之后而影响另一个线程的情况;

集成RedisTemplate【推荐使用】

@Service
@Slf4j
public class OrderService {//设置Key的前缀public static final String ORDER_KEY = "ord:";// 有两个一个是系统默认的,一个是在Config中手动配置的,在这里由于@Resouce所以使用手动配置的@Resourceprivate RedisTemplate redisTemplate;public void addOrder(){ // 写操作 添加订单// 生成一个 1 到 1000(包含1和1000)之间的随机整数。int keyId = ThreadLocalRandom.current().nextInt(1000)+1;//生成一个随机的唯一标识符(UUID),并将它转换成字符串赋值给 serialNo。String serialNo = UUID.randomUUID().toString();String key = ORDER_KEY+keyId;String value = "京东订单"+serialNo;// redisTemplate.opsForValue()  获取操作 Redis 字符串(String)类型数据的操作接口redisTemplate.opsForValue().set(key,value);log.info("***key:{}",key);log.info("***value:{}",value);}public String getOrderById(Integer keyId){return redisTemplate.opsForValue().get(ORDER_KEY+keyId).toString();}
}

PS:如果是log日志报错可能是lombok版本太低 ,可以改成

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version> <!-- 版本号可以根据需要调整 -->
    <scope>provided</scope>
</dependency>

还有就是Swagger UI无法正常显示可能是因为Springfox 2.9.2Spring Boot版本不兼容不兼容导致的依赖注入失败

删除旧版本的 Springfox 依赖 用 springdoc-openapi

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.1.0</version>
</dependency>
 

@RestController
@Slf4j
@Tag(name = "订单接口", description = "订单相关操作")
public class OrderController {@Resourceprivate OrderService orderService;@Operation(summary = "获取订单", description = "根据订单ID查询订单详情")@RequestMapping(value="order/add",method = RequestMethod.POST)public void addOrder(){orderService.addOrder();}@Operation(summary = "获取订单", description = "根据订单ID查询订单详情")@RequestMapping(value="order/{keyId}",method = RequestMethod.GET)public void getOrderById(@PathVariable Integer keyId){orderService.getOrderById(keyId);}
}

访问 Swagger UI则可正常显示

reids中文显示乱码

redis-cli -a 密码 --raw

 为什么使用默认的RedisTemplate会导致redis数据库乱码?

Java 会使用 JDK 默认的序列化机制,将对象转换为字节流。

RedisConfig中手动新建的RedisTemplate类的注释 

@Configuration
public class RedisConfig {/*** redis序列化的工具配置类,下面这个请一定开启配置* 127.0.0.1:6379> keys ** 1) "ord:102"  序列化过* 2) "\xac\xed\x00\x05t\x00\aord:102"   野生,没有序列化过* this.redisTemplate.opsForValue(); //提供了操作string类型的所有方法* this.redisTemplate.opsForList(); // 提供了操作list类型的所有方法* this.redisTemplate.opsForSet(); //提供了操作set的所有方法* this.redisTemplate.opsForHash(); //提供了操作hash表的所有方法* this.redisTemplate.opsForZSet(); //提供了操作zset的所有方法* @param lettuceConnectionFactory* @return** LettuceConnectionFactory 创建和管理 Redis 连接,作为 RedisTemplate 的底层连接提供者。*/@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){// 在这个方法里手动创建一个新的 RedisTemplate 实例RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();// 将 Redis 的“连接方式”交给 RedisTemplate,让它能正确地连上 Redis 服务器。redisTemplate.setConnectionFactory(lettuceConnectionFactory);//设置key序列化方式string Redis 是一个二进制存储系统,将其转化为字符串redisTemplate.setKeySerializer(new StringRedisSerializer());//设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化// 将 Redis 中的 value 序列化为 JSON 格式进行存储,并在读取时反序列化为 Java 对象。redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());// 确保 RedisTemplate 的所有配置都已经设置完成,并进行必要的初始化。redisTemplate.afterPropertiesSet();return redisTemplate;}}

为了保证OrderService中调用的是我们自定义的redisTemplate,在OrderService这么调用

@Resource(name="redisTemplate")
private RedisTemplate<String, Object> redisTemplate;

相关文章:

  • LLM推理相关指标
  • python分配方案数 2023年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析
  • Go 语言的 GC 垃圾回收
  • 核心机制三:连接管理(三次握手)
  • Day08
  • Hbase
  • Web开发实战:HTML+CSS+JS期末复习全梳理
  • 设计模式——抽象工厂设计模式(创建型)
  • BFD 基本工作原理与实践:如何与 VRRP 联动实现高效链路故障检测?
  • 使用PowerBI个人网关定时刷新数据
  • Springcloud Alibaba自定义负载均衡详解
  • ESP8266常用指令
  • Kerberos面试内容整理-会话密钥的协商与使用
  • 华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现
  • 华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 工业物联网中的事件驱动采样架构及优化
  • 墨香阁小说阅读前端项目
  • 基于Sqoop的MySQL-Hive全量/增量同步解决方案(支持多表批量处理
  • 训练中常见的运动强度分类
  • 大语言模型值ollama使用(1)
  • 网站美工色彩搭配/常德网站seo
  • 汽车技术资料网站建设/站长工具seo排名
  • 做的网站百度上可以搜到吗/seo技术经理
  • 一个人做网站赚钱/搜索优化seo
  • 常德网站建设设计/黄金网站软件app大全下载
  • 私人网站建设方案书框架栏目/网站优化网