diff --git a/redisson/src/main/java/org/redisson/RedissonBloomFilter.java b/redisson/src/main/java/org/redisson/RedissonBloomFilter.java index 94bdfc50c..10b7256b1 100644 --- a/redisson/src/main/java/org/redisson/RedissonBloomFilter.java +++ b/redisson/src/main/java/org/redisson/RedissonBloomFilter.java @@ -66,7 +66,7 @@ public class RedissonBloomFilter extends RedissonExpirable implements RBloomF private volatile int hashIterations; private final CommandExecutor commandExecutor; - private final String configName; + private String configName; protected RedissonBloomFilter(CommandExecutor commandExecutor, String name) { super(commandExecutor, name); @@ -327,6 +327,42 @@ public class RedissonBloomFilter extends RedissonExpirable implements RBloomF return check(result); } + @Override + public RFuture renameAsync(String newName) { + String newConfigName = suffixName(newName, "config"); + RFuture f = commandExecutor.evalWriteAsync(getName(), StringCodec.INSTANCE, RedisCommands.EVAL_VOID, + "redis.call('rename', KEYS[1], ARGV[1]); " + + " return redis.call('rename', KEYS[2], ARGV[2]); ", + Arrays.asList(getName(), configName), newName, newConfigName); + f.onComplete((value, e) -> { + if (e == null) { + this.name = newName; + this.configName = newConfigName; + } + }); + return f; + } + + @Override + public RFuture renamenxAsync(String newName) { + String newConfigName = suffixName(newName, "config"); + RFuture f = commandExecutor.evalWriteAsync(getName(), StringCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN, + "local r = redis.call('renamenx', KEYS[1], ARGV[1]); " + + "if r == 0 then " + + " return 0; " + + "else " + + " return redis.call('renamenx', KEYS[2], ARGV[2]); " + + "end; ", + Arrays.asList(getName(), configName), newName, newConfigName); + f.onComplete((value, e) -> { + if (e == null && value) { + this.name = newName; + this.configName = newConfigName; + } + }); + return f; + } + private V check(V result) { if (result == null) { throw new IllegalStateException("Bloom filter is not initialized!"); diff --git a/redisson/src/test/java/org/redisson/RedissonBloomFilterTest.java b/redisson/src/test/java/org/redisson/RedissonBloomFilterTest.java index 396772bbc..7acce7f0c 100644 --- a/redisson/src/test/java/org/redisson/RedissonBloomFilterTest.java +++ b/redisson/src/test/java/org/redisson/RedissonBloomFilterTest.java @@ -85,4 +85,40 @@ public class RedissonBloomFilterTest extends BaseTest { assertThat(filter.count()).isEqualTo(2); } + @Test + public void testRename() { + RBloomFilter filter = redisson.getBloomFilter("filter"); + filter.tryInit(550000000L, 0.03); + assertThat(filter.add("123")).isTrue(); + filter.rename("new_filter"); + + RBloomFilter filter2 = redisson.getBloomFilter("new_filter"); + assertThat(filter2.count()).isEqualTo(1); + + RBloomFilter filter3 = redisson.getBloomFilter("filter"); + assertThat(filter3.isExists()).isFalse(); + } + + @Test + public void testRenamenx() { + RBloomFilter filter = redisson.getBloomFilter("filter"); + filter.tryInit(550000000L, 0.03); + assertThat(filter.add("123")).isTrue(); + assertThat(filter.contains("123")).isTrue(); + + RBloomFilter filter2 = redisson.getBloomFilter("filter2"); + filter2.tryInit(550000000L, 0.03); + assertThat(filter2.add("234")).isTrue(); + + assertThat(filter.renamenx("filter2")).isFalse(); + assertThat(filter.count()).isEqualTo(1); + + assertThat(filter.renamenx("new_filter")).isTrue(); + RBloomFilter oldFilter = redisson.getBloomFilter("filter"); + assertThat(oldFilter.isExists()).isFalse(); + + RBloomFilter newFilter = redisson.getBloomFilter("new_filter"); + assertThat(newFilter.count()).isEqualTo(1); + assertThat(newFilter.contains("123")).isTrue(); + } }