BitMap是什么
就是通过一个bit
位来表示某个元素对应的值或者状态,其中的key
就是对应元素本身。我们知道8个bit
可以组成一个Byte
,所以bitmap
本身会极大的节省储存空间。
Redis中的BitMap
Redis
从2.2.0
版本开始新增了setbit
,getbit
,bitcount
等几个bitmap
相关命令。虽然是新命令,但是并没有新增新的数据类型,仍然属于String
,因为setbit
等命令只不过是在set
上的扩展。
BitMap
的值只有0
和1
.
所以,在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());
}
参考
来源:CSDN
作者:Young4Dream
链接:https://blog.csdn.net/Young4Dream/article/details/103913341