在Redisson上设置长TTL-- DragonFlyDB

yhqotfr8  于 2023-11-16  发布在  Redis
关注(0)|答案(1)|浏览(143)

我正在尝试为Redisson上的键值设置大TTL(10天以上)。
我注意到Redisson将TTL转换为毫秒并在Redis(DragonFlyDB)上执行命令。

org.redisson.client.RedisException: ERR value is not an integer or out of range. channel: [id: 0xfa05de9e, L:/127.0.0.1:32812 - R:localhost/127.0.0.1:32773] command: (PSETEX), promise: java.util.concurrent.CompletableFuture@67330d28[Not completed], params: [hello, 864000000, PooledUnsafeDirectByteBuf(ridx: 0, widx: 8, cap: 256)]

字符串
864000000不大于最大值Integer
DragonFly(https://github.com/dragonflydb/dragonfly)有没有办法存档这个?

override fun cacheString(key: String, value: String, ttl: Duration): RFuture<Void> {
       val result = redisClient.getBucket<String>(key).setAsync(value, ttl.seconds, TimeUnit.SECONDS)
       return result
}

val failResult = cacheMangerService.cacheString("hello", "world", Duration.ofDays(10)) // throw Exception

val succesResult = cacheMangerService.cacheString("hello", "world", Duration.ofDays(3)) // Successful


编辑:我把DragonFlyDB切换到RedisCluster -->和864000000工作。所以它似乎只适用于DragonFlyDB。
已解决:由于某些原因,它只发生在setAsync中设置TTL而不是用expire()手动设置TTL时。
感谢您的阅读

pieyvz9o

pieyvz9o1#

解决方法:出于某种原因,它只发生在setAsync中设置TTL时,而不是使用expire()手动设置TTL--> expire()使用eval srcipt。

val bucket = getBucket(buildKey(key))
bucket.setAsync(value).handleAsync { _, throwable ->
  if (throwable != null) {
    logger.error("Error in caching value: ", throwable)
  } else {
    bucket.expireAsync(ttl).handleAsync { rs, throwable ->
      if (throwable != null || !rs) {
        // If expire error then remove the value
        logger.error("Error in set expire for value: ", throwable)
        bucket.delete()
      }
    }
  }
}

字符串

相关问题