尚硅谷redis7 93-97 springboot整合reids之总体概述
93 springboot整合reids之总体概述
总体概述
jedis-lettuce-RedisTemplate三者的联系
名称 | 类型 | 作用描述 | 和其它的关系 |
---|---|---|---|
Jedis | Redis 客户端 | 早期主流的 Java Redis 客户端,基于阻塞 I/O,同步操作 | 可作为 RedisTemplate 的底层连接实现 |
Lettuce | Redis 客户端 | 基于 Netty、支持异步/响应式编程,更适合高并发场景 | 也可作为 RedisTemplate 的底层连接实现 |
RedisTemplate | Spring 封装类 | 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.2 和 Spring 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;