记录一下使用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
}
}