我有一个用例来识别缓存中存储的过期令牌,因此我通过以下方式实现了一种方法 -
private Boolean isTokenExpired(long programId,String token,Jwt jwt){
try {
if(!jedis.isConnected() || generalConfigHelper.getInt(REDIS_DB_INDEX) != jedis.getDB()){
jedis=redisHelper.getConnection();
jedis.select(generalConfigHelper.getInt(REDIS_DB_INDEX));
}
Claims claims = (Claims) jwt.getBody();
//redis keys
String tokenCacheKey=programId+":Tokens:"+token;
String expiryTimeKey=programId+":InvalidateTokensBefore:"+claims.get("user_id");
List<String> values=jedis.mget(tokenCacheKey,expiryTimeKey);
if (values.get(0)!=null){
return true;
}else if (values.get(1)!=null){
log.info("redis: exp value:"+values.get(1));
long exp=Long.parseLong(claims.get("exp_ms")+"");
return exp<Long.parseLong(values.get(1)+"");
}
}
catch (Exception ex){
log.info("Error while reading from redis:"+ex);
} finally {
log.debug("Returning jedis instance to the pool");
redisHelper.closeConnection(jedis);
}
return false;
}
上面的代码首先检查客户端是否连接到资源池并继续执行 select 和 mget 命令,在执行以下命令期间,我面临以下异常 - SocketException: Broken pipeline (Write failed) 和 SocketException: Socket is关闭。
我的 Jedis 池配置 - 最大总计 - 512 最大空闲 - 32 最小空闲 - 8 超时 - 10000 毫秒
在研究这些异常时,我发现这些 GitHub 问题突出了这些异常 - https://github.com/mozilla/gcp-ingestion/issues/451 https://github.com/redis/jedis/issues/185
这些问题突出显示了 Redis 客户端如何超时并中断连接,从而导致以下问题,并针对超时提出了一些建议,我已遵循推荐的配置,但似乎仍然面临问题。
我可以建议使用
redisHelper.getConnectionPool()
而不是使用全局 jedis 变量吗?
private Boolean isTokenExpired(long programId, String token, Jwt jwt) {
try (Jedis jedis = redisHelper.getConnectionPool()) {
jedis.select(generalConfigHelper.getInt(REDIS_DB_INDEX));
...
...
} catch (Exception ex) {
log.info("Error while reading from redis:", ex); // not sure which logger
// you're using but you should use this option if possible
}
return false;
}