2015-09-07 63 views
2

我使用的Redis在Servlet過濾器認證,並且我沒有修改redis.confJedis破管例外

jedis = new Jedis("localhost"); 
String authToken = jedis.get(uid); 

2號線拋出異常。

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe 
redis.clients.jedis.Connection.flush(Connection.java:291) 
redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:214) 
redis.clients.jedis.Connection.getBulkReply(Connection.java:205) 
redis.clients.jedis.Jedis.get(Jedis.java:105) 
filter.AuthFilter.doFilter(AuthFilter.java:38) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

回答

0

參考GET for Redis DOC:

如果存儲在關鍵值不是一個字符串,因爲GET只處理字符串值,則返回錯誤。

所以,UID是字符串類型?

2

連接似乎被重置/斷開。當您使用長連接的連接時(例如在應用程序啓動時連接到Redis,然後反覆使用連接),可能會發生這種情況。

可能的解決方案是:在需要的時候

  1. 使用JedisPool獲得連接,並使用它
  2. 重新連接,如果連接斷開後返回它(需要一定的try/catch魔術以防止錯誤傳播您的應用程序邏輯)
  3. 連接此刻的你所需要的連接,並斷開之後

也有Java的CLI的Redis的提供透明重新連接這意味着你永遠不會看到一個插座異常(lettuceredisson)已廢除。