概述
  《思考-RBAC 中对于权限编码部分的压缩处理(RoaringBitmap)》前期编写了思考-RBAC中对于权限编码部分的压缩处理,其中关于 Bitmap 的部分近期又做了思考,经过资料查阅,本文针对 RoaringBitmap 进行概述。
背景
  RoaringBitmap 是一种进行压缩位图的数据结构,减少内存占用,能够满足 Bitmap 的绝大部分基本操作。
  RoaringBitmap 广泛应用:ElasticSearch等。
  如下测试代码,使用 Roaring64NavigableMap 添加了百万条数据,并且进行了取值、判断数据长度、序列化/反序列化等操作。
 package cn.net.pap.common.bitmap;
import org.junit.jupiter.api.Test;import org.roaringbitmap.longlong.LongIterator;import org.roaringbitmap.longlong.Roaring64NavigableMap;import static org.junit.jupiter.api.Assertions.assertTrue;
public class Roaring64NavigableMapTest {    @Test    public void simpleTest() {        long currentTimeMillis = System.currentTimeMillis();        Roaring64NavigableMap r64nMap = new Roaring64NavigableMap();        // 添加范围,前闭区间后开区间        long rangeLong = 1000000l;        r64nMap.add(currentTimeMillis, currentTimeMillis + rangeLong);        // 取第K个值,并判断值是否正确。        long value1000 = r64nMap.select(1000);        assertTrue(currentTimeMillis == value1000 - 1000l);        // 判断数据长度        assertTrue(r64nMap.getLongCardinality() == rangeLong);        // 获得所有值        LongIterator longIterator = r64nMap.getLongIterator();        while (longIterator.hasNext()){            assertTrue(longIterator.next() == currentTimeMillis);            break;        }
        // 序列化        String serialize = Roaring64NavigableMapUtil.serialize(r64nMap);        // 反序列化        Roaring64NavigableMap dBitMap = Roaring64NavigableMapUtil.deserialize(serialize);        // 经过序列化和反序列化之后,再次判断数据长度        assertTrue(dBitMap.getLongCardinality() == rangeLong);    }
}
       复制代码
 参考
http://pap-docs.pap.net.cn/
https://gitee.com/alexgaoyh/
评论