Spring整合Lettuce Redis

2019-12-04  本文已影响0人  tenlee

前言

以关键词【spring lettuce】搜索,大部分博文都是基于配置文件配置的,不太符合某些定制化需求。
所以本文提供两种配置方式。一种基于配置文件,一种基于Java Config。

Java Config配置

增加依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <version>2.2.1.RELEASE</version>
</dependency>
<!-- redis连接池需要-->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
  <version>2.7.0</version>
</dependency>

配置

单机redis配置

    @Bean
    public RedisConnectionFactory redisConnectionFactory(
            @Value("${spring.redis.host}") String host,
            @Value("${spring.redis.port}") Integer port,
            @Value("${spring.redis.pool.max-idle}") Integer maxIdle,
            @Value("${spring.redis.pool.max-wait}") Long maxWaitMillis,
            @Value("${spring.redis.pool.max-active}") Integer maxTotal,
            @Value("${spring.redis.pool.min-idle}") Integer minIdle) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(maxIdle);
        config.setMaxWaitMillis(maxWaitMillis);
        config.setMaxTotal(maxTotal);
        config.setMinIdle(minIdle);

        JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder()
                .usePooling()
                .poolConfig(config)
                .build();

        return new JedisConnectionFactory(new RedisStandaloneConfiguration(host, port), jedisClientConfiguration);
    }

哨兵模式redis配置

public RedisConnectionFactory redisConnectionFactory(
        @Value("#{'${spring.redis.sentinel.nodes}'.split(',')}") Set<String> sentinelNodes,
        @Value("${spring.redis.sentinel.master}") String sentinelMaster,
        @Value("${spring.redis.pool.max-idle}") Integer maxIdle,
        @Value("${spring.redis.pool.max-wait}") Long maxWaitMillis,
        @Value("${spring.redis.pool.max-active}") Integer maxTotal,
        @Value("${spring.redis.pool.min-idle}") Integer minIdle) {
        GenericObjectPoolConfig<?> defaultPoolConfig = new GenericObjectPoolConfig<>();
        defaultPoolConfig.setMaxIdle(maxIdle);
        defaultPoolConfig.setMinIdle(minIdle);
        defaultPoolConfig.setMaxTotal(maxTotal);
        defaultPoolConfig.setMaxWaitMillis(maxWaitMillis);

        LettuceClientConfiguration clientConfig =
            LettucePoolingClientConfiguration.builder().poolConfig(defaultPoolConfig).build();

        RedisSentinelConfiguration configuration =
            new RedisSentinelConfiguration(sentinelMaster, sentinelNodes);

        return new LettuceConnectionFactory(configuration, clientConfig);
    }

参考源码:LettuceConnectionConfiguration:119

image.png

配置文件配置

# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
##连接池最大连接数(使用负值表示没有限制) 默认8
spring.redis.lettuce.pool.max-active=8
## 连接池中的最大空闲连接 默认8
spring.redis.lettuce.pool.max-idle=8
## 连接池中的最小空闲连接 默认0
spring.redis.lettuce.pool.min-idle=0
## 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接超时时间(毫秒)
spring.redis.timeout=200

坑点

lettuce是基于netty的,所以有下面的坑点
https://github.com/lettuce-io/lettuce-core/wiki/Native-Transports
如果项目中依赖的netty低于4.0.26.Final,在linux环境下会导致无法运行。
建议项目中设置netty依赖版本大于等于4.1.11.Final

compile ('io.netty:netty-all:4.1.11.Final')

本人项目依赖了com.dianping.cat:cat,从而间接依赖了compile ('io.netty:netty-all:4.0.24.Final')
导致在linux环境运行一直报错,而macOS开发环境正常,因为macOS和windows环境都是不支持epoll的。

Caused by: java.lang.NoClassDefFoundError: io/netty/channel/unix/DomainSocketAddress
    at io.lettuce.core.EpollProvider.<clinit>(EpollProvider.java:65)
    at io.lettuce.core.Transports$NativeTransports.isSocketSupported(Transports.java:66)
上一篇下一篇

猜你喜欢

热点阅读