Java如何使用Jedis实现Redis bitmap的零存整取

问题描述

业务使用中会将redis bitmap中的一些位设置为1(数量和offset是随机的,offset <= 1000万)。

读取的时候需要通过整取的方式判断哪些offset为1(不仅仅是数量,还有具体的offset)。代码如下

相关代码

RedisUtil.setbit("bit:test", 0L, true);

RedisUtil.setbit("bit:test", 1L, true);

RedisUtil.setbit("bit:test", 7L, true);

String value = RedisUtil.get("bit:test");

byte[] bytes = value.getBytes();

for(byte b: bytes) {

System.out.println(Integer.toBinaryString(b));

}

你期待的结果是什么?实际看到的错误信息又是什么?

这个时候会发现打印的结果为

1111 1111 1111 1111 1111 1111 1110 1111

1111 1111 1111 1111 1111 1111 1011 1111

1111 1111 1111 1111 1111 1111 1011 1101

而期待的结果应该是

1100 0001

由于Java使用二进制补码表示,当bit位0,8,16这种处于一个字节开头的位设置为0的时候,就会出现这种问题(PS. 网上我找到的关于零存整取的例子都“巧妙”的避开了这种情况)

所以怎样才能转换为期待的结果1100 0001


回答:

get(byte[])get(String)不能正常取值
另外这个场景感觉用hash可能更容易实现一些

public class Sf1010000041673847 {

public static void main(String[] args) throws Exception {

Jedis jedis = new Jedis();

for (int i = 0; i < 8; i++) {

jedis.setbit("x", i, true);

byte[] bytes = jedis.get("x".getBytes(StandardCharsets.UTF_8));

for (byte b : bytes) {

System.out.println(Integer.toBinaryString(b));

}

}

jedis.del("x");

}

}

以上是 Java如何使用Jedis实现Redis bitmap的零存整取 的全部内容, 来源链接: utcz.com/p/944343.html

回到顶部