使用 Jedis(Java Redis 客户端)使用 MGET 命令查询时,面临 SocketException:管道损坏(写入失败)

问题描述 投票:0回答:1

我有一个用例来识别缓存中存储的过期令牌,因此我通过以下方式实现了一种方法 -

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 客户端如何超时并中断连接,从而导致以下问题,并针对超时提出了一些建议,我已遵循推荐的配置,但似乎仍然面临问题。

java redis jedis
1个回答
0
投票

我可以建议使用

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.