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

阅读 2.8k
1 个回答

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");
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题