From 3304e3caefeb38144922e6feea154af9a37220c8 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 21 Apr 2016 17:28:02 +0300 Subject: [PATCH] refactoring --- .../org/redisson/RedissonBaseMapIterator.java | 53 ++++++++++++++----- src/main/java/org/redisson/RedissonMap.java | 47 ++++++++-------- .../java/org/redisson/RedissonMapCache.java | 2 +- .../org/redisson/RedissonMapIterator.java | 2 +- 4 files changed, 69 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/redisson/RedissonBaseMapIterator.java b/src/main/java/org/redisson/RedissonBaseMapIterator.java index 140cf747a..2af67769b 100644 --- a/src/main/java/org/redisson/RedissonBaseMapIterator.java +++ b/src/main/java/org/redisson/RedissonBaseMapIterator.java @@ -34,7 +34,6 @@ abstract class RedissonBaseMapIterator implements Iterator { private Map lastValues; private Iterator> lastIter; protected long nextIterPos; - protected long startPos = -1; protected InetSocketAddress client; private boolean finished; @@ -44,13 +43,22 @@ abstract class RedissonBaseMapIterator implements Iterator { @Override public boolean hasNext() { - if (finished) { - return false; - } - if (lastIter == null || !lastIter.hasNext()) { - if (nextIterPos == -1) { - return false; + if (finished) { + free(firstValues); + free(lastValues); + + currentElementRemoved = false; + removeExecuted = false; + client = null; + firstValues = null; + lastValues = null; + nextIterPos = 0; + + if (!tryAgain()) { + return false; + } + finished = false; } long prevIterPos; do { @@ -61,22 +69,36 @@ abstract class RedissonBaseMapIterator implements Iterator { } lastValues = convert(res.getMap()); client = res.getRedisClient(); - if (startPos == -1) { - startPos = res.getPos(); - } if (nextIterPos == 0 && firstValues == null) { firstValues = lastValues; lastValues = null; + if (firstValues.isEmpty() && tryAgain()) { + client = null; + firstValues = null; + prevIterPos = -1; + } } else { if (firstValues.isEmpty()) { firstValues = lastValues; lastValues = null; + if (firstValues.isEmpty() && tryAgain()) { + continue; + } } else if (lastValues.keySet().removeAll(firstValues.keySet())) { - finished = true; free(firstValues); free(lastValues); + + currentElementRemoved = false; + removeExecuted = false; + client = null; firstValues = null; lastValues = null; + nextIterPos = 0; + prevIterPos = -1; + if (tryAgain()) { + continue; + } + finished = true; return false; } } @@ -84,16 +106,23 @@ abstract class RedissonBaseMapIterator implements Iterator { nextIterPos = res.getPos(); } while (!lastIter.hasNext() && nextIterPos != prevIterPos); if (prevIterPos == nextIterPos && !removeExecuted) { - nextIterPos = -1; + finished = true; } } return lastIter.hasNext(); } + protected boolean tryAgain() { + return false; + } + protected abstract MapScanResult iterator(); private void free(Map map) { + if (map == null) { + return; + } for (Entry entry : map.entrySet()) { entry.getKey().release(); entry.getValue().release(); diff --git a/src/main/java/org/redisson/RedissonMap.java b/src/main/java/org/redisson/RedissonMap.java index e72d4b074..0480dc52f 100644 --- a/src/main/java/org/redisson/RedissonMap.java +++ b/src/main/java/org/redisson/RedissonMap.java @@ -95,7 +95,7 @@ public class RedissonMap extends RedissonExpirable implements RMap { @Override public Future containsKeyAsync(Object key) { - return commandExecutor.readAsync(getName(), codec, RedisCommands.HEXISTS, getName(), key); + return commandExecutor.readAsync(getName(key), codec, RedisCommands.HEXISTS, getName(key), key); } @Override @@ -226,13 +226,13 @@ public class RedissonMap extends RedissonExpirable implements RMap { @Override public Future putIfAbsentAsync(K key, V value) { - return commandExecutor.evalWriteAsync(getName(), codec, EVAL_PUT, + return commandExecutor.evalWriteAsync(getName(key), codec, EVAL_PUT, "if redis.call('hsetnx', KEYS[1], ARGV[1], ARGV[2]) == 1 then " + "return nil " + "else " + "return redis.call('hget', KEYS[1], ARGV[1]) " + "end", - Collections.singletonList(getName()), key, value); + Collections.singletonList(getName(key)), key, value); } @Override @@ -242,7 +242,7 @@ public class RedissonMap extends RedissonExpirable implements RMap { @Override public Future fastPutIfAbsentAsync(K key, V value) { - return commandExecutor.writeAsync(getName(), codec, RedisCommands.HSETNX, getName(), key, value); + return commandExecutor.writeAsync(getName(key), codec, RedisCommands.HSETNX, getName(key), key, value); } @Override @@ -252,13 +252,13 @@ public class RedissonMap extends RedissonExpirable implements RMap { @Override public Future removeAsync(Object key, Object value) { - return commandExecutor.evalWriteAsync(getName(), codec, EVAL_REMOVE_VALUE, + return commandExecutor.evalWriteAsync(getName(key), codec, EVAL_REMOVE_VALUE, "if redis.call('hget', KEYS[1], ARGV[1]) == ARGV[2] then " + "return redis.call('hdel', KEYS[1], ARGV[1]) " + "else " + "return 0 " + "end", - Collections.singletonList(getName()), key, value); + Collections.singletonList(getName(key)), key, value); } @Override @@ -268,14 +268,14 @@ public class RedissonMap extends RedissonExpirable implements RMap { @Override public Future replaceAsync(K key, V oldValue, V newValue) { - return commandExecutor.evalWriteAsync(getName(), codec, EVAL_REPLACE_VALUE, + return commandExecutor.evalWriteAsync(getName(key), codec, EVAL_REPLACE_VALUE, "if redis.call('hget', KEYS[1], ARGV[1]) == ARGV[2] then " + "redis.call('hset', KEYS[1], ARGV[1], ARGV[3]); " + "return 1; " + "else " + "return 0; " + "end", - Collections.singletonList(getName()), key, oldValue, newValue); + Collections.singletonList(getName(key)), key, oldValue, newValue); } @Override @@ -285,7 +285,7 @@ public class RedissonMap extends RedissonExpirable implements RMap { @Override public Future replaceAsync(K key, V value) { - return commandExecutor.evalWriteAsync(getName(), codec, EVAL_REPLACE, + return commandExecutor.evalWriteAsync(getName(key), codec, EVAL_REPLACE, "if redis.call('hexists', KEYS[1], ARGV[1]) == 1 then " + "local v = redis.call('hget', KEYS[1], ARGV[1]); " + "redis.call('hset', KEYS[1], ARGV[1], ARGV[2]); " @@ -293,36 +293,40 @@ public class RedissonMap extends RedissonExpirable implements RMap { + "else " + "return nil; " + "end", - Collections.singletonList(getName()), key, value); + Collections.singletonList(getName(key)), key, value); } @Override public Future getAsync(K key) { - return commandExecutor.readAsync(getName(), codec, RedisCommands.HGET, getName(), key); + return commandExecutor.readAsync(getName(key), codec, RedisCommands.HGET, getName(key), key); } - + + protected String getName(Object key) { + return getName(); + } + @Override public Future putAsync(K key, V value) { - return commandExecutor.evalWriteAsync(getName(), codec, EVAL_PUT, + return commandExecutor.evalWriteAsync(getName(key), codec, EVAL_PUT, "local v = redis.call('hget', KEYS[1], ARGV[1]); " + "redis.call('hset', KEYS[1], ARGV[1], ARGV[2]); " + "return v", - Collections.singletonList(getName()), key, value); + Collections.singletonList(getName(key)), key, value); } @Override public Future removeAsync(K key) { - return commandExecutor.evalWriteAsync(getName(), codec, EVAL_REMOVE, + return commandExecutor.evalWriteAsync(getName(key), codec, EVAL_REMOVE, "local v = redis.call('hget', KEYS[1], ARGV[1]); " + "redis.call('hdel', KEYS[1], ARGV[1]); " + "return v", - Collections.singletonList(getName()), key); + Collections.singletonList(getName(key)), key); } @Override public Future fastPutAsync(K key, V value) { - return commandExecutor.writeAsync(getName(), codec, RedisCommands.HSET, getName(), key, value); + return commandExecutor.writeAsync(getName(key), codec, RedisCommands.HSET, getName(key), key, value); } @Override @@ -347,8 +351,9 @@ public class RedissonMap extends RedissonExpirable implements RMap { return get(fastRemoveAsync(keys)); } - MapScanResult scanIterator(InetSocketAddress client, long startPos) { - Future> f = commandExecutor.readAsync(client, getName(), new ScanCodec(codec), RedisCommands.HSCAN, getName(), startPos); + MapScanResult scanIterator(String name, InetSocketAddress client, long startPos) { + Future> f + = commandExecutor.readAsync(client, name, new ScanCodec(codec), RedisCommands.HSCAN, name, startPos); return get(f); } @@ -423,9 +428,9 @@ public class RedissonMap extends RedissonExpirable implements RMap { public Future addAndGetAsync(K key, Number value) { try { byte[] keyState = codec.getMapKeyEncoder().encode(key); - return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, + return commandExecutor.writeAsync(getName(key), StringCodec.INSTANCE, new RedisCommand("HINCRBYFLOAT", new NumberConvertor(value.getClass())), - getName(), keyState, new BigDecimal(value.toString()).toPlainString()); + getName(key), keyState, new BigDecimal(value.toString()).toPlainString()); } catch (IOException e) { throw new IllegalArgumentException(e); } diff --git a/src/main/java/org/redisson/RedissonMapCache.java b/src/main/java/org/redisson/RedissonMapCache.java index 0b5e495f6..5cb409ef0 100644 --- a/src/main/java/org/redisson/RedissonMapCache.java +++ b/src/main/java/org/redisson/RedissonMapCache.java @@ -530,7 +530,7 @@ public class RedissonMapCache extends RedissonMap implements RMapCac } @Override - MapScanResult scanIterator(InetSocketAddress client, long startPos) { + MapScanResult scanIterator(String name, InetSocketAddress client, long startPos) { RedisCommand> EVAL_HSCAN = new RedisCommand>("EVAL", new ListMultiDecoder(new LongMultiDecoder(), new ObjectMapDecoder(new ScanCodec(codec)), new ObjectListDecoder(codec), new MapCacheScanResultReplayDecoder()), ValueType.MAP); Future> f = commandExecutor.evalReadAsync(client, getName(), codec, EVAL_HSCAN, diff --git a/src/main/java/org/redisson/RedissonMapIterator.java b/src/main/java/org/redisson/RedissonMapIterator.java index a16cfa3f5..5b3c84326 100644 --- a/src/main/java/org/redisson/RedissonMapIterator.java +++ b/src/main/java/org/redisson/RedissonMapIterator.java @@ -29,7 +29,7 @@ public class RedissonMapIterator extends RedissonBaseMapIterator iterator() { - return map.scanIterator(client, nextIterPos); + return map.scanIterator(map.getName(), client, nextIterPos); } protected void removeKey() {