我们最近将应用程序升级到了Spring Boot 2(2.0.3.RELEASE)。随同Spring Data Redis一起升级到了2.0.8.RELEASE。我们从使用Jedis切换到Lettuce,因为引导升级文档说这是默认设置。
我将生菜连接池定义为:
spring:
redis:
ssl: true
lettuce:
pool:
max-active: 250
max-idle: 250
min-idle: 50
max-wait: 2000ms
shutdown-timeout: 100ms
我今天注意到在一台开发服务器上,在进行Redis读/写时,我们遇到了很多线程阻塞的情况。路径如下所示:
io.lettuce.core.internal.AbstractInvocationHandler:invoke:80
|
|__io.lettuce.core.FutureSyncInvocationHandler:handleInvocation:62
|
|__io.lettuce.core.LettuceFutures:awaitOrCancel:112
|
|__io.lettuce.core.protocol.AsyncCommand:await:81
|
|__java.util.concurrent.locks.LockSupport:parkNanos:215
有时我们看到线程等待2秒,有时我们看到它等待19秒。
我开始研究Spring Redis的其他选项,例如管道。
https://github.com/lettuce-io/lettuce-core/wiki/Asynchronous-API
我遇到的问题是我找不到让LettuceConnection异步的方法。我看到流水线时调用了LettuceConnection.getAsyncConnection()。据我所知,流水线仅在使用RedisTemplate时可用。从Spring Data Redis 2开始,RedisCacheManager不再使用RedisTemplate。它使用RedisCacheConfiguration。
所以,我的问题是我们如何使用Spring Cache Abstraction(RedisCacheManager)进行异步Redis?