黑马点评---用户签到、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);
    }

至此 完结

相关推荐
SPC的存折4 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
爱学习的小囧5 小时前
VMware ESXi 6.7U3v 新版特性、驱动集成教程和资源包、部署教程及高频问答详情
运维·服务器·虚拟化·esxi6.7·esxi蟹卡驱动
小疙瘩5 小时前
只是记录自己发布若依分离系统到linux过程中遇到的问题
linux·运维·服务器
dldw7776 小时前
IE无法正常登录windows2000server的FTP服务器
运维·服务器·网络
我是伪码农7 小时前
外卖餐具智能推荐
linux·服务器·前端
zopple7 小时前
Laravel9.X重磅升级:十大核心特性解析
android
汤愈韬7 小时前
下一代防火墙通用原理
运维·服务器·网络·security
私人珍藏库7 小时前
【windows】跨平台 Android 刷机Root工具箱
android·windows·工具·刷机·软件·多功能
IMPYLH7 小时前
Linux 的 od 命令
linux·运维·服务器·bash
数据雕塑家9 小时前
Linux下大文件切割与合并实战:解决FAT32文件系统传输限制
linux·运维·服务器