当前位置: 代码网 > it编程>编程语言>Java > java使用bitmap实现可回收自增id的示例

java使用bitmap实现可回收自增id的示例

2024年10月25日 Java 我要评论
需求描述设计一个方法,每次调用返回一个自增id,同时需要满足以下要求。可更新id的状态为已使用,已使用的id下次调用时不再返回可修改某个id的状态为未使用,下次调用时设为未使用状态的id可重新被返回思

需求描述

设计一个方法,每次调用返回一个自增id,同时需要满足以下要求。

  • 可更新id的状态为已使用,已使用的id下次调用时不再返回
  • 可修改某个id的状态为未使用,下次调用时设为未使用状态的id可重新被返回

思路

思路一:如果数据量非常小,直接使用一个集合存储已使用的id,使用循环和维护这个集合即可,但数据量大了,此方法返回数据的时间复杂度和占用的空间都是比较大的。

思路二(推荐):建立一个(位图)bitmap,初始时bitmap的每一位都为0,0代表未使用,1代表已使用。每次请求获取id时从此bitmap的第0位开始返回一个未使用的index即可。

以一个bitmap长度为65536的bitmap为例,示意图如下:

初始时每一个bit位值都为0

012345678……1024……65535
000000000……0……0

此时请求id返回的值为:0

012345678……1024……65535
111110111……1……0

如经过一段时间后,索引位置为5的数据变成了0未使用
此时请求id返回的值应为:5

具体实现

bitset vs roaringbitmap

解决思路有了,接下来就是代码实现。这里以java代码为例,可以直接使用jdk自带的java.util.bitset实现,不过自带的bitset在数据稀疏的场景下占用空间较大,且提供的原生方法较少。

这里推荐直接使用由2016年由几位大佬论文而开发的roaringbitmap,可移步它的官网详细学习一把。https://roaringbitmap.org/about/

roaringbitmap

roaringbitmap有java、go、c\c++、rust、swift等多个版本的实现,同时其时间与空间复杂度低,提供的方法也非常丰富。
github地址如下:https://github.com/roaringbitmap

java代码实现

以下为《使用bitmap实现可回收自增id》的示例代码

引入依赖

		<dependency>
			<groupid>org.roaringbitmap</groupid>
			<artifactid>roaringbitmap</artifactid>
			<version>1.0.0</version>
		</dependency>

示例代码:

    public static void main(string[] args) {
        roaringbitmap rr = new roaringbitmap();
        long l = rr.nextabsentvalue(0);
        system.out.println(l);//print 0
        rr.add(0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 1024, 1025);

        l = rr.nextabsentvalue(0);
        system.out.println(l);//print 5
        // index 5 set true(1)
        rr.add(5);
        l = rr.nextabsentvalue(0);
        system.out.println(l);//print 11
    }

输出结果:

0
5
11

以上代码使用new roaringbitmap()定义了一个可以自动扩容的bitmap,add方法的入参代表将某个bit位设为1,nextabsentvalue方法返回从某个index位开始出现的第一个bit位为0的索引值

分布式自增可回收id实现方案

roaringbitmap还有一大特点:支持序列化与反序列化。

roaringwithkryo

凭借这一特点,如需要在分布式场景下使用roaringbitmap,则仅需稍微修改代码即可快速实现。

如将roaringbitmap序列化为二进制存储在数据库中。

比如在mongodb中使用binary data数据类型、mysql中使用blob数据类型、oracle中使用blob这些二进制类型存储roaringbitmap即可。

实现时每次先将roaringbitmap读取到程序中,再进行逻辑操作,修改后再写回数据库中。

总结一下

roaringbitmap yyds

到此这篇关于java使用bitmap实现可回收自增id的示例的文章就介绍到这了,更多相关java 可回收自增id内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com