redis bitmap數據結構之java對等操作( 二 )


@Testpublic void testSetBitmapData2Redis() {//創建一個連接Jedis jedis = new Jedis("localhost", 6379);// 正向設置redis bitmapString testBitmapKey = "mybitmap1";jedis.set(testBitmapKey.getBytes(),genRedisBitmap(2, 55, 133, 65537, 10_0000));Assert.assertEquals("bitmap取值不正確", true,jedis.getbit(testBitmapKey, 2L));Assert.assertEquals("bitmap取值不正確", true,jedis.getbit(testBitmapKey, 133L));Assert.assertEquals("bitmap取值不正確", true,jedis.getbit(testBitmapKey, 65537L));Assert.assertEquals("bitmap取值不正確", true,jedis.getbit(testBitmapKey, 10_0000L));Assert.assertEquals("bitmap取值不正確", false,jedis.getbit(testBitmapKey, 3L));//在redis中獲取name值byte[] redisBitmapData = https://www.huyubaike.com/biancheng/jedis.get("mybitmap1".getBytes());BitSet bitSet = convertRedisBitmapToJava(redisBitmapData);Assert.assertTrue("redisBitmap反解不正確", bitSet.get(2));Assert.assertTrue("redisBitmap反解不正確", bitSet.get(133));Assert.assertTrue("redisBitmap反解不正確", bitSet.get(65537));Assert.assertTrue("redisBitmap反解不正確", bitSet.get(10_0000));Assert.assertFalse("redisBitmap反解不正確", bitSet.get(332));jedis.close();}// 將redis的bitmap轉換為java 的bitsetprivate BitSet convertRedisBitmapToJava(byte[] redisBitmapData) {int len = redisBitmapData.length;BitSet bitSet = new BitSet();// 每個 byte 8位, 所以整個bitmap 的長度為 len * 8for (int i = 0; i < len * 8; i++) {byte currentSegment = redisBitmapData[i / 8];if(currentSegment == 0) {continue;}if((currentSegment & (1 << (7 - (i % 8) ) ) ) != 0 ) {bitSet.set(i);}}return bitSet;}// 生成redis的bitmap數據private byte[] genRedisBitmap(int... items) {BitSet bitSet = new BitSet();// 2 55 133for (int k : items) {bitSet.set(k);}byte[] targetBitmap = bitSet.toByteArray();convertJavaToRedisBitmap(targetBitmap);return targetBitmap;}// 將java中的字節數組轉換為redis的bitmap數據形式private void convertJavaToRedisBitmap(byte[] bytes) {int len = bytes.length;for (int i = 0; i < len; i++) {byte b1 = bytes[i];if(b1 == 0) {continue;}byte transByte = 0;for (byte j = 0; j < 8; j++) {transByte |= (b1 & (1 << j)) >> j << (7 -j);}bytes[i] = transByte;}}經驗證,將8位的byte進行位置反轉,能夠完美匹配兩種數據結構 。
如此一來,就可以輕松將整個bitmap進行初始化設置到redis中,從而在redis的bitmap中,使用 getbit 進行高效判定了 。

經驗總結擴展閱讀