Redis学习笔记(五):BitMap

BitMap是什么

就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。

Redis中的BitMap

Redis2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,仍然属于String,因为setbit等命令只不过是在set上的扩展。

BitMap的值只有01.

所以,在Springboot中也是通过RedisTemplate::opsForValue来操作并且将值规定为Boolean类型的.

API

命令参数实战说明
SETBITkey,offset,[0|1]SETBIT login:2020:01:01 1 1login:2020:01:01第一个位置设置值为1
GETBITkey,officeGETBIT login:2020:01:01 1获取login:2020:01:01第一个位置的值
BITOPopt([ AND | OR |NOT | XOR ]),destKey,key1,key2…BITOP AND 2019Count 20190101 20191231将offset[ 20190101-20191231]范围内的数据以逻辑合并多个key,最终导出到2019Count
BITCOUNTkey[, start, end]BITCOUNT 2019Count统计范围内为真的数量,没有指定范围表示统计全部,这里的start和end的单位是字节,不是bit

由于BITCOUNT中的范围都是按字节算,一个字节又是8个bit,因此,当我进行8位以内的操作后,实际上只能BITCOUNT keyBITCOUNT key 0 0是等价的.

	SETBIT user:login:0828 1 1 
	SETBIT user:login:0828 3 1 
	SETBIT user:login:0828 7 1 

此时BITCOUNT user:login:0828的结果与BITCOUNT user:login:0828 0 0一致,均为3.如果GET user:login:0828结果为Q,它对应字节数组是01010001.

使用场景

用户签到

后续补充

统计活跃用户

后续补充

用户在线状态

后续补充

    public void login(int user_id) {
        RedisConnection connection = connectionFactory.getConnection();
        connection.setBit(("swb:user:login:" + user_id).getBytes(), LocalDate.now().getDayOfYear(), true);
    }

    public boolean is_fans(int user_id) {
        LocalDate now = LocalDate.now();
        int start = now.minusDays(7).getDayOfYear();
        int end = now.getDayOfYear();
        String destKey = new StringJoiner(":")
                .add(String.valueOf(now.getYear()))
                .add(String.valueOf(user_id)).toString();
        RedisConnection connection = connectionFactory.getConnection();
        connection.bitOp(RedisStringCommands.BitOperation.AND, destKey.getBytes(), String.valueOf(start).getBytes(), String.valueOf(end).getBytes());
        connection.bitCount(destKey.getBytes());
    }

参考

第十章:Redis中bitmap的妙用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值