1-7(2). SpringBoot整合Redis

随着 Spring Boot2.x 的到来,支持的组件越来越丰富,也越来越成熟,其中对 Redis 的支持不仅仅是丰富了它的API,更是替换掉底层 Jedis 的依赖,取而代之换成了 Lettuce。

区别
Jedis在实现上是直接连接Redis-Server,在多个线程间共享一个Jedis实例时是线程不安全的,如果想要在多线程场景下使用Jedis,需要使用连接池,每个线程都使用自己的Jedis实例,当连接数量增多时,会消耗较多的物理资源。与Jedis相比,Lettuce则完全克服了其线程不安全的缺点:Lettuce是一个可伸缩的线程安全的Redis客户端,支持同步、异步和响应式模式。多个线程可以共享一个连接实例,而不必担心多线程并发问题。它基于优秀Netty NIO框架构建,支持Redis的高级功能,如Sentinel,集群,流水线,自动重新连接和Redis数据模型。

引入依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis依赖包-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ming?serverTimezone=CST
    username: root
    password: 123456
  redis:
    # Redis默认情况下有16个分片,这里配置具体使用的分片。默认是索引为0的分片
    database: 0
    # Redis服务器地址
    host: 127.0.0.1
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    password:
    # 连接超时时间(毫秒)
    timeout: 2000s
    # 配置文件中添加 lettuce.pool 相关配置,则会使用到lettuce连接池
    lettuce:
      pool:
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-wait: 60s
        # 连接池中的最大空闲连接 默认 8
        max-idle: 10
        # 连接池中的最小空闲连接 默认 0
        min-idle: 10
        # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-activ: 8

Spring Boot 在 RedisAutoConfiguration 中默认配置了 RedisTemplate<Object, Object>、StringRedisTemplate两个模板类,然而RedisTemplate<Object, Object>并未指定key、value的序列化器。

两者的关系是StringRedisTemplate继承RedisTemplate。
其实他们两者之间的区别主要在于他们使用的序列化类:RedisTemplate使用的是JdkSerializationRedisSerializer存入数据会将数据先序列化成字节数组然后在存入Redis数据库。 StringRedisTemplate使用的是StringRedisSerializer
使用时注意事项:
   当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
   但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

注意:
如果使用@AutoWired注入RedisTemplate会报错
因为没有设置序列化器,RedisTemplate选择了默认的序列化器JdkSerializationRedisSerializer

官方解释
“Performs automatic serialization/deserialization between the given objects and
the underlying binary data in the Redis store. By default, it uses Java serialization
for its objects (through JdkSerializationRedisSerializer ).
For String intensive operations consider the dedicated StringRedisTemplate.”

RedisTemplate配置类

@Configuration
public class RestTemplateConfig {

    @Bean
    public RedisTemplate<String,Object>redisTemplate(LettuceConnectionFactory factory){
        RedisTemplate<String,Object> template=new RedisTemplate<>();
        //关联
        template.setConnectionFactory(factory);
        //设置key的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化器
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

controller类

类中注入两个模板,可以都试一下
先用RedisTemplate

@Autowired
private RedisTemplate<String, Object> redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("redis/set")
    public String redisSet() {
        log.info("#日志# ======= 测试redis的set ");
        Product product = productService.findById(1);
        redisTemplate.opsForValue().set("product1",product);
        return "success";
    }

    @RequestMapping("redis/get")
    public Product redisGet() {
        log.info("#日志# ======= 测试redis的get ");
        Product product1 = (Product) redisTemplate.opsForValue().get("product1");
        return product1;
    }

游览器先访问redis/set,后访问redis/get
在这里插入图片描述
再测试StringRedisTemplate

@RequestMapping("stringRedisTemplate/set")
    public String stringRedisTemplateSet() {
        log.info("#日志# ======= 测试redis的set ");
        stringRedisTemplate.opsForValue().set("test","stringRedisTemplate");
        return "success";
    }

    @RequestMapping("stringRedisTemplate/get")
    public String stringRedisTemplateGet() {
        log.info("#日志# ======= 测试redis的get ");
        String test = stringRedisTemplate.opsForValue().get("test");
        return test;
    }

同理
在这里插入图片描述

该项目源码已放在GitHub上,地址是
https://github.com/mingweihua/ming/tree/main/ming-base

博主的坚持 离不开大家关注、评论和点赞,感谢大家支持。护发路上互相扶持!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值