多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### BitMap Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省 ### 算法 我们通过一个具体的例子来说明 BitMap 的原理,假设我们要对 0-31 内的 3 个元素 (10, 17,28) 排序,那么我们就可以采用 BitMap 方法(假设这些元素没有重复) 如下图,要表示 32 个数,我们就只需要 32 个 bit(4Bytes),首先我们开辟 4Byte 的空间,将这些空间的所有 bit 位都置为 0 ![](https://img.kancloud.cn/ad/91/ad91d491b0b2748ef38ae919c8b1b7fa_986x101.png) 然后,我们要添加(10, 17,28) 这三个数到 BitMap 中,需要的操作就是在相应的位置上将0置为1即可。如下图,比如现在要插入 10 这个元素,只需要将蓝色的那一位变为1即可 ![](https://img.kancloud.cn/13/03/1303510391d0db8fa88364697702050b_986x202.png) 将这些数据插入后,假设我们想对数据进行排序或者检索数据是否存在,就可以依次遍历这个数据结构,碰到位为 1 的情况,就当这个数据存在 ``` public static void sort(String[] args) { int[] bitmap = new int[1000]; int[] nums = {398, 2, 30, 4, 88, 500, 999, 233, 399}; for(int i = 0; i < nums.length;i ++){ bitmap[nums[i]] = 1; } int index = 0; int[] result = new int[nums.length]; for(int i = 0; i < bitmap.length;i ++){ if(1 == bitmap[i]){ result[index] = i; index++; } } System.err.println(Arrays.toString(result)); } ``` #### redis用setbit(bitmap)统计活跃用户 Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(如果你的uid不是从1开始的,比如从100000开始,实际上你也可以相应的用uid减去初始值来表示其位数,比如1000000用户对应到bitmap的第一位) ![](//upload-images.jianshu.io/upload_images/19080939-37652b4eb7b20469.png?imageMogr2/auto-orient/strip|imageView2/2/w/320/format/webp) 具体的代码类似下面这样: redis.setbit(play:yyyy-mm-dd, user\_id, 1) 这样一次记录的复杂度是O(1),在Redis中速度非常快