redis-bitMap 我不是女神ヾ 2022-05-22 11:10 164阅读 0赞 记录一下使用bitMap的一些操作。 bit操作保存的数据只能是0或者1,这对于判断true/false的统计具备天然的优势。 比如签到签退等等。 同时也记录一下踩过的一些坑: 进行setbit操作之后,使用bitcout统计数据总是有问题,就一直纠结为啥,后来想着是不是跟hbase一样,按照前缀进行匹配的呢? 试了一试,仍然不行,后来就查了很多的资料,才发现是bit和byte的差别。 redis的setbit修改的是bit位置,而bitcount检查的是byte位置,两者相差有8的倍数1byte=8bit。 也就是说在setbit时使用的偏移量为8的时候,使用bitcount进行操作的时候需要使用1。 为了可以看的直观,例子在setbit的时候都进行了\*8操作。 package com.redis.bitmap; import com.redis.util.RedisUtil; import org.junit.jupiter.api.Test; import redis.clients.jedis.Jedis; public class BitMapTest { /** * name:是总的标记 * offset:偏移量 * value:值只能是0和1 */ @Test public void setBit(){ Jedis jedis = RedisUtil.getJedis(); Boolean setbit1 = jedis.setbit("sign", 1001*8, "1"); System.out.println("返回值:"+setbit1); Boolean setbit2 = jedis.setbit("sign", 1002*8, "1"); System.out.println("返回值:"+setbit2); Boolean setbit3 = jedis.setbit("sign", 1003*8, "0"); System.out.println("返回值:"+setbit3); Boolean setbit4 = jedis.setbit("sign", 2001*8, "1"); System.out.println("返回值:"+setbit4); Boolean setbit5 = jedis.setbit("sign", 2002*8, "1"); System.out.println("返回值:"+setbit5); Boolean setbit6 = jedis.setbit("sign", 2003*8, "1"); System.out.println("返回值:"+setbit6); Boolean setbit7 = jedis.setbit("sign", 2004*8, "0"); System.out.println("返回值:"+setbit7); // 第一次的返回值都为false // 返回值:false // 返回值:false // 返回值:false // 返回值:false // 返回值:false // 返回值:false // 返回值:false // 第二次的返回值为 // 返回值:true // 返回值:true // 返回值:false // 返回值:true // 返回值:true // 返回值:true // 返回值:false } /** * value为1的返回true,value为0的返回false */ @Test public void getBit(){ Jedis jedis = RedisUtil.getJedis(); Boolean sign1 = jedis.getbit("sign", 1001*8); Boolean sign2 = jedis.getbit("sign", 1002*8); Boolean sign3 = jedis.getbit("sign", 1003*8); Boolean sign4 = jedis.getbit("sign", 2001*8); Boolean sign5 = jedis.getbit("sign", 2002*8); Boolean sign6 = jedis.getbit("sign", 2003*8); Boolean sign7 = jedis.getbit("sign", 2004*8); System.out.println("返回值:"+sign1); System.out.println("返回值:"+sign2); System.out.println("返回值:"+sign3); System.out.println("返回值:"+sign4); System.out.println("返回值:"+sign5); System.out.println("返回值:"+sign6); System.out.println("返回值:"+sign7); // 返回值:true // 返回值:true // 返回值:false // 返回值:true // 返回值:true // 返回值:true // 返回值:false } /** * 这里的start和end是byte位 * setbit使用的是bit位 * 所以这里的start和end值需要跟保存的时候offset相差8倍 * bitcount会直接把value进行相加 */ @Test public void bitCount(){ Jedis jedis = RedisUtil.getJedis(); Long sign1 = jedis.bitcount("sign"); System.out.println("返回值:"+sign1); Long sign2 = jedis.bitcount("sign", 1001, 1003); System.out.println("返回值:"+sign2); Long sign3 = jedis.bitcount("sign", 1001, 2004); System.out.println("返回值:"+sign3); // 返回值:5 // 返回值:2 // 返回值:5 } }
还没有评论,来说两句吧...