Redis学习笔记(五):BitMap

时间秒杀一切 提交于 2020-01-10 01:56:56

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

命令 参数 实战 说明
SETBIT key,offset,[0|1] SETBIT login:2020:01:01 1 1 login:2020:01:01第一个位置设置值为1
GETBIT key,office GETBIT login:2020:01:01 1 获取login:2020:01:01第一个位置的值
BITOP opt([ AND | OR |NOT | XOR ]),destKey,key1,key2… BITOP AND 2019Count 20190101 20191231 将offset[ 20190101-20191231]范围内的数据以逻辑合并导出到2019Count
BITCOUNT key[, start, end] BITCOUNT 2019Count 统计范围内为真的数量,没有指定范围表示统计全部

SETBIT swb:user:login:0828 1 1
(integer) 0
127.0.0.1:6379[2]> SETBIT swb:user:login:0828 3 1
(integer) 0
127.0.0.1:6379[2]> SETBIT swb:user:login:0828 7 1

使用场景

用户签到

很多应用有签到功能,并且还有连续签到奖励,那么,使用bitmap就可以实现.

根据日期%365设置offset,

set asdf

统计活跃用户

用户在线状态

    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的妙用

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!