错误:redis缓存中的值为“PONG”或“OK”

时间:2016-03-16 02:03:50

标签: redis

我在服务器中使用以下代码,但有时会出现错误cacheVal为“PONG”或“OK”,以下代码cacheVal在大多数情况下都是正确的。< / p>

Jedis sjedis = getJedis();
String cacheVal = sjedis.get(key);

2 个答案:

答案 0 :(得分:0)

您是否有机会解决此问题或解决此问题?

我遇到了完全相同的问题,这种情况大约占1%。

@WebFilter(displayName = "EncryptionFilter", urlPatterns = "/*") public class EncryptionFilter implements Filter { private final Logger logger = org.slf4j.LoggerFactory.getLogger(EncryptionFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { byte[] data = "{\"currentClientVersion\":{\"majorElement\":\"1\",\"minorElement\":\"2\"}}".getBytes(); logger.debug("data string " + data.toString()); logger.debug("Content-type before: " + servletRequest.getContentType()); HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletRequestWritableWrapper requestWrapper = new HttpServletRequestWritableWrapper(request, data); //logger.debug("Accept Header: " + requestWrapper.getHeader("Accept")); //logger.debug("Content-Type: " + requestWrapper.getHeader("Content-Type")); //logger.debug("Contenttype" + requestWrapper.getContentType()); filterChain.doFilter(requestWrapper, servletResponse); } @Override public void destroy() { } } 字面上返回字符串“PONG”或“OK”。下一个实例中的相同调用将返回预期值。

我正在使用jedisPool,主要是所有默认连接池设置,但仅添加了jedis.get(key)(我知道将使用redis播放ping / pong来验证它正在保持的连接,我需要这种可靠性)。

testOnBorrow=true

我还注意到,当我设置public Jedis getConnection() { try (Jedis jedis = jedisPool.getResource()) { return jedis; } catch (JedisConnectionException ex) { String errorMessage = String.format(REDIS_CONNECTION_ERROR_MESSAGE, redisHost, redisPort); LOGGER.error(errorMessage, ex); throw new JedisConnectionException(errorMessage, ex); } } 时,不会返回值“PONG”,但仍会返回“OK”。

我还增加了testOnBorrow=falsemaxTotal=50KmaxIdle=25K,可能是因为多个客户端线程,这可能与尝试同时访问同一个密钥的并发客户端有关时间,但没有帮助。

我尝试升级到最新的jedis(v2.8.1)和redis(v3.2.1),但是我能够复制它,在本地redis实例上也是如此(因此延迟不是问题)。

如果您有任何澄清问题,请告诉我,我可以提供更多详情。

思考..?

答案 1 :(得分:0)

仅供参考 - 我能够复制并解决此问题:

首先发生这种情况的原因是因为我错误地使用try-with-resource - 基本上在try中返回jedis连接。

  • 如果在我完成jedis连接后调用了close()(大多数情况下它都非常快),我没有例外。
  • 但是如果在使用返回的jedis连接时调用了close(),我会得到异常 - {socket closed或PONG或OK}(并注意我有testOnBorrow = true)

下面我列出了使用jedisPool的正确和错误方法

使用jedisPool的方法不正确: try (Jedis jedis = jedisPool.getResource()) { return jedis; } catch (JedisConnectionException ex) { //exception handling }

正确使用jedisPool的方法: try (Jedis jedis = jedisPool.getResource()) { //complete all the work you need to do with jedis //you may return computed value or anything else but not jedis connection } catch (JedisConnectionException ex) { //exception handling }