黑马点评---用户签到、UV统计

BitMap用法



实现签到功能

java 复制代码
    @Override
    public Result sign() {
        //获取当前用户
        Long userId = UserHolder.getUser().getId();
        //获取日期
        LocalDateTime now = LocalDateTime.now();
        //拼接key
        String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyMM"));
        String key = USER_SIGN_KEY + userId + keySuffix;
        //判断当前日期是本月第几天
        int dayOfMonth = now.getDayOfMonth();

        //存入bitmap SetBit key offset 1
        stringRedisTemplate.opsForValue().setBit(key,dayOfMonth-1,true);
        return Result.ok();
    }

统计连续签到

java 复制代码
 @Override
    public Result signCount() {
        //获取当前用户
        Long userId = UserHolder.getUser().getId();
        //获取日期
        LocalDateTime now = LocalDateTime.now();
        //拼接key
        String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyMM"));
        String key = USER_SIGN_KEY + userId + keySuffix;
        //判断当前日期是本月第几天
        int dayOfMonth = now.getDayOfMonth();
        //获取本月截止今天为止的所有的签到记录,返回的是一个十进制的数字 BITFIELD sing:5:202603 GET u24 0
        List<Long> result = stringRedisTemplate.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);
        }
        int count = 0;
        while (true){
            //让这个数字和1做与运算,得到数字的最后一个bit位,判断这个bit是否为0
            if((num & 1) == 0){
                //如果为0,说明这个日期没有签到,结束循环
                break;
            }else {

                count++;
            }
            //数字右移一位,抛弃最后一个bit位,继续下一个bit位
            num >>>= 1;
        }
        return Result.ok(count);
    }

UV统计

HyperLogLog用法


java 复制代码
    @Test
    void testHyperLogLog(){
        String[] values = new String[1000];

        int j = 0;
        for (int i = 0; i < 1000000; i++) {
            j = i % 1000;
            values[j] = "user_" + i;
            if(j ==999){
                //发送到redis
                stringRedisTemplate.opsForHyperLogLog().add("hl1",values);
            }
        }

        Long hl1 = stringRedisTemplate.opsForHyperLogLog().size("hl1");
        System.out.println("hl1 = " + hl1);
    }

至此 完结

相关推荐
想做小南娘,发现自己是女生喵1 分钟前
LAN Device Monitor 第二周学习文档
java·服务器·数据库
独隅22 分钟前
Claude 高效应用实战指南
android·java·开发语言·claude·claude code
叼烟扛炮25 分钟前
Linux 学习笔记(三十二):线程控制——创建、等待与分离
linux·运维·服务器·笔记·学习·1024程序员节
硅基手札32 分钟前
Android 系统全景专栏 00 · 总目录
android·操作系统·嵌入式开发
xbzb38 分钟前
服务器形态怎么选、BIOS 怎么进?从 1U 机架到固件启动项一次讲透
运维·服务器·bios·启动·固件·启动项
夜雪一千44 分钟前
Linux 权限、用户、用户组内容介绍
linux·运维·服务器
YB13751 小时前
Jetpack Compose 动画Crossfade
android
2401_833269301 小时前
Android歌词功能实现
android
恋猫de小郭1 小时前
Flutter 紧急发布 3.47.8 安全升级版本,建议都升级
android·前端·flutter
YB13751 小时前
Jetpack Compose 动画AnimatedContent
android