【发布时间】:2021-11-05 23:26:14
【问题描述】:
我使用 redis 列表作为分布式阻塞队列。在客户端,我使用以下代码:
public String tryAquire(String appName, long timeout, TimeUnit timeUnit){
return String.valueOf(redisTemplate.opsForList.rightPop(getKey(appName), timeout, timeUnint));
}
它在内部使用brpop 命令,并且超时值设置为小于50 秒。这项服务可以正常运行大约两周,直到最近 2 天我发现了一些例外情况:
org.springframework.QueryTimeoutException:Redis command time out;
nest exception is io.lettuce.core.RedisCommandException:
Command time out after 200 seconds(s)
这个异常每天出现 1 到 2 次,每天大约有 2000 个请求,在这个异常之后服务器仍然可以正常工作,后续请求的花费时间变得正常,但是抛出这个异常的请求将花费超过 200 秒和这是一个非常糟糕的情况。
这个超时值(200 秒)适合我的 lettuce 客户端命令超时设置。
但是,对于tryAquire(appName, timeout, timeUnit) 方法,最大阻塞时间设置为小于 50 秒。因此,这个命令不应该花费超过 50 秒的时间,因为 50 秒后如果 redis 列表中没有元素,它应该只返回 null 而不是继续等待。似乎没有网络问题,因为日志中没有与套接字相关的异常,并且在redis命令超时异常之后,后续请求执行成功。
【问题讨论】:
标签: java redis spring-data-redis