首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第八章 HyperLogLog使用

第八章 HyperLogLog使用

原创
作者头像
RookieCyliner
发布于 2025-06-11 23:18:39
发布于 2025-06-11 23:18:39
900
举报
文章被收录于专栏:redisredis

什么是UV、PV、DAU、MAU

  1. UV:Unique Visitor,独立访客,一般理解为客户端IP(需要去重考虑)
  2. PV:Page View,页面浏览量(不用去重)
  3. DAU:日活跃用户量(登录或者使用了某个产品的用户数(去重复登录的用户))
  4. MAU:MonthIy Active User,月活跃用户量

HyperLogLog的概述

  • Redis里面,每个HyperLogLog的键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数
官网介绍
官网介绍
  • 去重复统计功能的基数估计算法-就是HyperLogLog

(用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算)

  • 存在误差,非精确统计,牺牲准确率来换取空间,误差仅仅只是0.81%左右
官网说明误差计算方式
官网说明误差计算方式

去重复统计你先会想到哪些方式?

使用HashSet进行去重处理

使用bitmap进行亿级数据统计,万亿存在性能问题

概率算法:

  1. 通过牺牲准确率来换取空间,对于不要求绝对准确率的场景下可以使用,因为概率算法不直接存储数据本身
  2. 通过一定的概率统计方法预估基数值,同时保证误差在一定范围内,由于又不储存数据故此可以大大节约内存
  3. HyperLogLog就是一种概率算法的实现

HyperLogLog的指令

基本指令
基本指令

首页UV的Redis统计方案

需求:UV的统计需要去重

  1. 淘宝、天猫首页的UV,平均每天是1~1.5个亿左右
  2. 每天存1.5个亿的IP,访问者来了后先去查是否存在,不存在加入
  3. 一个用户一天内的多次访问只能算作一次

方案讨论

  1. mysql,数据库巨大
  2. 用redis的hash结构存储 - redis——hash = <keyDay,<ip,1>>按照ipv4的结构来说明,每个ipv4的地址最多是15个字节(ip = “192.168.111.1”,最多xxx.xxx.xxx.xxx)某一天的1.5亿 * 15个字节= 2G,一个月60G,数据量巨大
redis的hash演示
redis的hash演示

hyperloglog

为什么是12Kb?

每个桶取6位,16384*6÷8 = 12kb,每个桶有6位,最大全部都是1,值就是63

官网HyperLogLog说明
官网HyperLogLog说明

代码展示

代码语言:txt
AI代码解释
复制
@Service
@Slf4j
public class HyperLogLogService {
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 模拟有用户来点击首页,每个用户就是不同的ip,不重复记录,重复不记录
     */
    @PostConstruct
    public void init() {
        log.info("------模拟后台有用户点击,每个用户ip不同");
        //自己启动线程模拟,实际上产不是线程
        new Thread(() -> {
            String ip = null;
            for (int i = 1; i <=200; i++) {
                Random random = new Random();
                ip = random.nextInt(255)+"."+random.nextInt(255)+"."+random.nextInt(255)+"."+random.nextInt(255);

                Long hll = redisTemplate.opsForHyperLogLog().add("hll", ip);
                log.info("ip={},该ip访问过的次数={}",ip,hll);
                //暂停3秒钟线程
                try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
            }
        },"t1").start();
    }
}
代码语言:txt
AI代码解释
复制
@RestController
@Slf4j
public class HyperLogLogController {

    @Resource
    private RedisTemplate redisTemplate;

    @ApiOperation("获得ip去重复后的首页访问量,总数统计")
    @RequestMapping(value = "/uv",method = RequestMethod.GET)
    public long uv() {
        //pfcount
        return redisTemplate.opsForHyperLogLog().size("hll");
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是UV、PV、DAU、MAU
  • HyperLogLog的概述
  • 去重复统计你先会想到哪些方式?
    • 概率算法:
  • HyperLogLog的指令
  • 首页UV的Redis统计方案
    • 需求:UV的统计需要去重
    • 方案讨论
    • hyperloglog
      • 为什么是12Kb?
    • 代码展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档