【问题标题】:Read Timeout Exception while deleting 1 million keys删除 100 万个键时出现读取超时异常
【发布时间】:2018-02-01 20:25:27
【问题描述】:

我有一个带有一个主设备和两个从设备的 redis HA。我的 redis 中有大约 1000 万个密钥。 对于给定的流程,我将删除大约 100 万个批量大小为 1000 的密钥,并且在其他流程中的模拟密钥被放入 redis。 但是每次执行删除操作时我都会遇到 java.net.SocketTimeoutException: Read timed out。我将超时时间保持在 8 秒。 Redis Delete有什么问题吗?

我正在使用 Jedis 客户端 2.7。

堆栈跟踪:

"redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out":{  
  "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.Connection.getAll",

【问题讨论】:

    标签: redis jedis spring-data-redis


    【解决方案1】:

    因为redis服务器是处理请求的单线程模型。所以所有传入的命令都会一个一个地排队。

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

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

    已编辑。

    也许你应该尝试增量删除和增量放置。例如。每分钟删除 100 个键或 1000 个键。

    如果你的某个key的类型是list或者set或者zset,数据量很大,你可能会延迟删除,先收集,等redis不忙的时候再删除。

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

    【讨论】:

    • 感谢您的快速回复。但是我们使用的是 3.0.7 版本的 Redis。 3.0.7上还有其他方法吗
    • 不太确定编辑后的答案是否对您有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多