redis-bitMap

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

    }

}

你可能感兴趣的:(redis,算法)