From f9b7567263c8fc64aedd1d75005748f10a6051d5 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 26 Jul 2019 11:47:49 +0300 Subject: [PATCH] Fixed - RKeys.deleteByPatternAsync doesn't work in batch mode #2216 --- .../main/java/org/redisson/RedissonKeys.java | 15 ++++++++++ .../java/org/redisson/RedissonKeysTest.java | 28 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/redisson/src/main/java/org/redisson/RedissonKeys.java b/redisson/src/main/java/org/redisson/RedissonKeys.java index 0877ec77a..720008657 100644 --- a/redisson/src/main/java/org/redisson/RedissonKeys.java +++ b/redisson/src/main/java/org/redisson/RedissonKeys.java @@ -17,6 +17,7 @@ package org.redisson; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -47,6 +48,8 @@ import org.redisson.connection.MasterSlaveEntry; import org.redisson.misc.CompositeIterable; import org.redisson.misc.RPromise; import org.redisson.misc.RedissonPromise; +import org.redisson.reactive.CommandReactiveBatchService; +import org.redisson.rx.CommandRxBatchService; /** * @@ -210,6 +213,18 @@ public class RedissonKeys implements RKeys { @Override public RFuture deleteByPatternAsync(String pattern) { + if (commandExecutor instanceof CommandBatchService + || commandExecutor instanceof CommandReactiveBatchService + || commandExecutor instanceof CommandRxBatchService) { + return commandExecutor.evalWriteAsync((String)null, null, RedisCommands.EVAL_LONG, + "local keys = redis.call('keys', ARGV[1]) " + + "local n = 0 " + + "for i=1, #keys,5000 do " + + "n = n + redis.call('del', unpack(keys, i, math.min(i+4999, table.getn(keys)))) " + + "end " + + "return n;", Collections.emptyList(), pattern); + } + int batchSize = 500; RPromise result = new RedissonPromise(); AtomicReference failed = new AtomicReference(); diff --git a/redisson/src/test/java/org/redisson/RedissonKeysTest.java b/redisson/src/test/java/org/redisson/RedissonKeysTest.java index f53b1cf4f..c22799679 100644 --- a/redisson/src/test/java/org/redisson/RedissonKeysTest.java +++ b/redisson/src/test/java/org/redisson/RedissonKeysTest.java @@ -12,6 +12,8 @@ import org.junit.Assert; import org.junit.Test; import org.redisson.ClusterRunner.ClusterProcesses; import org.redisson.RedisRunner.FailedToStartRedisException; +import org.redisson.api.BatchResult; +import org.redisson.api.RBatch; import org.redisson.api.RBucket; import org.redisson.api.RMap; import org.redisson.api.RType; @@ -185,6 +187,32 @@ public class RedissonKeysTest extends BaseTest { Assert.assertEquals(0, redisson.getKeys().deleteByPattern("test?")); } + @Test + public void testDeleteByPatternBatch() { + RBucket bucket = redisson.getBucket("test0"); + bucket.set("someValue3"); + assertThat(bucket.isExists()).isTrue(); + + RBucket bucket2 = redisson.getBucket("test9"); + bucket2.set("someValue4"); + assertThat(bucket.isExists()).isTrue(); + + RMap map = redisson.getMap("test2"); + map.fastPut("1", "2"); + assertThat(map.isExists()).isTrue(); + + RMap map2 = redisson.getMap("test3"); + map2.fastPut("1", "5"); + assertThat(map2.isExists()).isTrue(); + + + RBatch batch = redisson.createBatch(); + batch.getKeys().deleteByPatternAsync("test?"); + BatchResult r = batch.execute(); + Assert.assertEquals(4L, r.getResponses().get(0)); + } + + @Test public void testFindKeys() { RBucket bucket = redisson.getBucket("test1");