redis BitMap 用户签到功能实现

一、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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值