我在服务器中使用以下代码,但有时会出现错误cacheVal
为“PONG”或“OK”,以下代码cacheVal
在大多数情况下都是正确的。< / p>
Jedis sjedis = getJedis();
String cacheVal = sjedis.get(key);
答案 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=false
,maxTotal=50K
,maxIdle=25K
,可能是因为多个客户端线程,这可能与尝试同时访问同一个密钥的并发客户端有关时间,但没有帮助。
我尝试升级到最新的jedis(v2.8.1)和redis(v3.2.1),但是我能够复制它,在本地redis实例上也是如此(因此延迟不是问题)。
如果您有任何澄清问题,请告诉我,我可以提供更多详情。
思考..?
答案 1 :(得分:0)
仅供参考 - 我能够复制并解决此问题:
首先发生这种情况的原因是因为我错误地使用try-with-resource
- 基本上在try中返回jedis连接。
下面我列出了使用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
}