V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sumonian
V2EX  ›  Java

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

  •  1
     
  •   sumonian · 2018-09-06 14:24:12 +08:00 · 3016 次点击
    这是一个创建于 2289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码: 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);
        }
    }
    

    }

    3 条回复    2018-09-10 09:52:41 +08:00
    greenman0007
        1
    greenman0007  
       2018-09-06 17:46:39 +08:00
    jedis.setbit(key, cid, true);
    这是存的二进制,并不是普通的字符串
    sumonian
        2
    sumonian  
    OP
       2018-09-07 09:11:57 +08:00
    @greenman0007 那我应该怎么去取这个数据 能不能取出来原先的数据
    sumonian
        3
    sumonian  
    OP
       2018-09-10 09:52:41 +08:00
    求解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5291 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:31 · PVG 14:31 · LAX 22:31 · JFK 01:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.