SpringBoot項目Redis兩種實現Lettuce和Jedis比較

Jedis是直連模式,在多個線程間共享一個Jedis實例時是線程不安全的,可以通過創建多個Jedis實例來解決,但當連接數量增多時,物理連接成本就較高同時會影響性能,因此較好的解決方法是使用JedisPool。

Lettuce的連接是基於Netty的,連接實例可以在多個線程間共享,Netty可以使多線程的應用使用同一個連接實例,而不用擔心併發線程的數量。通過異步的方式可以讓我們更好地利用系統資源。

1、Jedis集成使用

1.1、pom.xml中添加redis相關依賴

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.3</version>
</dependency>

1.2、redis配置文件

spring.redis.port=6377
spring.redis.timeout=20000
spring.redis.host=127.0.0.1
spring.redis.password=123456
# Redis數據庫索引(默認爲0)
spring.redis.database=1
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=3000
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=10000
# 連接池中的最大空閒連接
spring.redis.jedis.pool.max-idle=200
# 連接池中的最小空閒連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=10000

1.3、RedisConfig配置及注入

@Configuration
@PropertySource("classpath:/redis/redis.properties")
public class RedisConfig {
    @Bean
    public JedisPool redisPoolFactory()  throws Exception{
        logger.info("JedisPool注入成功!!");
        logger.info("redis地址:" + host + ":" + port);
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        // 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true
        jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
        // 是否啓用pool的jmx管理功能, 默認true
        jedisPoolConfig.setJmxEnabled(true);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password, database);
        return jedisPool;
    }
}

2、Lettuce集成使用

2.1、pom.xml中添加lettuce相關依賴

<!-- Redis Lettuce實現 -->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      <!-- <version>2.1.3.RELEASE</version>-->
</dependency>
<!-- lettuce pool連接池 -->
<dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
</dependency>


2.2、lettuce配置文件

spring.redis.host=127.0.0.1
spring.redis.port=6377
# 密碼 沒有則可以不填
spring.redis.password=123456
spring.redis.database=1
spring.redis.timeout=20000
# 如果使用的jedis 則將lettuce改成jedis即可
# 最大活躍鏈接數
spring.redis.lettuce.pool.max-active=3000
spring.redis.lettuce.pool.max-wait=10000
# 最大空閒連接數
spring.redis.lettuce.pool.max-idle=200
# 最小空閒連接數
spring.redis.lettuce.pool.min-idle=0

2.3、RedisConfig配置及注入

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
    /**
     * 配置自定義redisTemplate
     * @return
     */
    @Bean
    RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(redisConnectionFactory);

        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        template.setValueSerializer(serializer);
        //使用StringRedisSerializer來序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章