删除100万个密钥时读取超时异常

时间:2017-08-24 05:13:23

标签: redis jedis spring-data-redis

我有一个主机和两个从机的redis HA。我的redis中有大约1000万个键。 对于给定的流程,我将删除批量大小为1000的大约1百万个密钥,并且在其他流程密钥中的simulatneoulsy将被放入redis中。 但每次执行删除操作时我遇到java.net.SocketTimeoutException:读取超时。我保持超时8秒。 Redis删除有什么问题吗?

我正在使用Jedis cleint 2.7。

堆栈跟踪: " redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException:read timed out":{
      " RedisInputStream.java:201":" redis.clients.util.RedisInputStream.ensureFill&#34 ;,       " RedisInputStream.java:40":" redis.clients.util.RedisInputStream.readByte&#34 ;,       " Protocol.java:141":" redis.clients.jedis.Protocol.process&#34 ;,       " Protocol.java:205":" redis.clients.jedis.Protocol.read&#34 ;,       " Connection.java:297":" redis.clients.jedis.Connection.readProtocolWithCheckingBroken&#34 ;,       " Connection.java:267":" redis.clients.jedis.Connection.getAll&#34 ;,       " Connection.java:259":" redis.clients.jedis.Connection.getAll",

1 个答案:

答案 0 :(得分:0)

因为redis服务器是进程请求的单线程模型。因此,所有命令传入将逐个排队。

关于DEL操作,它不仅从键空间中删除键,它还将阻塞,直到键的所有内存都是空闲的。所以它会降低你的redis服务器的速度。你可以试试UNLINK命令。

  

此命令与DEL非常相似:它删除指定的键。就像DEL一样,如果密钥不存在则会被忽略。但是,该命令在另一个线程中执行实际的内存回收,因此它不会阻塞,而DEL则是。这是命令名称的来源:命令只是从键空间取消链接键。实际删除将在以后异步发生。

编辑。

也许您应该尝试逐步删除和逐步放置。例如。每分钟删除100个键或1000个键。

如果您的某些密钥的类型是list或set或zset,其中包含大量数据,您可以将其删除,首先收集它们,然后在redis不是很繁忙时删除它们。

如果你的put数据流也是这个批量加载大数据到redis,逐步推出。