diff --git a/redisson/src/main/java/org/redisson/RedissonBitSet.java b/redisson/src/main/java/org/redisson/RedissonBitSet.java index a5f179838..643328925 100644 --- a/redisson/src/main/java/org/redisson/RedissonBitSet.java +++ b/redisson/src/main/java/org/redisson/RedissonBitSet.java @@ -263,6 +263,11 @@ public class RedissonBitSet extends RedissonExpirable implements RBitSet { get(setAsync(bs)); } + @Override + public void set(long[] indexArray, boolean value) { + get(setAsync(indexArray, value)); + } + @Override public boolean get(long bitIndex) { return get(getAsync(bitIndex)); @@ -307,6 +312,21 @@ public class RedissonBitSet extends RedissonExpirable implements RBitSet { return val; } + @Override + public RFuture setAsync(long[] indexArray, boolean value) { + int val = toInt(value); + Object[] paramArray = new Object[indexArray.length * 4 + 1]; + int j = 0; + paramArray[j++] = getRawName(); + for (int i = 0; i < indexArray.length; i++) { + paramArray[j++] = "set"; + paramArray[j++] = "u1"; + paramArray[j++] = indexArray[i]; + paramArray[j++] = val; + } + return commandExecutor.writeAsync(getRawName(), RedisCommands.BITFIELD_VOID, paramArray); + } + @Override public byte[] toByteArray() { return get(toByteArrayAsync()); diff --git a/redisson/src/main/java/org/redisson/api/RBitSet.java b/redisson/src/main/java/org/redisson/api/RBitSet.java index dc92fa161..fd0666681 100644 --- a/redisson/src/main/java/org/redisson/api/RBitSet.java +++ b/redisson/src/main/java/org/redisson/api/RBitSet.java @@ -239,6 +239,14 @@ public interface RBitSet extends RExpirable, RBitSetAsync { */ void set(BitSet bs); + /** + * Set all bits to value which index in indexArray + * + * @param indexArray The index array of bits that needs to be set to value + * @param value true = 1, false = 0 + */ + void set(long[] indexArray, boolean value); + /** * Executes NOT operation over all bits */ diff --git a/redisson/src/main/java/org/redisson/api/RBitSetAsync.java b/redisson/src/main/java/org/redisson/api/RBitSetAsync.java index 309aa3fa9..bf968b4b9 100644 --- a/redisson/src/main/java/org/redisson/api/RBitSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RBitSetAsync.java @@ -294,6 +294,14 @@ public interface RBitSetAsync extends RExpirableAsync { */ RFuture setAsync(long bitIndex, boolean value); + /** + * Set all bits to value which index in indexArray + * + * @param indexArray The index array of bits that needs to be set to value + * @param value true = 1, false = 0 + */ + RFuture setAsync(long[] indexArray, boolean value); + /** * Returns the number of bits set to one. * 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 170213624..b5ae8ff11 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -63,6 +63,7 @@ public interface RedisCommands { new ListFirstObjectDecoder(), new ByteReplayConvertor()); RedisStrictCommand BITFIELD_SHORT = new RedisStrictCommand<>("BITFIELD", null, new ListFirstObjectDecoder(), new ShortReplayConvertor()); + RedisStrictCommand BITFIELD_VOID = new RedisStrictCommand<>("BITFIELD", new VoidReplayConvertor()); RedisStrictCommand GETBIT = new RedisStrictCommand("GETBIT", new BooleanReplayConvertor()); RedisStrictCommand BITS_SIZE = new RedisStrictCommand("STRLEN", new BitsSizeReplayConvertor()); diff --git a/redisson/src/test/java/org/redisson/RedissonBitSetTest.java b/redisson/src/test/java/org/redisson/RedissonBitSetTest.java index c71864b82..b8a6dbe69 100644 --- a/redisson/src/test/java/org/redisson/RedissonBitSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonBitSetTest.java @@ -2,8 +2,10 @@ package org.redisson; import org.junit.jupiter.api.Test; import org.redisson.api.RBitSet; +import org.springframework.util.StopWatch; import java.util.BitSet; +import java.util.Random; import static org.assertj.core.api.Assertions.assertThat; @@ -123,6 +125,15 @@ public class RedissonBitSetTest extends BaseTest { bs = redisson.getBitSet("testbitset"); assertThat(bs.toString()).isEqualTo("{1, 10}"); + + RBitSet bs2 = redisson.getBitSet("testbitset2"); + bs2.set(new long[]{1L,3L,5L,7L}, true); + bs2 = redisson.getBitSet("testbitset2"); + assertThat(bs2.toString()).isEqualTo("{1, 3, 5, 7}"); + + bs2.set(new long[]{3L,5L}, false); + bs2 = redisson.getBitSet("testbitset2"); + assertThat(bs2.toString()).isEqualTo("{1, 7}"); } @Test