From 3f8e4d765a88691bef6045b74792569d2b4726b5 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 11 Nov 2015 11:50:42 +0300 Subject: [PATCH] iterators infinity scroll fixed. #277 --- src/main/java/org/redisson/RedissonKeys.java | 6 ++++++ src/main/java/org/redisson/RedissonLexSortedSet.java | 6 +++--- src/main/java/org/redisson/RedissonMap.java | 6 ++++++ .../java/org/redisson/RedissonScoredSortedSet.java | 10 ++++++++-- src/main/java/org/redisson/RedissonSet.java | 6 ++++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/redisson/RedissonKeys.java b/src/main/java/org/redisson/RedissonKeys.java index 1d3d1c775..235c39cda 100644 --- a/src/main/java/org/redisson/RedissonKeys.java +++ b/src/main/java/org/redisson/RedissonKeys.java @@ -81,6 +81,7 @@ public class RedissonKeys implements RKeys { private Iterator createKeysIterator(final int slot, final String pattern) { return new Iterator() { + private List firstValues; private Iterator iter; private long iterPos; @@ -91,6 +92,11 @@ public class RedissonKeys implements RKeys { public boolean hasNext() { if (iter == null || !iter.hasNext()) { ListScanResult res = scanIterator(slot, iterPos, pattern); + if (iterPos == 0 && firstValues == null) { + firstValues = res.getValues(); + } else if (res.getValues().equals(firstValues)) { + return false; + } iter = res.getValues().iterator(); iterPos = res.getPos(); } diff --git a/src/main/java/org/redisson/RedissonLexSortedSet.java b/src/main/java/org/redisson/RedissonLexSortedSet.java index a068ae010..19c2428ac 100644 --- a/src/main/java/org/redisson/RedissonLexSortedSet.java +++ b/src/main/java/org/redisson/RedissonLexSortedSet.java @@ -45,7 +45,7 @@ public class RedissonLexSortedSet extends RedissonScoredSortedSet implem @Override public Future removeRangeHeadByLexAsync(String toElement, boolean toInclusive) { String toValue = value(toElement, toInclusive); - return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, RedisCommands.ZREMRANGEBYLEX, getName(), "-", toValue); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.ZREMRANGEBYLEX, getName(), "-", toValue); } @Override @@ -56,7 +56,7 @@ public class RedissonLexSortedSet extends RedissonScoredSortedSet implem @Override public Future removeRangeTailByLexAsync(String fromElement, boolean fromInclusive) { String fromValue = value(fromElement, fromInclusive); - return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, RedisCommands.ZREMRANGEBYLEX, getName(), fromValue, "+"); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.ZREMRANGEBYLEX, getName(), fromValue, "+"); } @Override @@ -64,7 +64,7 @@ public class RedissonLexSortedSet extends RedissonScoredSortedSet implem String fromValue = value(fromElement, fromInclusive); String toValue = value(toElement, toInclusive); - return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, RedisCommands.ZREMRANGEBYLEX, getName(), fromValue, toValue); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.ZREMRANGEBYLEX, getName(), fromValue, toValue); } @Override diff --git a/src/main/java/org/redisson/RedissonMap.java b/src/main/java/org/redisson/RedissonMap.java index 362eb7075..d492c6c38 100644 --- a/src/main/java/org/redisson/RedissonMap.java +++ b/src/main/java/org/redisson/RedissonMap.java @@ -300,6 +300,7 @@ public class RedissonMap extends RedissonExpirable implements RMap { private Iterator> iterator() { return new Iterator>() { + private Map firstValues; private Iterator> iter; private long iterPos = 0; private RedisClient client; @@ -312,6 +313,11 @@ public class RedissonMap extends RedissonExpirable implements RMap { if (iter == null || !iter.hasNext()) { MapScanResult res = scanIterator(client, iterPos); client = res.getRedisClient(); + if (iterPos == 0 && firstValues == null) { + firstValues = (Map) res.getMap(); + } else if (res.getMap().equals(firstValues)) { + return false; + } iter = ((Map)res.getMap()).entrySet().iterator(); iterPos = res.getPos(); } diff --git a/src/main/java/org/redisson/RedissonScoredSortedSet.java b/src/main/java/org/redisson/RedissonScoredSortedSet.java index 3c939722b..e97fad973 100644 --- a/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -80,7 +80,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } public Future removeRangeByRankAsync(int startIndex, int endIndex) { - return commandExecutor.readAsync(getName(), codec, RedisCommands.ZREMRANGEBYRANK, getName(), startIndex, endIndex); + return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZREMRANGEBYRANK, getName(), startIndex, endIndex); } public int removeRangeByScore(double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive) { @@ -90,7 +90,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public Future removeRangeByScoreAsync(double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive) { String startValue = value(BigDecimal.valueOf(startScore).toPlainString(), startScoreInclusive); String endValue = value(BigDecimal.valueOf(endScore).toPlainString(), endScoreInclusive); - return commandExecutor.readAsync(getName(), codec, RedisCommands.ZREMRANGEBYSCORE, getName(), startValue, endValue); + return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZREMRANGEBYSCORE, getName(), startValue, endValue); } private String value(String element, boolean inclusive) { @@ -163,6 +163,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public Iterator iterator() { return new Iterator() { + private List firstValues; private Iterator iter; private RedisClient client; private long iterPos; @@ -175,6 +176,11 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc if (iter == null || !iter.hasNext()) { ListScanResult res = scanIterator(client, iterPos); client = res.getRedisClient(); + if (iterPos == 0 && firstValues == null) { + firstValues = res.getValues(); + } else if (res.getValues().equals(firstValues)) { + return false; + } iter = res.getValues().iterator(); iterPos = res.getPos(); } diff --git a/src/main/java/org/redisson/RedissonSet.java b/src/main/java/org/redisson/RedissonSet.java index 62a304d15..d5d563e29 100644 --- a/src/main/java/org/redisson/RedissonSet.java +++ b/src/main/java/org/redisson/RedissonSet.java @@ -84,6 +84,7 @@ public class RedissonSet extends RedissonExpirable implements RSet { public Iterator iterator() { return new Iterator() { + private List firstValues; private Iterator iter; private RedisClient client; private long iterPos; @@ -96,6 +97,11 @@ public class RedissonSet extends RedissonExpirable implements RSet { if (iter == null || !iter.hasNext()) { ListScanResult res = scanIterator(client, iterPos); client = res.getRedisClient(); + if (iterPos == 0 && firstValues == null) { + firstValues = res.getValues(); + } else if (res.getValues().equals(firstValues)) { + return false; + } iter = res.getValues().iterator(); iterPos = res.getPos(); }