diff --git a/redisson/src/main/java/org/redisson/RedissonBitSet.java b/redisson/src/main/java/org/redisson/RedissonBitSet.java index 9ca590493c1..4b90271ea60 100644 --- a/redisson/src/main/java/org/redisson/RedissonBitSet.java +++ b/redisson/src/main/java/org/redisson/RedissonBitSet.java @@ -24,6 +24,7 @@ import org.redisson.api.RBitSet; import org.redisson.api.RFuture; import org.redisson.client.codec.ByteArrayCodec; +import org.redisson.client.protocol.RedisCommand; import org.redisson.client.protocol.RedisCommands; import org.redisson.command.CommandAsyncExecutor; import org.redisson.command.CommandBatchService; @@ -80,8 +81,12 @@ public void set(long bitIndex, boolean value) { } @Override - public RFuture setAsync(long bitIndex, boolean value) { - return commandExecutor.writeAsync(getName(), codec, RedisCommands.SETBIT_VOID, getName(), bitIndex, value ? 1 : 0); + public RFuture setAsync(long bitIndex, boolean value) { + RedisCommand command = RedisCommands.SETBIT_TRUE; + if (!value) { + command = RedisCommands.SETBIT_FALSE; + } + return commandExecutor.writeAsync(getName(), codec, command, getName(), bitIndex, value ? 1 : 0); } @Override @@ -100,7 +105,7 @@ public long cardinality() { } @Override - public int size() { + public long size() { return get(sizeAsync()); } @@ -110,8 +115,8 @@ public void clear(long fromIndex, long toIndex) { } @Override - public void clear(long bitIndex) { - get(clearAsync(bitIndex)); + public boolean clear(long bitIndex) { + return get(clearAsync(bitIndex)); } @Override @@ -232,12 +237,12 @@ public RFuture setAsync(long fromIndex, long toIndex) { } @Override - public RFuture sizeAsync() { + public RFuture sizeAsync() { return commandExecutor.readAsync(getName(), codec, RedisCommands.BITS_SIZE, getName()); } @Override - public RFuture setAsync(long bitIndex) { + public RFuture setAsync(long bitIndex) { return setAsync(bitIndex, true); } @@ -247,7 +252,7 @@ public RFuture cardinalityAsync() { } @Override - public RFuture clearAsync(long bitIndex) { + public RFuture clearAsync(long bitIndex) { return setAsync(bitIndex, false); } diff --git a/redisson/src/main/java/org/redisson/RedissonBloomFilter.java b/redisson/src/main/java/org/redisson/RedissonBloomFilter.java index becf61f5d24..b5f474d5f34 100644 --- a/redisson/src/main/java/org/redisson/RedissonBloomFilter.java +++ b/redisson/src/main/java/org/redisson/RedissonBloomFilter.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; +import org.redisson.api.RBitSetAsync; import org.redisson.api.RBloomFilter; import org.redisson.api.RFuture; import org.redisson.client.RedisException; @@ -104,8 +105,9 @@ public boolean add(T object) { CommandBatchService executorService = new CommandBatchService(commandExecutor.getConnectionManager()); addConfigCheck(hashIterations, size, executorService); + RBitSetAsync bs = createBitSet(executorService); for (int i = 0; i < indexes.length; i++) { - executorService.writeAsync(getName(), codec, RedisCommands.SETBIT, getName(), indexes[i], 1); + bs.setAsync(indexes[i]); } try { List result = (List) executorService.execute(); @@ -154,8 +156,9 @@ public boolean contains(T object) { CommandBatchService executorService = new CommandBatchService(commandExecutor.getConnectionManager()); addConfigCheck(hashIterations, size, executorService); + RBitSetAsync bs = createBitSet(executorService); for (int i = 0; i < indexes.length; i++) { - executorService.readAsync(getName(), codec, RedisCommands.GETBIT, getName(), indexes[i]); + bs.getAsync(indexes[i]); } try { List result = (List) executorService.execute(); @@ -175,6 +178,10 @@ public boolean contains(T object) { } } + protected RBitSetAsync createBitSet(CommandBatchService executorService) { + return new RedissonBitSet(executorService, getName()); + } + private void addConfigCheck(int hashIterations, long size, CommandBatchService executorService) { executorService.evalReadAsync(getConfigName(), codec, RedisCommands.EVAL_VOID, "local size = redis.call('hget', KEYS[1], 'size');" + @@ -188,7 +195,8 @@ public int count() { CommandBatchService executorService = new CommandBatchService(commandExecutor.getConnectionManager()); RFuture> configFuture = executorService.readAsync(getConfigName(), StringCodec.INSTANCE, new RedisCommand>("HGETALL", new ObjectMapReplayDecoder()), getConfigName()); - RFuture cardinalityFuture = executorService.readAsync(getName(), codec, RedisCommands.BITCOUNT, getName()); + RBitSetAsync bs = createBitSet(executorService); + RFuture cardinalityFuture = bs.cardinalityAsync(); executorService.execute(); readConfig(configFuture.getNow()); @@ -260,7 +268,7 @@ public boolean tryInit(long expectedInsertions, double falseProbability) { } private String getConfigName() { - return "{" + getName() + "}" + "__config"; + return suffixName(getName(), "config"); } @Override diff --git a/redisson/src/main/java/org/redisson/api/RBitSet.java b/redisson/src/main/java/org/redisson/api/RBitSet.java index 523325ac59c..b6b60d8530a 100644 --- a/redisson/src/main/java/org/redisson/api/RBitSet.java +++ b/redisson/src/main/java/org/redisson/api/RBitSet.java @@ -37,7 +37,7 @@ public interface RBitSet extends RExpirable, RBitSetAsync { void set(long fromIndex, long toIndex); - int size(); + long size(); boolean get(long bitIndex); @@ -49,7 +49,7 @@ public interface RBitSet extends RExpirable, RBitSetAsync { long cardinality(); - void clear(long bitIndex); + boolean clear(long bitIndex); void clear(); diff --git a/redisson/src/main/java/org/redisson/api/RBitSetAsync.java b/redisson/src/main/java/org/redisson/api/RBitSetAsync.java index 92e2d385934..55a422a5590 100644 --- a/redisson/src/main/java/org/redisson/api/RBitSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RBitSetAsync.java @@ -39,17 +39,17 @@ public interface RBitSetAsync extends RExpirableAsync { RFuture setAsync(long fromIndex, long toIndex); - RFuture sizeAsync(); + RFuture sizeAsync(); RFuture getAsync(long bitIndex); - RFuture setAsync(long bitIndex); + RFuture setAsync(long bitIndex); - RFuture setAsync(long bitIndex, boolean value); + RFuture setAsync(long bitIndex, boolean value); RFuture cardinalityAsync(); - RFuture clearAsync(long bitIndex); + RFuture clearAsync(long bitIndex); RFuture clearAsync(); diff --git a/redisson/src/main/java/org/redisson/api/RBitSetReactive.java b/redisson/src/main/java/org/redisson/api/RBitSetReactive.java index bde2c71065f..9850c68ca19 100644 --- a/redisson/src/main/java/org/redisson/api/RBitSetReactive.java +++ b/redisson/src/main/java/org/redisson/api/RBitSetReactive.java @@ -42,17 +42,17 @@ public interface RBitSetReactive extends RExpirableReactive { Publisher set(long fromIndex, long toIndex); - Publisher size(); + Publisher size(); Publisher get(long bitIndex); - Publisher set(long bitIndex); + Publisher set(long bitIndex); - Publisher set(long bitIndex, boolean value); + Publisher set(long bitIndex, boolean value); Publisher cardinality(); - Publisher clear(long bitIndex); + Publisher clear(long bitIndex); Publisher clear(); diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index 773c37f87e7..48299979a3b 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -86,12 +86,13 @@ public interface RedisCommands { RedisStrictCommand TYPE = new RedisStrictCommand("TYPE", new TypeConvertor()); RedisStrictCommand GETBIT = new RedisStrictCommand("GETBIT", new BooleanReplayConvertor()); - RedisStrictCommand BITS_SIZE = new RedisStrictCommand("STRLEN", new BitsSizeReplayConvertor()); + RedisStrictCommand BITS_SIZE = new RedisStrictCommand("STRLEN", new BitsSizeReplayConvertor()); RedisStrictCommand STRLEN = new RedisStrictCommand("STRLEN"); RedisStrictCommand BITCOUNT = new RedisStrictCommand("BITCOUNT"); RedisStrictCommand BITPOS = new RedisStrictCommand("BITPOS", new IntegerReplayConvertor()); RedisStrictCommand SETBIT_VOID = new RedisStrictCommand("SETBIT", new VoidReplayConvertor()); - RedisStrictCommand SETBIT = new RedisStrictCommand("SETBIT", new BitSetReplayConvertor()); + RedisStrictCommand SETBIT_TRUE = new RedisStrictCommand("SETBIT", new BitSetReplayConvertor(0)); + RedisStrictCommand SETBIT_FALSE = new RedisStrictCommand("SETBIT", new BitSetReplayConvertor(1)); RedisStrictCommand BITOP = new RedisStrictCommand("BITOP", new VoidReplayConvertor()); RedisStrictCommand WAIT = new RedisStrictCommand("WAIT", new IntegerReplayConvertor()); diff --git a/redisson/src/main/java/org/redisson/client/protocol/convertor/BitSetReplayConvertor.java b/redisson/src/main/java/org/redisson/client/protocol/convertor/BitSetReplayConvertor.java index 1f901d0d090..6975ac04606 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/convertor/BitSetReplayConvertor.java +++ b/redisson/src/main/java/org/redisson/client/protocol/convertor/BitSetReplayConvertor.java @@ -15,11 +15,23 @@ */ package org.redisson.client.protocol.convertor; +/** + * + * @author Nikita Koksharov + * + */ public class BitSetReplayConvertor extends SingleConvertor { + private final int expectedValue; + + public BitSetReplayConvertor(int expectedValue) { + super(); + this.expectedValue = expectedValue; + } + @Override public Boolean convert(Object obj) { - return Long.valueOf(0).equals(obj); + return expectedValue == (Long)obj; } diff --git a/redisson/src/main/java/org/redisson/client/protocol/convertor/BitsSizeReplayConvertor.java b/redisson/src/main/java/org/redisson/client/protocol/convertor/BitsSizeReplayConvertor.java index 03ddd87f7ea..e7f1640aa67 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/convertor/BitsSizeReplayConvertor.java +++ b/redisson/src/main/java/org/redisson/client/protocol/convertor/BitsSizeReplayConvertor.java @@ -15,15 +15,14 @@ */ package org.redisson.client.protocol.convertor; -public class BitsSizeReplayConvertor extends SingleConvertor { +public class BitsSizeReplayConvertor extends SingleConvertor { @Override - public Integer convert(Object obj) { + public Long convert(Object obj) { if (obj == null) { return null; } - int val = ((Long) obj).intValue(); - return val * 8; + return ((Long) obj) * 8; } } diff --git a/redisson/src/main/java/org/redisson/reactive/RedissonBitSetReactive.java b/redisson/src/main/java/org/redisson/reactive/RedissonBitSetReactive.java index 97d4ebdc791..806a83c5aa2 100644 --- a/redisson/src/main/java/org/redisson/reactive/RedissonBitSetReactive.java +++ b/redisson/src/main/java/org/redisson/reactive/RedissonBitSetReactive.java @@ -51,10 +51,10 @@ public RFuture get() { }); } - public Publisher set(final long bitIndex, final boolean value) { - return reactive(new Supplier>() { + public Publisher set(final long bitIndex, final boolean value) { + return reactive(new Supplier>() { @Override - public RFuture get() { + public RFuture get() { return instance.setAsync(bitIndex, value); } }); @@ -134,20 +134,20 @@ public RFuture get() { } @Override - public Publisher size() { - return reactive(new Supplier>() { + public Publisher size() { + return reactive(new Supplier>() { @Override - public RFuture get() { + public RFuture get() { return instance.sizeAsync(); } }); } @Override - public Publisher set(final long bitIndex) { - return reactive(new Supplier>() { + public Publisher set(final long bitIndex) { + return reactive(new Supplier>() { @Override - public RFuture get() { + public RFuture get() { return instance.setAsync(bitIndex); } }); @@ -164,10 +164,10 @@ public RFuture get() { } @Override - public Publisher clear(final long bitIndex) { - return reactive(new Supplier>() { + public Publisher clear(final long bitIndex) { + return reactive(new Supplier>() { @Override - public RFuture get() { + public RFuture get() { return instance.clearAsync(bitIndex); } });