Redis学习笔记(五):BitMap
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
注
由于BITCOUNT中的范围都是按字节算,一个字节又是8个bit,因此,当我进行8位以内的操作后,实际上只能BITCOUNT key和BITCOUNT 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());
}
