Java Redisson 客户端 Redis 异常:org.redisson.client.RedisTimeoutException

问题描述 投票:0回答:2

我正在使用 AWS Elasticache Redis 版本 7.0.7

设置 Redis 缓存层

我使用Java Redisson客户端版本3.16.0和java版本1.8

但是,其中一个要求是设置回退机制,以便在 Redis 操作出现任何异常时回退到下游服务或数据库方法

以下是我的Redisson客户端配置

redissonConfig.setNettyThreads(128);
redissonConfig.useClusterServers()
        .setKeepAlive(true)
        .setConnectTimeout(5000)
        .setRetryAttempts(0)
        .setRetryInterval(0)
        .setPingConnectionInterval(10000)
        .setDnsMonitoringInterval(20000)
        .addNodeAddress(redisAddress);
RedissonClient client = Redisson.create(redissonConfig);
return client;

但是,我在读/写和驱逐 Redis 操作时出现间歇性异常

1-读写操作例外:

exception: org.redisson.client.RedisTimeoutException: Command still hasn't been written into connection! Try to increase nettyThreads setting. Payload size in bytes: 52. Node source: NodeSource [slot=8995, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@573846890 [redisClient=[addr=rediss://xxxxx:6379], channel=[id: 0x93e5c3e6, L:/:38098 - R:xxx], currentCommand=null], command: (EVAL), params: [local value = redis.call('hget', KEYS[1], ARGV[2]); if value == false then return nil; end; local t,..., 5, data, redisson__timeout__set:{data}, redisson__idle__set:{data}, redisson__map_cache__last_access__set:{data}, {data}:redisson_options, 1684331276823, PooledUnsafeDirectByteBuf(ridx: 0, widx: 52, cap: 256)] after 0 retry attempts

2- 当 Redisson 作业尝试逐出缓存时出现异常,我通过 redis-cli 手动逐出来解决此问题

exception: org.redisson.client.RedisException: ERR user_script:1: bad argument #2 to 'unpack' (data string too short) script: 401d7fca9b4e9022dffaa4fd236958c2babbc2f3, on @user_script:1.. channel: [id: 0x064bccc5

如果您有任何建议来防止此类问题,我们将不胜感激。

注意:后备机制正在按预期工作。

谢谢

java caching redis redisson
2个回答
0
投票

我还遇到了涉及

RedisTimeoutException
的问题,我找到的解决方案是增加配置对象的
RetryInterval
属性。

此属性的默认值为 1500 毫秒,您在此处将其设置为 0。根据 Redisson Wiki,增加此值可能会给 Redisson 在操作失败之前多一点时间。

由于我过去一直在解决这个问题,我希望这个答案能为您提供一些信息,以防止出现此类情况。


0
投票

原因有多种:

  • 所有netty线程都很忙,导致Redis响应解码和向Redis发送命令都有延迟。
  • 所有连接都繁忙。
  • Redis 服务器繁忙,响应请求时间过长。
  • Java 应用程序正忙。
  • 阻止异步/反应/接收监听器中的调用。
  • 服务器CPU节流。对于 GCP 托管,请尝试将 --no-cpu-throttle 添加到 CloudRun 容器,该容器通过 Redisson 连接到 Redis 实例。
  • 网络不稳定,TCP 丢包。
  • Redis 供应商限制并发连接数。

首先尝试为 nettyThreads 设置以下值:32、64、128、256,这允许 Redisson 获得空闲的 netty 线程来解码响应或发送命令。接下来,尝试将 retryInterval 和/或超时增加到合理的值,以便命令仍然可以正常失败,而无需最终用户永远等待。最后一步,尝试增加连接池设置,以便Redisson有更好的机会获得空闲连接。

Lua 脚本中的 key、hmget 和大循环等复杂命令比其他命令更有可能看到它。重要的是要了解,尽管 Redis 慢速日志中没有操作,但操作仍然可能超时。 Slowlogs 仅记录 Redis 事件循环处理命令的时间,而不记录之前或之后的任何内容。当响应仍在进行中时,网络问题也可能会导致此异常。

© www.soinside.com 2019 - 2024. All rights reserved.