articleList

05-新版 SpringBoot2.x 整合 Redis6 客户端实战

2025/03/16 posted in  Redis
Tags: 

第 1 集 分布式缓存 Redis 客户端讲解

简介:分布式缓存 Redis 客户端讲解

  • 自带客户端 redis-cli

  • 可视化工具

  • 语言客户端:java、nodejs、python

    • java 语言客户端:

      • jedis
      Jedis 是直连模式,在多个线程间共享一个 Jedis 实例时是线程不安全的,需要使用连接池
      ​
      其API提供了比较全面的Redis命令的支持,相比于其他Redis 封装框架更加原生
      ​
      Jedis中的方法调用是比较底层的暴露的Redis的API,Java方法基本和Redis的API保持着一致
      ​
      使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,不支持异步操作
      
      • lettuce
      高级Redis客户端,用于线程安全同步,异步响应
      ​
      基于Netty的的事件驱动,可以在多个线程间并发访问, 通过异步的方式可以更好的利用系统资源
      

第 2 集 新版 SpringBoot2.X 项目创建

简介:新版 SpringBoot2.X 项目创建

第 3 集 SpringBoot2.x 实战整合 Redis 客户端+单元测试

简介:SpringBoot2.x 整合 Redis 客户端+单元测试

  • 在 SpringBoot 整合 Redis 很简单

    • SpringData 介绍

      • 操作 mysql/redis/elasticseatch
      • SpringDataRedis 是专门操作 redis 的依赖
    • 添加依赖 spring-boot-starter-data-redis

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
      
  • 注意

    • Springboot2 后默认使用 Lettuce 作为访问 redis 的客户端

    • 旧版本 lettuce 存在堆外内存溢出的 bug, 5.3 版本修复了这个 bug, 我们是用 6.1

    • 很多同学没产生原因

      • 并发量不高
      • 内存足够大,没发生问题就又发布更新了
    • 解决方式

      • 升级版本
      • 换 jedis

第 4 集 SpringDataRedis 的 RedisTemplate 讲解介绍

简介:SpringDataRedis 配置 RedisTemplate 介绍

  • RedisTemplate 介绍

    • ValueOperations:简单 K-V 操作
    • SetOperations:set 类型数据操作
    • ZSetOperations:zset 类型数据操作
    • HashOperations:针对 map 类型的数据操作
    • ListOperations:list 类型的数据操作
  • RedisTemplate 和 StringRedisTemplate 的区别

    • StringRedisTemplate 继承 RedisTemplate

    • 两者的数据是不共通的(默认的序列化机制导致 key 不一样)

    • StringRedisTemplate 默认采用的是 String 的序列化策略

    • RedisTemplate 默认采用的是 JDK 的序列化策略,会将数据先序列化成字节数组然后在存入 Redis 数据库

    • 总结

      • 当 redis 数据库里面本来操作的是字符串数据的时候,那使用 StringRedisTemplate 即可
      • 数据是复杂的对象类型,那么使用 RedisTemplate 是更好的选择
  • 操作

    • String 结构

      • 存储字符串
      • 存储对象

第 5 集 RedisTemplate 的序列和反序列化机制讲解

简介:RedisTemplate 的序列和反序列化机制讲解

  • 上集问题

    • 同个 key 为啥获取不到值,核心就是序列化机制导致 key 不一样
  • 什么是序列化

    • 把对象转换为字节序列的过程称为对象的序列化。

    • 把字节序列恢复为对象的过程称为对象的反序列化。

    • 对象的序列化主要有两种用途

      • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中
      • 在网络上传送对象的字节序列。
  • Redis 为什么要序列化

    • 性能可以提高,不同的序列化方式性能不一样

    • 可视化工具更好查看

      • 采用默认的 jdk 方式会乱码(POJO 类需要实现 Serializable 接口)
      • 采用 JSON 方式则不用,且可视化工具更好查看
  • 自定义 redis 序列化方式,提供了多种可选择策略

    • JdkSerializationRedisSerializer

      • POJO 对象的存取场景,使用 JDK 本身序列化机制
      • 默认机制 ObjectInputStream/ObjectOutputStream 进行序列化操作
    • StringRedisSerializer

      • Key 或者 value 为字符串
    • Jackson2JsonRedisSerializer

      • 利用 jackson-json 工具,将 pojo 实例序列化成 json 格式存储
    • GenericFastJsonRedisSerializer

      • 另一种 javabean 与 json 之间的转换,同时也需要指定 Class 类型
    • ...

第 6 集 RedisTemplate 序列化机制配置实战

简介:自定义序列化和反序列化机制配置实战

  • 配置实战
@Configuration
public class RedisTemplateConfiguration {
​
    /**
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
​
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
​
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
​
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
​
        // 设置key和value的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
​
        // 设置hashKey和hashValue的序列化规则
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
​
        // 设置支持事物
        //redisTemplate.setEnableTransactionSupport(true);
​
        redisTemplate.afterPropertiesSet();
​
        return redisTemplate;
    }
​
}

第 7 集 SpringBoot 整合 Jedis+Lettuce 客户端连接池配置实战

简介:SpringBoot 整合 Jedis+Lettuce 客户端连接池配置实战

  • 基于 SpringDataRedis 可以快速替换底层实现

    • Lettuce 连接池介绍(添加连接池)

      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
      </dependency>
      
      # 连接池最大连接数(使用负值表示没有限制)
      spring.redis.lettuce.pool.max-active = 10
      ​
      # 连接池中的最大空闲连接
      spring.redis.lettuce.pool.max-idle = 10
      ​
      # 连接池中的最小空闲连接
      spring.redis.lettuce.pool.min-idle = 0
      ​
      # 连接池最大阻塞等待时间(使用负值表示没有限制)
      spring.redis.lettuce.pool.max-wait= -1ms
      ​
      #指定客户端
      spring.redis.client-type = lettuce
      
    • Jedis 连接池介绍(可以不排除 lettuce 依赖包)

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
          <exclusions>
            <exclusion>
              <groupId>io.lettuce</groupId>
              <artifactId>lettuce-core</artifactId>
            </exclusion>
          </exclusions>
      </dependency>
      
      <!--不用指定版本号,本身spring-data-redis里面有-->
      <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
      </dependency>
      
      <dependency>
        <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
          <version>2.6.1</version>
      </dependency>
      
      # 连接池最大连接数(使用负值表示没有限制)
      spring.redis.jedis.pool.max-active = 10
      ​
      # 连接池中的最大空闲连接
      spring.redis.jedis.pool.max-idle = 10
      ​
      # 连接池中的最小空闲连接
      spring.redis.jedis.pool.min-idle = 0
      ​
      # 连接池最大阻塞等待时间(使用负值表示没有限制)
      spring.redis.jedis.pool.max-wait= -1ms
      ​
      #指定客户端
      spring.redis.client-type = jedis
      
  • 断点调试 redisTemplate 的 connectionFactory 实现