美文网首页
我们是否真的需要配置redis的lettuce连接池?

我们是否真的需要配置redis的lettuce连接池?

作者: water_lang | 来源:发表于2023-02-17 18:33 被阅读0次

结论:

Lettuce连接被设计为线程安全的,所以一个连接所以被多个线程共同使用,也就是说在大多数情况下连接池不是必需的,他只有在某些特殊的场景下使用连接池才会带来比较大的正向收益,比如使用了Pipeline或者事务。

配置讲解

我们先看一张图:
图片.png

配置

application.properties

spring.redis.host=host  
spring.redis.database=0  
spring.redis.password=pwd  
spring.redis.port=port  
# Connection timeout.
spring.redis.timeout=1000  
# Maximum number of connections in the connection pool. A negative value indicates no limit.
spring.redis.lettuce.pool.max-active=50  
# Minimum number of idle connections in the connection pool.
spring.redis.lettuce.pool.min-idle=5  
# Maximum number of idle connections in the connection pool.
spring.redis.lettuce.pool.max-idle=50  
# Maximum time for waiting for connections in the connection pool. A negative value indicates no limit.
spring.redis.lettuce.pool.max-wait=5000  
# Interval for scheduling an eviction thread.
spring.redis.pool.time-between-eviction-runs-millis=2000  

配置RedisConfiguration

@Bean  
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {  
    lettuceConnectionFactory.setShareNativeConnection(true);  
    RedisTemplate<String, Object> template = new RedisTemplate<>();  
    template.setConnectionFactory(lettuceConnectionFactory);  
    // Use Jackson2JsonRedisSerializer to replace the default JdkSerializationRedisSerializer to serialize and deserialize the Redis value.
    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);  
    ObjectMapper mapper = new ObjectMapper();  
    mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);  
    mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,  
        ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);  
    jackson2JsonRedisSerializer.setObjectMapper(mapper);  
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();  
    // String serialization of keys
    template.setKeySerializer(stringRedisSerializer);  
    // String serialization of hash keys
    template.setHashKeySerializer(stringRedisSerializer);  
    // Jackson serialization of values
    template.setValueSerializer(jackson2JsonRedisSerializer);  
    // Jackson serialization of hash values
    template.setHashValueSerializer(jackson2JsonRedisSerializer);  
    template.afterPropertiesSet();  
    return template;  
}  

把上面的原理图和配置文件我们对应起来看,我们能看到 lettuceConnectionFactory.setShareNativeConnection(true)这句代码,他代表的是多个线程操作的是同一个redis-client连接,也就是在redis-server这边可以看到只有一长连接(可以通过命令...查看到),这种就是图上的标注为“(a)”的线路逻辑。在我们平时通过非阻塞性的操作时(比如只是简单的get,set一个Key)这种多线程和单线程且单连接的性能差不太多。

现在我们把相关的代码改为false时: lettuceConnectionFactory.setShareNativeConnection(false),意味着会产生多个redis-client连接。有了多个本地redis-client连接大家普遍会认为这种性能会比单线程高,实际上他的性能大部分场景下比单个连接性能更低,大家可以去写代码去测试一下。所以这种场景一般是放在有很多阻塞性操作(事务,Pipeline)时才会使用。

具体详情可以看lettuce的官方对应章节:https://lettuce.io/core/5.3.1.RELEASE/reference/#connection-pooling.is-connection-pooling-necessary

相关文章

网友评论

      本文标题:我们是否真的需要配置redis的lettuce连接池?

      本文链接:https://www.haomeiwen.com/subject/zfqvkdtx.html