Skip to content

Instantly share code, notes, and snippets.

@gmuller
Forked from gresrun/redisBitSetTests.java
Created June 15, 2012 00:45
Show Gist options
  • Select an option

  • Save gmuller/2933940 to your computer and use it in GitHub Desktop.

Select an option

Save gmuller/2933940 to your computer and use it in GitHub Desktop.

Revisions

  1. gmuller revised this gist Jul 4, 2012. 1 changed file with 67 additions and 23 deletions.
    90 changes: 67 additions & 23 deletions SieveOfEratosthenes.java
    Original file line number Diff line number Diff line change
    @@ -6,50 +6,94 @@ public class SieveOfEratosthenes {

    private static String sieveSetKeyCorrected = "correct_sieve";
    private static String sieveSetKeyDefaultJava = "wrong_sieve";
    private static String sieveSetBitsKey = "sieve_set_bits";
    private static String spoolSieve = "sieve_set_bits";

    /**
    * @param args
    */
    public static void main(final String[] args) {

    // setup redis values
    // Initialize my redis client values
    final Jedis redis = new Jedis("localhost");

    // setup our prime bitset
    System.out.println("Alright, let's create a sieve of primes, Eratosthenes style!");
    final int length = 20;
    final BitSet sieve = new BitSet(length);
    sieve.flip(2, length);

    // create bitset of all values
    final BitSet primes = new BitSet(length);
    primes.flip(2, length);
    for (int i = 0; i < length; i++) {
    if (sieve.get(i)) {
    if (primes.get(i)) {
    for (int j = i * 2; j < length; j += i) {
    sieve.set(j, false);
    primes.set(j, false);
    }
    }
    }

    // Write 3 bitsets to redis
    // 1. setbit through redis
    for (int i = 0; i < sieve.length(); i++) {
    if (sieve.get(i)) {
    redis.setbit(sieveSetBitsKey, i, true);
    System.out.println("Let's set the bits in redis the ol' fashioned way");
    System.out.println("One at a time using redis.setbit");
    for (int i = 0; i < primes.length(); i++) {
    if (primes.get(i)) {
    redis.setbit(spoolSieve, i, true);
    }
    }

    // 2. Set entire bitset with default java methods
    redis.set(sieveSetKeyDefaultJava.getBytes(), sieve.toByteArray());
    System.out.println("And then read the bitset out, just like the example");
    final BitSet spoolWaySieve = BitSet.valueOf(redis.get(spoolSieve.getBytes()));

    System.out.println("And compare the values");
    System.out.println("Original Sieve: " + primes);
    System.out.println("Read via BitSet.valueOf(): " + spoolWaySieve);

    System.out.println("\nWhat The? Thats not right at all!");
    System.out.println("Let's try reversing the bits in the bytes");

    final BitSet correctedBits = fromByteArrayReverse(redis.get(spoolSieve.getBytes()));

    System.out.println("And compare the values");
    System.out.println("Original Sieve: " + primes);
    System.out.println("Read via helper method: " + correctedBits);

    System.out.println("\nThat's better.");
    System.out.println("Now what happens if I try to write the entire BitSet into Redis");
    System.out.println("Using the BitSet.toByteArray() method built-in");
    System.out.println("Then pull the values back out");

    redis.set(sieveSetKeyDefaultJava.getBytes(), primes.toByteArray());
    final BitSet defaultJava =
    BitSet.valueOf(redis.get(sieveSetKeyDefaultJava.getBytes()));
    System.out.println("Original Sieve: " + primes);
    System.out
    .println("Stored via BitSet.toByteArray() and retrieved via BitSet.valueOf: "
    + defaultJava);

    System.out.println("\nThat appears to work...but there is a catch");
    System.out.println("If you try to read the values out using getBit");
    System.out
    .println("They are mangled because we effectively used Java's byte ordering");
    System.out.println("Look. redis.getbit(4) -> "
    + redis.getbit(sieveSetKeyDefaultJava, 4));
    System.out.println("Last I checked, 4 is not prime");
    System.out.println("\nThis also means calls to getbit from another language");
    System.out.println("and especially redis-cli, will be incorrect");

    System.out
    .println("\nSo, let's write another helper method to reverse the bits on the way in");
    System.out.println("And write the sieve of primes");
    System.out.println("And check to make sure the native calls to getBit still work");
    System.out.println("And use our helper method to get the BitSet in one call");

    // 3. Set entire bitset with correct method
    redis.set(sieveSetKeyCorrected.getBytes(), toByteArrayReverse(sieve));
    redis.set(sieveSetKeyCorrected.getBytes(), toByteArrayReverse(primes));
    final BitSet correctedSieve =
    fromByteArrayReverse(redis.get(sieveSetKeyCorrected.getBytes()));

    // Compare bitsets from Redis when retrieved via getKey
    final byte[] sieveSetBitsBytes = redis.get(sieveSetBitsKey.getBytes());
    final byte[] sieveSetKeyDefaultJavaBytes =
    redis.get(sieveSetKeyDefaultJava.getBytes());
    final byte[] sieveSetKeyCorrectedBytes = redis.get(sieveSetKeyCorrected.getBytes());
    System.out.println("Original Sieve: " + primes);
    System.out.println("Stored via helper method and retrieved via helper method: "
    + correctedSieve);
    System.out
    .println("Look. redis.getbit(4) -> " + redis.getbit(sieveSetKeyCorrected, 4));

    System.out
    .println("\nThere we go. Use a help method to reverse the bits on the way in or out");
    System.out.println("To make sure your native calls still work");
    }

    public static BitSet fromByteArrayReverse(final byte[] bytes) {
  2. gmuller revised this gist Jun 16, 2012. 1 changed file with 0 additions and 105 deletions.
    105 changes: 0 additions & 105 deletions redisBitSetTests.java
    Original file line number Diff line number Diff line change
    @@ -1,105 +0,0 @@
    import java.util.Arrays;
    import java.util.BitSet;

    import redis.clients.jedis.Jedis;

    public class SieveOfEratosthenes {

    /**
    * @param args
    */
    public static void main(final String[] args) {

    // setup values
    final Jedis redis = new Jedis("localhost");
    final String sieveSetBit = "sieveSetBit";
    final String sieveSetKey = "sieveSetKey";
    final int length = 20;
    final BitSet sieve = new BitSet(length);
    sieve.flip(2, length);

    // create bitset of all values
    for (int i = 0; i < length; i++) {
    if (sieve.get(i)) {
    for (int j = i * 2; j < length; j += i) {
    sieve.set(j, false);
    }
    }
    }

    // Write 2 bitsets to redis
    // 1. setbit through redis
    for (int i = 0; i < sieve.length(); i++) {
    if (sieve.get(i)) {
    redis.setbit(sieveSetBit, i, true);
    }
    }

    // 2. Set entire bitset
    redis.set(sieveSetKey.getBytes(), sieve.toByteArray());

    // Compare bitsets from Redis when retrieved via getKey
    final String sieveBitString = redis.get(sieveSetBit);
    final String sieveKeyString = redis.get(sieveSetKey);
    final byte[] sieveBitBytes = redis.get(sieveSetBit.getBytes());
    final byte[] sieveKeyBytes = redis.get(sieveSetKey.getBytes());
    final BitSet setBitSieve = BitSet.valueOf(sieveBitString.getBytes());
    final BitSet setKeySieve = BitSet.valueOf(sieveKeyString.getBytes());
    final BitSet reverseSetBit = fromByteArray(sieveBitString.getBytes());
    final BitSet reverseSetKey = fromByteArray(sieveKeyString.getBytes());

    System.out.println(Arrays.toString(sieve.toByteArray()));
    System.out.println(sieve + " <== Original Sieve");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitString.getBytes()));
    System.out.println(setBitSieve + " <== setbit/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetBit + " <== setbit/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyString.getBytes()));
    System.out.println(setKeySieve + " <== set/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetKey + " <== set/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyBytes));
    System.out.println(BitSet.valueOf(sieveKeyBytes) + " <== get/set (byte[] versions) -> BitSet.valueOf()");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitBytes));
    System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()");
    System.out.println(fromByteArrayReverse(sieveBitBytes) + " <== setbit/get (byte[] versions) -> fromByteArrayReverse()");

    System.out.println();
    System.out.println(Arrays.toString(sieveBitBytes));
    System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()");
    System.out.println(toByteArrayReverse(sieve) + " <== reverse To Array before storages -> toByteArrayReverse()");
    }

    public static BitSet fromByteArrayReverse(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) {
    bits.set(i);
    }
    }
    return bits;
    }

    public static BitSet fromByteArray(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) {
    bits.set(i);
    }
    }
    return bits;
    }

    public static byte[] toByteArrayReverse(BitSet bits) {
    final byte[] bytes = new byte[bits.length() / 8 + 1];
    for (int i = 0; i < bits.length(); i++) {
    if (bits.get(i)) {
    int value = bytes[i/8] | (1 <<( 7 -(i%8)));
    bytes[i/8] = (byte) value;
    }
    }
    return bytes;
    }
    }
  3. gmuller revised this gist Jun 16, 2012. 1 changed file with 75 additions and 0 deletions.
    75 changes: 75 additions & 0 deletions SieveOfEratosthenes.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,75 @@
    import java.util.BitSet;

    import redis.clients.jedis.Jedis;

    public class SieveOfEratosthenes {

    private static String sieveSetKeyCorrected = "correct_sieve";
    private static String sieveSetKeyDefaultJava = "wrong_sieve";
    private static String sieveSetBitsKey = "sieve_set_bits";

    /**
    * @param args
    */
    public static void main(final String[] args) {

    // setup redis values
    final Jedis redis = new Jedis("localhost");

    // setup our prime bitset
    final int length = 20;
    final BitSet sieve = new BitSet(length);
    sieve.flip(2, length);

    // create bitset of all values
    for (int i = 0; i < length; i++) {
    if (sieve.get(i)) {
    for (int j = i * 2; j < length; j += i) {
    sieve.set(j, false);
    }
    }
    }

    // Write 3 bitsets to redis
    // 1. setbit through redis
    for (int i = 0; i < sieve.length(); i++) {
    if (sieve.get(i)) {
    redis.setbit(sieveSetBitsKey, i, true);
    }
    }

    // 2. Set entire bitset with default java methods
    redis.set(sieveSetKeyDefaultJava.getBytes(), sieve.toByteArray());

    // 3. Set entire bitset with correct method
    redis.set(sieveSetKeyCorrected.getBytes(), toByteArrayReverse(sieve));

    // Compare bitsets from Redis when retrieved via getKey
    final byte[] sieveSetBitsBytes = redis.get(sieveSetBitsKey.getBytes());
    final byte[] sieveSetKeyDefaultJavaBytes =
    redis.get(sieveSetKeyDefaultJava.getBytes());
    final byte[] sieveSetKeyCorrectedBytes = redis.get(sieveSetKeyCorrected.getBytes());

    }

    public static BitSet fromByteArrayReverse(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) {
    bits.set(i);
    }
    }
    return bits;
    }

    public static byte[] toByteArrayReverse(final BitSet bits) {
    final byte[] bytes = new byte[bits.length() / 8 + 1];
    for (int i = 0; i < bits.length(); i++) {
    if (bits.get(i)) {
    final int value = bytes[i / 8] | (1 << (7 - (i % 8)));
    bytes[i / 8] = (byte) value;
    }
    }
    return bytes;
    }
    }
  4. gmuller revised this gist Jun 15, 2012. 1 changed file with 91 additions and 75 deletions.
    166 changes: 91 additions & 75 deletions redisBitSetTests.java
    Original file line number Diff line number Diff line change
    @@ -5,85 +5,101 @@

    public class SieveOfEratosthenes {

    /**
    * @param args
    */
    public static void main(final String[] args) {
    /**
    * @param args
    */
    public static void main(final String[] args) {

    // setup values
    final Jedis redis = new Jedis("localhost");
    final String sieveSetBit = "sieveSetBit";
    final String sieveSetKey = "sieveSetKey";
    final int length = 20;
    final BitSet sieve = new BitSet(length);
    sieve.flip(2, length);
    // setup values
    final Jedis redis = new Jedis("localhost");
    final String sieveSetBit = "sieveSetBit";
    final String sieveSetKey = "sieveSetKey";
    final int length = 20;
    final BitSet sieve = new BitSet(length);
    sieve.flip(2, length);

    // create bitset of all values
    for (int i = 0; i < length; i++) {
    if (sieve.get(i)) {
    for (int j = i * 2; j < length; j += i) {
    sieve.set(j, false);
    }
    }
    }
    // create bitset of all values
    for (int i = 0; i < length; i++) {
    if (sieve.get(i)) {
    for (int j = i * 2; j < length; j += i) {
    sieve.set(j, false);
    }
    }
    }

    // Write 2 bitsets to redis
    // 1. setbit through redis
    for (int i = 0; i < sieve.length(); i++) {
    if (sieve.get(i)) {
    redis.setbit(sieveSetBit, i, true);
    }
    }
    // Write 2 bitsets to redis
    // 1. setbit through redis
    for (int i = 0; i < sieve.length(); i++) {
    if (sieve.get(i)) {
    redis.setbit(sieveSetBit, i, true);
    }
    }

    // 2. Set entire bitset
    redis.set(sieveSetKey.getBytes(), sieve.toByteArray());
    // 2. Set entire bitset
    redis.set(sieveSetKey.getBytes(), sieve.toByteArray());

    // Compare bitsets from Redis when retrieved via getKey
    final String sieveBitString = redis.get(sieveSetBit);
    final String sieveKeyString = redis.get(sieveSetKey);
    final byte[] sieveBitBytes = redis.get(sieveSetBit.getBytes());
    final byte[] sieveKeyBytes = redis.get(sieveSetKey.getBytes());
    final BitSet setBitSieve = BitSet.valueOf(sieveBitString.getBytes());
    final BitSet setKeySieve = BitSet.valueOf(sieveKeyString.getBytes());
    final BitSet reverseSetBit = fromByteArray(sieveBitString.getBytes());
    final BitSet reverseSetKey = fromByteArray(sieveKeyString.getBytes());
    // Compare bitsets from Redis when retrieved via getKey
    final String sieveBitString = redis.get(sieveSetBit);
    final String sieveKeyString = redis.get(sieveSetKey);
    final byte[] sieveBitBytes = redis.get(sieveSetBit.getBytes());
    final byte[] sieveKeyBytes = redis.get(sieveSetKey.getBytes());
    final BitSet setBitSieve = BitSet.valueOf(sieveBitString.getBytes());
    final BitSet setKeySieve = BitSet.valueOf(sieveKeyString.getBytes());
    final BitSet reverseSetBit = fromByteArray(sieveBitString.getBytes());
    final BitSet reverseSetKey = fromByteArray(sieveKeyString.getBytes());

    System.out.println(Arrays.toString(sieve.toByteArray()));
    System.out.println(sieve + " <== Original Sieve");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitString.getBytes()));
    System.out.println(setBitSieve + " <== setbit/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetBit + " <== setbit/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyString.getBytes()));
    System.out.println(setKeySieve + " <== set/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetKey + " <== set/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyBytes));
    System.out.println(BitSet.valueOf(sieveKeyBytes) + " <== get/set (byte[] versions) -> BitSet.valueOf()");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitBytes));
    System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()");
    System.out.println(fromByteArrayReverse(sieveBitBytes) + " <== setbit/get (byte[] versions) -> fromByteArrayReverse()");
    }
    System.out.println(Arrays.toString(sieve.toByteArray()));
    System.out.println(sieve + " <== Original Sieve");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitString.getBytes()));
    System.out.println(setBitSieve + " <== setbit/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetBit + " <== setbit/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyString.getBytes()));
    System.out.println(setKeySieve + " <== set/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetKey + " <== set/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyBytes));
    System.out.println(BitSet.valueOf(sieveKeyBytes) + " <== get/set (byte[] versions) -> BitSet.valueOf()");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitBytes));
    System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()");
    System.out.println(fromByteArrayReverse(sieveBitBytes) + " <== setbit/get (byte[] versions) -> fromByteArrayReverse()");

    public static BitSet fromByteArrayReverse(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) {
    bits.set(i);
    }
    }
    return bits;
    }

    public static BitSet fromByteArray(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) {
    bits.set(i);
    }
    }
    return bits;
    }
    }
    System.out.println();
    System.out.println(Arrays.toString(sieveBitBytes));
    System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()");
    System.out.println(toByteArrayReverse(sieve) + " <== reverse To Array before storages -> toByteArrayReverse()");
    }

    public static BitSet fromByteArrayReverse(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) {
    bits.set(i);
    }
    }
    return bits;
    }

    public static BitSet fromByteArray(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) {
    bits.set(i);
    }
    }
    return bits;
    }

    public static byte[] toByteArrayReverse(BitSet bits) {
    final byte[] bytes = new byte[bits.length() / 8 + 1];
    for (int i = 0; i < bits.length(); i++) {
    if (bits.get(i)) {
    int value = bytes[i/8] | (1 <<( 7 -(i%8)));
    bytes[i/8] = (byte) value;
    }
    }
    return bytes;
    }
    }
  5. @gresrun gresrun revised this gist May 23, 2012. 1 changed file with 32 additions and 6 deletions.
    38 changes: 32 additions & 6 deletions redisBitSetTests.java
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,4 @@
    import java.util.Arrays;
    import java.util.BitSet;

    import redis.clients.jedis.Jedis;
    @@ -39,18 +40,43 @@ public static void main(final String[] args) {

    // Compare bitsets from Redis when retrieved via getKey
    final String sieveBitString = redis.get(sieveSetBit);
    final String sieveKeyString = redis.get(sieveSetKey);
    final String sieveKeyString = redis.get(sieveSetKey);
    final byte[] sieveBitBytes = redis.get(sieveSetBit.getBytes());
    final byte[] sieveKeyBytes = redis.get(sieveSetKey.getBytes());
    final BitSet setBitSieve = BitSet.valueOf(sieveBitString.getBytes());
    final BitSet setKeySieve = BitSet.valueOf(sieveKeyString.getBytes());
    final BitSet reverseSetBit = fromByteArray(sieveBitString.getBytes());
    final BitSet reverseSetKey = fromByteArray(sieveKeyString.getBytes());

    System.out.println(setBitSieve);
    System.out.println(setKeySieve);
    System.out.println(reverseSetBit);
    System.out.println(reverseSetKey);
    System.out.println(Arrays.toString(sieve.toByteArray()));
    System.out.println(sieve + " <== Original Sieve");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitString.getBytes()));
    System.out.println(setBitSieve + " <== setbit/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetBit + " <== setbit/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyString.getBytes()));
    System.out.println(setKeySieve + " <== set/get (String) -> BitSet.valueOf()");
    System.out.println(reverseSetKey + " <== set/get (String) -> fromByteArray()");
    System.out.println();
    System.out.println(Arrays.toString(sieveKeyBytes));
    System.out.println(BitSet.valueOf(sieveKeyBytes) + " <== get/set (byte[] versions) -> BitSet.valueOf()");
    System.out.println();
    System.out.println(Arrays.toString(sieveBitBytes));
    System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()");
    System.out.println(fromByteArrayReverse(sieveBitBytes) + " <== setbit/get (byte[] versions) -> fromByteArrayReverse()");
    }

    public static BitSet fromByteArrayReverse(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) {
    bits.set(i);
    }
    }
    return bits;
    }

    public static BitSet fromByteArray(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    @@ -60,4 +86,4 @@ public static BitSet fromByteArray(final byte[] bytes) {
    }
    return bits;
    }
    }
    }
  6. gmuller created this gist May 20, 2012.
    63 changes: 63 additions & 0 deletions redisBitSetTests.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,63 @@
    import java.util.BitSet;

    import redis.clients.jedis.Jedis;

    public class SieveOfEratosthenes {

    /**
    * @param args
    */
    public static void main(final String[] args) {

    // setup values
    final Jedis redis = new Jedis("localhost");
    final String sieveSetBit = "sieveSetBit";
    final String sieveSetKey = "sieveSetKey";
    final int length = 20;
    final BitSet sieve = new BitSet(length);
    sieve.flip(2, length);

    // create bitset of all values
    for (int i = 0; i < length; i++) {
    if (sieve.get(i)) {
    for (int j = i * 2; j < length; j += i) {
    sieve.set(j, false);
    }
    }
    }

    // Write 2 bitsets to redis
    // 1. setbit through redis
    for (int i = 0; i < sieve.length(); i++) {
    if (sieve.get(i)) {
    redis.setbit(sieveSetBit, i, true);
    }
    }

    // 2. Set entire bitset
    redis.set(sieveSetKey.getBytes(), sieve.toByteArray());

    // Compare bitsets from Redis when retrieved via getKey
    final String sieveBitString = redis.get(sieveSetBit);
    final String sieveKeyString = redis.get(sieveSetKey);
    final BitSet setBitSieve = BitSet.valueOf(sieveBitString.getBytes());
    final BitSet setKeySieve = BitSet.valueOf(sieveKeyString.getBytes());
    final BitSet reverseSetBit = fromByteArray(sieveBitString.getBytes());
    final BitSet reverseSetKey = fromByteArray(sieveKeyString.getBytes());

    System.out.println(setBitSieve);
    System.out.println(setKeySieve);
    System.out.println(reverseSetBit);
    System.out.println(reverseSetKey);
    }

    public static BitSet fromByteArray(final byte[] bytes) {
    final BitSet bits = new BitSet();
    for (int i = 0; i < bytes.length * 8; i++) {
    if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) {
    bits.set(i);
    }
    }
    return bits;
    }
    }