请教大家一个问题, redis 的 bitmap 转换成 Java 的 bitset 采用 BitSet.valueOf 方法获取出来的结果跟存储进去的不一样,这是为什么,应该怎么做可以达到一致的效果?

2018-09-06 14:24:12 +08:00
 sumonian

代码: import redis.clients.jedis.Jedis;

import java.util.BitSet; import java.util.HashSet; import java.util.Random; import java.util.Set;

public class BitmapTest {

private Jedis jedis = null;

private void init() {
    try {
        jedis = new Jedis("192.168.97.57", 6379);
        jedis.auth("666666");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void destroy() {
    if (jedis != null) {
        jedis.close();
    }
}

public boolean get(String key, int companyId) {
    init();
    boolean result = jedis.getbit(key, companyId);
    destroy();
    return result;
}


public Set<Integer> getCid(String sid) {
    init();
    Set<Integer> set = new HashSet<>(100);
    try {
        BitSet b = BitSet.valueOf(jedis.get(String.format("sid:%s", sid)).getBytes());
        for (int i = b.nextSetBit(0); i >= 0; i = b.nextSetBit(i + 1)) {
            set.add(i);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    destroy();
    return set;
}

public void insert() {
    init();
    try {
        for (int i = 0; i < 3; i++) {
            String key = String.format("sid:%08d", i);
            System.out.println("key = " + key);
            jedis.del(key);
            for (int j = 0; j < 5; j++) {
                int cid = new Random().nextInt(100000);
                System.out.println("setbit = " + key + ":" + cid);
                jedis.setbit(key, cid, true);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        destroy();
    }
}

public static void main(String[] args) {
    BitmapTest test = new BitmapTest();
    test.insert();
    Set<Integer> cidSet = test.getCid("00000000");
    System.out.println("cidSet = " + cidSet.size());
    for (Integer cid : cidSet) {
        System.out.println("cid = " + cid);
    }
}

}

2814 次点击
所在节点    Java
3 条回复
greenman0007
2018-09-06 17:46:39 +08:00
jedis.setbit(key, cid, true);
这是存的二进制,并不是普通的字符串
sumonian
2018-09-07 09:11:57 +08:00
@greenman0007 那我应该怎么去取这个数据 能不能取出来原先的数据
sumonian
2018-09-10 09:52:41 +08:00
求解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/486736

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX