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 11111111 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