写点什么

思考 -RBAC 中对于权限编码部分的压缩处理 (RoaringBitmap)

作者:alexgaoyh
  • 2024-02-01
    河南
  • 本文字数:943 字

    阅读完需:约 3 分钟

概述

  《思考-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); }
}
复制代码

参考

  1. http://pap-docs.pap.net.cn/

  2. https://gitee.com/alexgaoyh/


发布于: 13 分钟前阅读数: 5
用户头像

alexgaoyh

关注

DevOps 2013-12-08 加入

https://gitee.com/alexgaoyh

评论

发布
暂无评论
思考-RBAC中对于权限编码部分的压缩处理(RoaringBitmap)_Java_alexgaoyh_InfoQ写作社区