SpringBoot2.x整合Redis6客户端

一 java语言客户端

  • Jedis 是直连模式,在多个线程间共享一个 Jedis 实例时是线程不安全的,需要使用连接池
    其API提供了比较全面的Redis命令的支持,相比于其他Redis 封装框架更加原生
    Jedis中的方法调用是比较底层的暴露的Redis的API,Java方法基本和Redis的API保持着一致
    使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,不支持异步操作

  • lettuce
    高级Redis客户端,用于线程安全同步,异步响应
    基于Netty的的事件驱动,可以在多个线程间并发访问, 通过异步的方式可以更好的利用系统资源

二 集成

  • 添加依赖 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

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

四 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连接池介绍

<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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值