一、BitMap
位图(BitMap)中一个bit取值0/1可以记录一个状态,1Byte就能记录8个状态,非常节省空间。
Redis中利用 String类型数据结构 实现BitMap,最大上限512M=2^32bit
布隆过滤器(缓存穿透)底层就是BitMap
操作命令:
setbit key offset value:向指定位offset存入一个0或1,offset从0开始getbit key offset:获取指定位offset的bit值bitcount key [start end]:计算BitMap中值为1的bit位数量bitfield key get unum start:查询从start开始num个位的bit值,返回这几个位组合成的十进制结果bitfield_ro:一次查询多个位的bit值bitop:多个BitMap做位运算(与、或、异或)bitops key 0/1 start end:查找BitMap中指定范围内第一个0或1出现的位置
二、BitMap实现用户签到功能:
传统签到功能用户每次签到都会生成一条记录保存到签到表(用户id、时间、是否签到、补签),非常占用存储空间。
而BitMap每一位就可以记录用户的每一次签到记录,一年的签到信息只需要366bit=46Byte=0.045MB就能存储。
每个用户每年的签到信息用一个bitmap维护,写入到数据库中只需要一条记录:
public Result sign() {
Long userId = UserHolder.getUser().getId();
String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
stringRedisTemplate.opsForValue().setBit(
"sign:"+userId+":"+LocalDateTime.now().getYear(),
LocalDateTime.now().getDayOfYear()-1,
true);
return null;
}
1791

被折叠的 条评论
为什么被折叠?



