2017-08-24 110 views
0

我有一個主控和兩個從屬的redis HA。我的redis中有大約1000萬個密鑰。 對於給定的流程,我將刪除大約100萬個密鑰,批量大小爲1000,其他流量密鑰中的模擬密鑰正在放入redis中。 但每次執行刪除操作時遇到java.net.SocketTimeoutException:讀取超時。我在8秒鐘超時。 Redis刪除有問題嗎?在刪除100萬個密鑰時讀取超時異常

我正在使用Jedis cleint 2.7。

堆棧跟蹤: 「redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException:讀超時」:{
「RedisInputStream.java:201":"redis.clients.util.RedisInputStream。 ensureFill「, 」RedisInputStream.java:40":"redis.clients.util.RedisInputStream.readByte「, 」Protocol.java:141":"redis.clients.jedis.Protocol.process「, 」Protocol.java :205「:」redis.clients.jedis.Protocol.read「, 」Connection.java:297":"redis.clients.jedis.Connection.readProtocolWithCheckingBroken「, 」Connection.java:267":"redis.clients .jedis.Connection.getAll「, 」Connection.java:259":"redis.clients.jedis.C onnection.getAll「,

+0

你能分享一些你的代碼嗎?並進一步stacktrace? – sazzad

回答

0

因爲redis服務器是進程請求的單線程模型。所以傳入的所有命令都會一個接一個排隊。

關於DEL操作,它不僅僅從密鑰空間中刪除密鑰,它還將阻塞,直到密鑰的所有內存都是空閒的。所以它會減慢你的redis服務器。你可以嘗試UNLINK命令。

此命令與DEL非常相似:它刪除指定的鍵。就像DEL鍵一樣,如果它不存在,它將被忽略。但是,該命令在不同的線程中執行實際的內存回收,因此它不會被阻塞,而DEL是。這是命令名稱的來源:該命令只是將鍵與鍵空間斷開連接。實際的刪除將在晚些時候異步完成。

EDITED。

也許你應該嘗試增量刪除和增量式放置。例如。每分鐘刪除100個鍵或1000個鍵。

如果您的某個鍵的類型是列表或設置或擁有巨大數據的zset,您可能會延遲刪除它,首先收集它們,然後在redis不是非常繁忙時刪除它們。

如果你把數據流也是這個批量加載到redis中的大數據,增量放置。

+0

感謝您的快速回復。但我們正在使用Redis的3.0.7版本。 3.0.7 – user3134614

+0

有沒有其他的方式不太確定編輯答案是否可以幫助你。 – GuangshengZuo