diff --git a/redisson/src/main/java/org/redisson/RedissonList.java b/redisson/src/main/java/org/redisson/RedissonList.java index 2d3faaa5a..0b31ad22b 100644 --- a/redisson/src/main/java/org/redisson/RedissonList.java +++ b/redisson/src/main/java/org/redisson/RedissonList.java @@ -915,4 +915,24 @@ public class RedissonList extends RedissonExpirable implements RList { return commandExecutor.readAsync(getName(), codec, RedisCommands.SORT_LIST, params.toArray()); } + @Override + public RFuture> rangeAsync(int toIndex) { + return rangeAsync(0, toIndex); + } + + @Override + public RFuture> rangeAsync(int fromIndex, int toIndex) { + return commandExecutor.readAsync(getName(), codec, LRANGE, getName(), fromIndex, toIndex); + } + + @Override + public List range(int toIndex) { + return get(rangeAsync(toIndex)); + } + + @Override + public List range(int fromIndex, int toIndex) { + return get(rangeAsync(fromIndex, toIndex)); + } + } diff --git a/redisson/src/main/java/org/redisson/RedissonListMultimapValues.java b/redisson/src/main/java/org/redisson/RedissonListMultimapValues.java index e80a55071..50c44afe9 100644 --- a/redisson/src/main/java/org/redisson/RedissonListMultimapValues.java +++ b/redisson/src/main/java/org/redisson/RedissonListMultimapValues.java @@ -164,18 +164,7 @@ public class RedissonListMultimapValues extends RedissonExpirable implements @Override public RFuture> readAllAsync() { - return commandExecutor.evalReadAsync(getName(), codec, RedisCommands.EVAL_MAP_VALUE_LIST, - "local expireDate = 92233720368547758; " + - "local expireDateScore = redis.call('zscore', KEYS[1], ARGV[2]); " - + "if expireDateScore ~= false then " - + "expireDate = tonumber(expireDateScore) " - + "end; " - + "if expireDate <= tonumber(ARGV[1]) then " - + "return {};" - + "end; " - + "return redis.call('lrange', KEYS[2], 0, -1);", - Arrays.asList(timeoutSetName, getName()), - System.currentTimeMillis(), encodeMapKey(key)); + return rangeAsync(0, -1); } @Override @@ -893,6 +882,37 @@ public class RedissonListMultimapValues extends RedissonExpirable implements return list.sortToAsync(destName, byPattern, getPatterns, order, offset, count); } + @Override + public RFuture> rangeAsync(int toIndex) { + return rangeAsync(0, toIndex); + } + + @Override + public RFuture> rangeAsync(int fromIndex, int toIndex) { + return commandExecutor.evalReadAsync(getName(), codec, RedisCommands.EVAL_MAP_VALUE_LIST, + "local expireDate = 92233720368547758; " + + "local expireDateScore = redis.call('zscore', KEYS[1], ARGV[2]); " + + "if expireDateScore ~= false then " + + "expireDate = tonumber(expireDateScore) " + + "end; " + + "if expireDate <= tonumber(ARGV[1]) then " + + "return {};" + + "end; " + + "return redis.call('lrange', KEYS[2], ARGV[3], ARGV[4]);", + Arrays.asList(timeoutSetName, getName()), + System.currentTimeMillis(), encodeMapKey(key), fromIndex, toIndex); + } + + @Override + public List range(int toIndex) { + return get(rangeAsync(toIndex)); + } + + @Override + public List range(int fromIndex, int toIndex) { + return get(rangeAsync(fromIndex, toIndex)); + } + } diff --git a/redisson/src/main/java/org/redisson/api/RList.java b/redisson/src/main/java/org/redisson/api/RList.java index 4b22d1b6f..5cb13a1a2 100644 --- a/redisson/src/main/java/org/redisson/api/RList.java +++ b/redisson/src/main/java/org/redisson/api/RList.java @@ -92,6 +92,25 @@ public interface RList extends List, RExpirable, RListAsync, RSortable< */ void trim(int fromIndex, int toIndex); + /** + * Returns range of values from 0 index to toIndex. Indexes are zero based. + * -1 means the last element, -2 means penultimate and so on. + * + * @param toIndex - end index + * @return + */ + List range(int toIndex); + + /** + * Returns range of values from fromIndex to toIndex index including. + * Indexes are zero based. -1 means the last element, -2 means penultimate and so on. + * + * @param fromIndex - start index + * @param toIndex - end index + * @return + */ + List range(int fromIndex, int toIndex); + /** * Remove object by specified index * diff --git a/redisson/src/main/java/org/redisson/api/RListAsync.java b/redisson/src/main/java/org/redisson/api/RListAsync.java index 41b51981d..fb7220712 100644 --- a/redisson/src/main/java/org/redisson/api/RListAsync.java +++ b/redisson/src/main/java/org/redisson/api/RListAsync.java @@ -166,4 +166,23 @@ public interface RListAsync extends RCollectionAsync, RSortableAsync removeAsync(Object element, int count); + /** + * Returns range of values from 0 index to toIndex. Indexes are zero based. + * -1 means the last element, -2 means penultimate and so on. + * + * @param toIndex - end index + * @return + */ + RFuture> rangeAsync(int toIndex); + + /** + * Returns range of values from fromIndex to toIndex index including. + * Indexes are zero based. -1 means the last element, -2 means penultimate and so on. + * + * @param fromIndex - start index + * @param toIndex - end index + * @return + */ + RFuture> rangeAsync(int fromIndex, int toIndex); + } diff --git a/redisson/src/main/java/org/redisson/api/RListReactive.java b/redisson/src/main/java/org/redisson/api/RListReactive.java index 25c105210..f24c1d1ca 100644 --- a/redisson/src/main/java/org/redisson/api/RListReactive.java +++ b/redisson/src/main/java/org/redisson/api/RListReactive.java @@ -162,5 +162,24 @@ public interface RListReactive extends RCollectionReactive, RSortableReact * @return void */ Mono fastRemove(int index); + + /** + * Returns range of values from 0 index to toIndex. Indexes are zero based. + * -1 means the last element, -2 means penultimate and so on. + * + * @param toIndex - end index + * @return + */ + Mono> range(int toIndex); + + /** + * Returns range of values from fromIndex to toIndex index including. + * Indexes are zero based. -1 means the last element, -2 means penultimate and so on. + * + * @param fromIndex - start index + * @param toIndex - end index + * @return + */ + Mono> range(int fromIndex, int toIndex); } diff --git a/redisson/src/main/java/org/redisson/api/RListRx.java b/redisson/src/main/java/org/redisson/api/RListRx.java index fadb0b55a..b112882d2 100644 --- a/redisson/src/main/java/org/redisson/api/RListRx.java +++ b/redisson/src/main/java/org/redisson/api/RListRx.java @@ -164,5 +164,24 @@ public interface RListRx extends RCollectionRx, RSortableRx> { * @return void */ Completable fastRemove(int index); + + /** + * Returns range of values from 0 index to toIndex. Indexes are zero based. + * -1 means the last element, -2 means penultimate and so on. + * + * @param toIndex - end index + * @return + */ + Single> range(int toIndex); + + /** + * Returns range of values from fromIndex to toIndex index including. + * Indexes are zero based. -1 means the last element, -2 means penultimate and so on. + * + * @param fromIndex - start index + * @param toIndex - end index + * @return + */ + Single> range(int fromIndex, int toIndex); } diff --git a/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java b/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java index 0f276cf57..7c57dbadb 100644 --- a/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java +++ b/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java @@ -235,6 +235,20 @@ public class RedissonListMultimapTest extends BaseTest { assertThat(map.containsEntry(new SimpleKey("0"), new SimpleValue("2"))).isFalse(); } + @Test + public void testRange() { + RListMultimap map = redisson.getListMultimap("test1"); + map.put(1, 1); + map.put(1, 2); + map.put(1, 3); + map.put(1, 4); + map.put(1, 5); + + assertThat(map.get(1).range(1)).containsExactly(1, 2); + assertThat(map.get(1).range(1, 3)).containsExactly(2, 3, 4); + } + + @Test public void testRemove() { RListMultimap map = redisson.getListMultimap("test1"); diff --git a/redisson/src/test/java/org/redisson/RedissonListTest.java b/redisson/src/test/java/org/redisson/RedissonListTest.java index 7c4c08c42..5cf17d02e 100644 --- a/redisson/src/test/java/org/redisson/RedissonListTest.java +++ b/redisson/src/test/java/org/redisson/RedissonListTest.java @@ -34,6 +34,23 @@ public class RedissonListTest extends BaseTest { assertThat(list.get(1, 2, 3)).containsSequence(2, 3, 4); } + @Test + public void testRange() { + RList list = redisson.getList("list", IntegerCodec.INSTANCE); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + + assertThat(list.range(1)).containsExactly(1, 2); + assertThat(list.range(1, 3)).containsExactly(2, 3, 4); + + list.delete(); + + assertThat(list.range(0, 2)).isEmpty(); + } + @Test public void testSortOrder() { RList list = redisson.getList("list", IntegerCodec.INSTANCE);