



补充说明:redis中用int来修饰len字段,int为4个字节,也就是32位,那么最大能表示2^32次方。所以2^32/8/1024/1024=512m, 修饰len字段也可以是64个字节,但此时太大违背redis的设计初衷。
GETBIT只能一次查一个值 BITFIELD一次可以查多个值

签到功能:
示例:
- @Override
- public Result sign() {
- //1.获取用户登录
- Long userId = UserHolder.getUser().getId();
- //2.获取日期
- LocalDateTime now = LocalDateTime.now();
- //3.拼接这个key
- String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
- String key = "sign:" + userId + keySuffix;
- //4.获取今天是本月的第几天
- int dayOfMonth = now.getDayOfMonth();
- //5.写入redis setbit key offset 1
- redisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
- return Result.ok();
- }


签到,设置该位bit为1:
- public Result sign() {
- //1.获取用户登录
- Long userId = UserHolder.getUser().getId();
- //2.获取日期
- LocalDateTime now = LocalDateTime.now();
- //3.拼接这个key
- String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
- String key = "sign:" + userId + keySuffix;
- //4.获取今天是本月的第几天
- int dayOfMonth = now.getDayOfMonth();
- //5.写入redis setbit key offset 1
- redisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
- return Result.ok();
- }
查询一个月中的连续签到:
- public Result signCount() {
-
- //1.获取用户登录
- Long userId = UserHolder.getUser().getId();
- //2.获取日期
- LocalDateTime now = LocalDateTime.now();
- //3.拼接这个key
- String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
- String key = "sign:" + userId + keySuffix;
- //4.获取今天是本月的第几天
- int dayOfMonth = now.getDayOfMonth();
- //5.获取本月截止今天为止返回的所有签约记录,是一个十进制的数字
- List
result = redisTemplate.opsForValue().bitField( - key,
- BitFieldSubCommands.create()
- .get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth))
- .valueAt(0)
- );
- if(result == null || result.isEmpty()){
- return Result.ok(0);
- }
- Long num = result.get(0);
- if(num == null || num == 0){
- return Result.ok(0);
- }
- //6.循环遍历
- int count = 0;
- while ((num & 1) != 0) {
- count++;
- num = num >>> 1;
- }
- return Result.ok(count);
- }