我正在使用 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
如果您有任何建议来防止此类问题,我们将不胜感激。
注意:后备机制正在按预期工作。
谢谢
我还遇到了涉及
RedisTimeoutException
的问题,我找到的解决方案是增加配置对象的 RetryInterval
属性。
此属性的默认值为 1500 毫秒,您在此处将其设置为 0。根据 Redisson Wiki,增加此值可能会给 Redisson 在操作失败之前多一点时间。
由于我过去一直在解决这个问题,我希望这个答案能为您提供一些信息,以防止出现此类情况。
原因有多种:
首先尝试为 nettyThreads 设置以下值:32、64、128、256,这允许 Redisson 获得空闲的 netty 线程来解码响应或发送命令。接下来,尝试将 retryInterval 和/或超时增加到合理的值,以便命令仍然可以正常失败,而无需最终用户永远等待。最后一步,尝试增加连接池设置,以便Redisson有更好的机会获得空闲连接。
Lua 脚本中的 key、hmget 和大循环等复杂命令比其他命令更有可能看到它。重要的是要了解,尽管 Redis 慢速日志中没有操作,但操作仍然可能超时。 Slowlogs 仅记录 Redis 事件循环处理命令的时间,而不记录之前或之后的任何内容。当响应仍在进行中时,网络问题也可能会导致此异常。