From 4663fcdba834b419a21d3cd4629b8bc4588e2935 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Tue, 6 Jun 2023 13:43:53 +0300 Subject: [PATCH] refactoring --- .../org/redisson/RedissonScoredSortedSet.java | 112 +++++++++++------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index b554c2d14..e1d68e55a 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -122,14 +122,18 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } private RFuture poll(int from, int to, RedisCommand command) { - return commandExecutor.evalWriteAsync(getRawName(), codec, command, + return poll(getRawName(), from, to, command); + } + + protected RFuture poll(String name, int from, int to, RedisCommand command) { + return commandExecutor.evalWriteAsync(name, codec, command, "local v = redis.call('zrange', KEYS[1], ARGV[1], ARGV[2]); " + "if #v > 0 then " + "redis.call('zremrangebyrank', KEYS[1], ARGV[1], ARGV[2]); " + "return v; " + "end " + "return v;", - Collections.singletonList(getRawName()), from, to); + Collections.singletonList(name), from, to); } @Override @@ -180,14 +184,18 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } private RFuture pollEntry(int from, int to, RedisCommand command) { - return commandExecutor.evalWriteAsync(getRawName(), codec, command, + return pollEntry(getRawName(), from, to, command); + } + + protected final RFuture pollEntry(String name, int from, int to, RedisCommand command) { + return commandExecutor.evalWriteAsync(name, codec, command, "local v = redis.call('zrange', KEYS[1], ARGV[1], ARGV[2], 'withscores'); " + "if #v > 0 then " + "redis.call('zremrangebyrank', KEYS[1], ARGV[1], ARGV[2]); " + "return v; " + "end " + "return v;", - Collections.singletonList(getRawName()), from, to); + Collections.singletonList(name), from, to); } @Override @@ -216,12 +224,12 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public V pollFirst(long timeout, TimeUnit unit) { return get(pollFirstAsync(timeout, unit)); } - + @Override public RFuture pollFirstAsync(long timeout, TimeUnit unit) { return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.BZPOPMIN_VALUE, getRawName(), toSeconds(timeout, unit)); } - + @Override public V pollFirstFromAny(long timeout, TimeUnit unit, String... queueNames) { return get(pollFirstFromAnyAsync(timeout, unit, queueNames)); @@ -386,7 +394,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public V pollLast(long timeout, TimeUnit unit) { return get(pollLastAsync(timeout, unit)); } - + @Override public RFuture pollLastAsync(long timeout, TimeUnit unit) { return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.BZPOPMAX_VALUE, getRawName(), toSeconds(timeout, unit)); @@ -456,10 +464,11 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture addAndGetRankAsync(double score, V object) { - return commandExecutor.evalWriteAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + String name = getRawName(object); + return commandExecutor.evalWriteAsync(name, LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, "redis.call('zadd', KEYS[1], ARGV[1], ARGV[2]);" + "return redis.call('zrank', KEYS[1], ARGV[2]); ", - Collections.singletonList(getRawName()), new BigDecimal(score).toPlainString(), encode(object)); + Collections.singletonList(name), new BigDecimal(score).toPlainString(), encode(object)); } @Override @@ -474,10 +483,11 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture addAndGetRevRankAsync(double score, V object) { - return commandExecutor.evalWriteAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + String name = getRawName(object); + return commandExecutor.evalWriteAsync(name, LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, "redis.call('zadd', KEYS[1], ARGV[1], ARGV[2]);" + "return redis.call('zrevrank', KEYS[1], ARGV[2]); ", - Collections.singletonList(getRawName()), new BigDecimal(score).toPlainString(), encode(object)); + Collections.singletonList(name), new BigDecimal(score).toPlainString(), encode(object)); } @Override @@ -522,7 +532,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture addIfExistsAsync(double score, V object) { - return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.ZADD_BOOL, getRawName(), "XX", "CH", BigDecimal.valueOf(score).toPlainString(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, codec, RedisCommands.ZADD_BOOL, name, "XX", "CH", BigDecimal.valueOf(score).toPlainString(), encode(object)); } @Override @@ -537,14 +548,16 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture addIfLessAsync(double score, V object) { - return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.ZADD_BOOL, - getRawName(), "LT", "CH", BigDecimal.valueOf(score).toPlainString(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, codec, RedisCommands.ZADD_BOOL, + name, "LT", "CH", BigDecimal.valueOf(score).toPlainString(), encode(object)); } @Override public RFuture addIfGreaterAsync(double score, V object) { - return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.ZADD_BOOL, - getRawName(), "GT", "CH", BigDecimal.valueOf(score).toPlainString(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, codec, RedisCommands.ZADD_BOOL, + name, "GT", "CH", BigDecimal.valueOf(score).toPlainString(), encode(object)); } @Override @@ -596,7 +609,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public RFuture firstScoreAsync() { return commandExecutor.readAsync(getRawName(), codec, RedisCommands.ZRANGE_SINGLE_SCORE, getRawName(), 0, 0, "WITHSCORES"); } - + @Override public Double lastScore() { return get(lastScoreAsync()); @@ -610,7 +623,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture addAsync(double score, V object) { - return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.ZADD_BOOL, getRawName(), BigDecimal.valueOf(score).toPlainString(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, codec, RedisCommands.ZADD_BOOL, name, BigDecimal.valueOf(score).toPlainString(), encode(object)); } @Override @@ -664,7 +678,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc if (objects.isEmpty()) { return new CompletableFutureWrapper<>(0); } - List params = new ArrayList<>(objects.size()*2+1); + List params = new ArrayList<>(objects.size()*2+3); params.add(getRawName()); params.add("XX"); params.add("CH"); @@ -722,7 +736,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture tryAddAsync(double score, V object) { - return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.ZADD_BOOL, getRawName(), "NX", BigDecimal.valueOf(score).toPlainString(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, codec, RedisCommands.ZADD_BOOL, name, "NX", BigDecimal.valueOf(score).toPlainString(), encode(object)); } @Override @@ -732,7 +747,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture addIfAbsentAsync(double score, V object) { - return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.ZADD_BOOL, getRawName(), "NX", BigDecimal.valueOf(score).toPlainString(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, codec, RedisCommands.ZADD_BOOL, name, "NX", BigDecimal.valueOf(score).toPlainString(), encode(object)); } @Override @@ -786,7 +802,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture removeAsync(Object object) { - return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.ZREM, getRawName(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, codec, RedisCommands.ZREM, name, encode(object)); } @Override @@ -829,7 +846,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture containsAsync(Object o) { - return commandExecutor.readAsync(getRawName(), StringCodec.INSTANCE, RedisCommands.ZSCORE_CONTAINS, getRawName(), encode(o)); + String name = getRawName(o); + return commandExecutor.readAsync(name, StringCodec.INSTANCE, RedisCommands.ZSCORE_CONTAINS, name, encode(o)); } @Override @@ -844,7 +862,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture getScoreAsync(V o) { - return commandExecutor.readAsync(getRawName(), StringCodec.INSTANCE, RedisCommands.ZSCORE, getRawName(), encode(o)); + String name = getRawName(o); + return commandExecutor.readAsync(name, StringCodec.INSTANCE, RedisCommands.ZSCORE, name, encode(o)); } @Override @@ -865,7 +884,8 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture rankAsync(V o) { - return commandExecutor.readAsync(getRawName(), codec, RedisCommands.ZRANK_INT, getRawName(), encode(o)); + String name = getRawName(o); + return commandExecutor.readAsync(name, codec, RedisCommands.ZRANK_INT, name, encode(o)); } @Override @@ -875,14 +895,15 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture> rankEntryAsync(V o) { - return commandExecutor.readAsync(getRawName(), codec, RedisCommands.ZRANK_ENTRY, getRawName(), encode(o), "WITHSCORE"); + String name = getRawName(o); + return commandExecutor.readAsync(name, codec, RedisCommands.ZRANK_ENTRY, name, encode(o), "WITHSCORE"); } private ScanResult scanIterator(RedisClient client, long startPos, String pattern, int count) { RFuture> f = scanIteratorAsync(client, startPos, pattern, count); return get(f); } - + public RFuture> scanIteratorAsync(RedisClient client, long startPos, String pattern, int count) { if (pattern == null) { RFuture> f = commandExecutor.readAsync(client, getRawName(), codec, RedisCommands.ZSCAN, getRawName(), startPos, "COUNT", count); @@ -896,12 +917,12 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public Iterator iterator() { return iterator(null, 10); } - + @Override public Iterator iterator(String pattern) { return iterator(pattern, 10); } - + @Override public Iterator iterator(int count) { return iterator(null, count); @@ -920,7 +941,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc protected void remove(Object value) { RedissonScoredSortedSet.this.remove(value); } - + }; } @@ -1062,7 +1083,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc if (c.isEmpty()) { return new CompletableFutureWrapper<>(true); } - + return commandExecutor.evalReadAsync(getRawName(), codec, RedisCommands.EVAL_BOOLEAN, "for j = 1, #ARGV, 1 do " + "local expireDateScore = redis.call('zscore', KEYS[1], ARGV[j]) " @@ -1079,7 +1100,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc if (c.isEmpty()) { return new CompletableFutureWrapper<>(false); } - + List params = new ArrayList(c.size()+1); params.add(getRawName()); encode(params, c); @@ -1096,19 +1117,19 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public boolean retainAll(Collection c) { return get(retainAllAsync(c)); } - + @Override public RFuture retainAllAsync(Collection c) { if (c.isEmpty()) { return deleteAsync(); } - + List params = new ArrayList<>(c.size() * 2); for (Object object : c) { params.add(0); encode(params, object); } - + return commandExecutor.evalWriteAsync(getRawName(), codec, RedisCommands.EVAL_BOOLEAN, "redis.call('zadd', KEYS[2], unpack(ARGV)); " + "local prevSize = redis.call('zcard', KEYS[1]); " @@ -1125,34 +1146,37 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture addScoreAsync(V object, Number value) { - return commandExecutor.writeAsync(getRawName(), DoubleCodec.INSTANCE, RedisCommands.ZINCRBY, - getRawName(), new BigDecimal(value.toString()).toPlainString(), encode(object)); + String name = getRawName(object); + return commandExecutor.writeAsync(name, DoubleCodec.INSTANCE, RedisCommands.ZINCRBY, + name, new BigDecimal(value.toString()).toPlainString(), encode(object)); } - + @Override public Integer addScoreAndGetRank(V object, Number value) { return get(addScoreAndGetRankAsync(object, value)); } - + @Override public RFuture addScoreAndGetRankAsync(V object, Number value) { - return commandExecutor.evalWriteAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + String name = getRawName(object); + return commandExecutor.evalWriteAsync(name, LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, "redis.call('zincrby', KEYS[1], ARGV[1], ARGV[2]); " +"return redis.call('zrank', KEYS[1], ARGV[2]); ", - Collections.singletonList(getRawName()), new BigDecimal(value.toString()).toPlainString(), encode(object)); + Collections.singletonList(name), new BigDecimal(value.toString()).toPlainString(), encode(object)); } @Override public Integer addScoreAndGetRevRank(V object, Number value) { return get(addScoreAndGetRevRankAsync(object, value)); } - + @Override public RFuture addScoreAndGetRevRankAsync(V object, Number value) { - return commandExecutor.evalWriteAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + String name = getRawName(object); + return commandExecutor.evalWriteAsync(name, LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, "redis.call('zincrby', KEYS[1], ARGV[1], ARGV[2]); " +"return redis.call('zrevrank', KEYS[1], ARGV[2]); ", - Collections.singletonList(getRawName()), new BigDecimal(value.toString()).toPlainString(), encode(object)); + Collections.singletonList(name), new BigDecimal(value.toString()).toPlainString(), encode(object)); } @Override