diff --git a/src/main/java/org/redisson/RedissonAtomicLong.java b/src/main/java/org/redisson/RedissonAtomicLong.java index fe4a92194..bdcd0f455 100644 --- a/src/main/java/org/redisson/RedissonAtomicLong.java +++ b/src/main/java/org/redisson/RedissonAtomicLong.java @@ -17,8 +17,11 @@ package org.redisson; import java.util.Collections; +import org.redisson.client.codec.LongCodec; import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.RedisCommands; +import org.redisson.client.protocol.RedisStrictCommand; +import org.redisson.client.protocol.convertor.SingleConvertor; import org.redisson.command.CommandAsyncExecutor; import org.redisson.core.RAtomicLong; @@ -88,13 +91,13 @@ public class RedissonAtomicLong extends RedissonExpirable implements RAtomicLong } @Override - public Future getAndAddAsync(long delta) { - return commandExecutor.evalWriteAsync(getName(), - StringCodec.INSTANCE, RedisCommands.EVAL_LONG, - "local v = redis.call('get', KEYS[1]) or 0; " - + "redis.call('set', KEYS[1], v + ARGV[1]); " - + "return tonumber(v)", - Collections.singletonList(getName()), delta); + public Future getAndAddAsync(final long delta) { + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, new RedisStrictCommand("INCRBY", new SingleConvertor() { + @Override + public Long convert(Object obj) { + return ((Long) obj) - delta; + } + }), getName(), delta); } @@ -105,10 +108,7 @@ public class RedissonAtomicLong extends RedissonExpirable implements RAtomicLong @Override public Future getAndSetAsync(long newValue) { - return commandExecutor.evalWriteAsync(getName(), - StringCodec.INSTANCE, RedisCommands.EVAL_LONG, - "local v = redis.call('get', KEYS[1]) or 0; redis.call('set', KEYS[1], ARGV[1]); return tonumber(v)", - Collections.singletonList(getName()), newValue); + return commandExecutor.writeAsync(getName(), LongCodec.INSTANCE, RedisCommands.GETSET, getName(), newValue); } @Override diff --git a/src/main/java/org/redisson/client/protocol/RedisCommands.java b/src/main/java/org/redisson/client/protocol/RedisCommands.java index eafd566fd..95693b9f1 100644 --- a/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -198,6 +198,7 @@ public interface RedisCommands { RedisStrictCommand DEL_VOID = new RedisStrictCommand("DEL", new VoidReplayConvertor()); RedisCommand GET = new RedisCommand("GET"); + RedisCommand GETSET = new RedisCommand("GETSET"); RedisCommand SET = new RedisCommand("SET", new VoidReplayConvertor(), 2); RedisCommand SETPXNX = new RedisCommand("SET", new BooleanNotNullReplayConvertor(), 2); RedisCommand SETNX = new RedisCommand("SETNX", new BooleanReplayConvertor(), 2); diff --git a/src/main/java/org/redisson/reactive/RedissonAtomicLongReactive.java b/src/main/java/org/redisson/reactive/RedissonAtomicLongReactive.java index c3589096f..7132b1822 100644 --- a/src/main/java/org/redisson/reactive/RedissonAtomicLongReactive.java +++ b/src/main/java/org/redisson/reactive/RedissonAtomicLongReactive.java @@ -19,8 +19,11 @@ import java.util.Collections; import org.reactivestreams.Publisher; import org.redisson.api.RAtomicLongReactive; +import org.redisson.client.codec.LongCodec; import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.RedisCommands; +import org.redisson.client.protocol.RedisStrictCommand; +import org.redisson.client.protocol.convertor.SingleConvertor; import org.redisson.command.CommandReactiveExecutor; import reactor.rx.Streams; @@ -64,22 +67,19 @@ public class RedissonAtomicLongReactive extends RedissonExpirableReactive implem } @Override - public Publisher getAndAdd(long delta) { - return commandExecutor.evalWriteReactive(getName(), - StringCodec.INSTANCE, RedisCommands.EVAL_LONG, - "local v = redis.call('get', KEYS[1]) or 0; " - + "redis.call('set', KEYS[1], v + ARGV[1]); " - + "return tonumber(v)", - Collections.singletonList(getName()), delta); + public Publisher getAndAdd(final long delta) { + return commandExecutor.writeReactive(getName(), StringCodec.INSTANCE, new RedisStrictCommand("INCRBY", new SingleConvertor() { + @Override + public Long convert(Object obj) { + return ((Long) obj) - delta; + } + }), getName(), delta); } @Override public Publisher getAndSet(long newValue) { - return commandExecutor.evalWriteReactive(getName(), - StringCodec.INSTANCE, RedisCommands.EVAL_LONG, - "local v = redis.call('get', KEYS[1]) or 0; redis.call('set', KEYS[1], ARGV[1]); return tonumber(v)", - Collections.singletonList(getName()), newValue); + return commandExecutor.writeReactive(getName(), LongCodec.INSTANCE, RedisCommands.GETSET, getName(), newValue); } @Override