作用
使用较小的内存空间记录许多id(基数)是否存在.
a. 记录id是否存在bitmap中
b. 获取出id基数的个数
深入了解:
三种 Bitmap 之 RoaringBitmp(压缩 Bitmap)
使用
依赖
<dependency>
<groupId>org.roaringbitmap</groupId>
<artifactId>RoaringBitmap</artifactId>
<version>0.9.3</version>
</dependency>
代码
简单使用
public static void main(String[] args) {
// 1. 创建对象
Roaring64NavigableMap roaring64NavigableMap = new Roaring64NavigableMap();
// 2. 添加id值
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(234);
// 3. 优化
roaring64NavigableMap.runOptimize();
// 4. 获取id值总个数(基数)
long longCardinality = roaring64NavigableMap.getLongCardinality();
System.out.println("基数个数:" + longCardinality);
// 5. 获取所有id值
LongIterator longIterator = roaring64NavigableMap.getLongIterator();
while (longIterator.hasNext()){
System.out.println("基数:" + longIterator.next());
}
}
对象序列化后使用
public static void main(String[] args) {
// 1. 创建对象
Roaring64NavigableMap roaring64NavigableMap = new Roaring64NavigableMap();
// 2. 添加id值
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(123);
roaring64NavigableMap.addLong(234);
// 3. 优化
roaring64NavigableMap.runOptimize();
// 4. 序列化
String serialize = serialize(roaring64NavigableMap);
System.out.println("序列化后:" + serialize);
// 5. 反序列化
Roaring64NavigableMap bitMap = deserialize(serialize);
System.out.println("基数个数:" + bitMap.getLongCardinality());
}
private static String serialize(Roaring64NavigableMap bitmap){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
bitmap.serialize(new DataOutputStream(bos));
} catch (IOException e) {
log.error("序列化失败",e);
throw new RuntimeException("bitMap序列化失败");
}
byte[] bout = bos.toByteArray();
return Base64.getEncoder().encodeToString(bout);
}
private static Roaring64NavigableMap deserialize(String encrypt){
Roaring64NavigableMap bitmap = new Roaring64NavigableMap();
byte[] bout = Base64.getDecoder().decode(encrypt);
try {
bitmap.deserialize(new DataInputStream(new ByteArrayInputStream(bout)));
} catch (IOException e) {
log.error("bitMap反序列化失败",e);
throw new RuntimeException("bitMap反序列化失败");
}
return bitmap;
}