diff --git a/redisson/src/main/java/org/redisson/RedissonTimeSeries.java b/redisson/src/main/java/org/redisson/RedissonTimeSeries.java index d65bc3bac..c17817097 100644 --- a/redisson/src/main/java/org/redisson/RedissonTimeSeries.java +++ b/redisson/src/main/java/org/redisson/RedissonTimeSeries.java @@ -111,8 +111,8 @@ public class RedissonTimeSeries extends RedissonExpirable implements RTimeSer } List params = new ArrayList<>(); + params.add(expirationTime); for (Map.Entry entry : objects.entrySet()) { - params.add(expirationTime); params.add(entry.getKey()); byte[] random = new byte[16]; ThreadLocalRandom.current().nextBytes(random); @@ -122,25 +122,24 @@ public class RedissonTimeSeries extends RedissonExpirable implements RTimeSer if (timeToLive > 0) { return commandExecutor.evalWriteAsync(getRawName(), codec, RedisCommands.EVAL_VOID, - "for i = 1, #ARGV, 4 do " + - "local val = struct.pack('Bc0Lc0', string.len(ARGV[i+2]), ARGV[i+2], string.len(ARGV[i+3]), ARGV[i+3]); " + - "redis.call('zadd', KEYS[1], ARGV[i+1], val); " + - "redis.call('zadd', KEYS[2], ARGV[i], val); " + + "for i = 2, #ARGV, 4 do " + + "local val = struct.pack('Bc0Lc0', string.len(ARGV[i+1]), ARGV[i+1], string.len(ARGV[i+2]), ARGV[i+2]); " + + "redis.call('zadd', KEYS[1], ARGV[i], val); " + + "redis.call('zadd', KEYS[2], ARGV[1], val); " + "end; ", Arrays.asList(getRawName(), getTimeoutSetName()), params.toArray()); } return commandExecutor.evalWriteAsync(getRawName(), codec, RedisCommands.EVAL_VOID, - "for i = 1, #ARGV, 4 do " + - "local expirationTime = ARGV[i]; " + - "local values = redis.call('zrangebyscore', KEYS[2], ARGV[i], ARGV[i]); " + - "if #values > 0 then " + - "local lastValue = redis.call('zrange', KEYS[2], -1, -1, 'withscores'); " + - "expirationTime = tonumber(lastValue[2]) + 1; " + - "end; " + - "local val = struct.pack('Bc0Lc0', string.len(ARGV[i+2]), ARGV[i+2], string.len(ARGV[i+3]), ARGV[i+3]); " + - "redis.call('zadd', KEYS[1], ARGV[i+1], val); " + - "redis.call('zadd', KEYS[2], expirationTime, val); " + + "local expirationTime = ARGV[1]; " + + "local lastValues = redis.call('zrange', KEYS[2], -1, -1, 'withscores'); " + + "if (#lastValues > 0 and tonumber(lastValues[2]) > tonumber(ARGV[1])) then " + + "expirationTime = tonumber(lastValues[2]); " + + "end; " + + "for i = 2, #ARGV, 4 do " + + "local val = struct.pack('Bc0Lc0', string.len(ARGV[i+1]), ARGV[i+1], string.len(ARGV[i+2]), ARGV[i+2]); " + + "redis.call('zadd', KEYS[1], ARGV[i], val); " + + "redis.call('zadd', KEYS[2], expirationTime + 1, val); " + "end; ", Arrays.asList(getRawName(), getTimeoutSetName()), params.toArray());