Redis学习笔记: HyperLogLog结合SpringBoot案例 大量UV的Redis统计方案

本文介绍了如何在SpringBoot应用中使用Redis的HyperLogLog算法高效统计UV(独立访客)和PV(页面浏览量),包括基数统计原理、基本命令和一个实际案例,展示如何在项目启动时自动添加IP并实时获取UV计数。

Redis学习笔记: HyperLogLog结合SpringBoot案例 大量UV的Redis统计方案

HyperLogLog的概念

基数

一种数据集,去重后的真实个数
例如:[1,1,2,3,4,5,6,7,8,9] = 9

基数统计

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

HyperLogLog

去重复统计功能的基数估计算法
HyperLogLog的优点:在输入元素的数量或者体积非常非常大时,计算基数所需的空间是固定的,并且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。
HyperLogLog只会根据输入元素来计算基数,而不会存储元素本身,所以HyperLogLog不能像集合那样,返回输入的各元素。

基本命令

pfadd key element... #将所有元素添加到key中
pfcount key #统计key的估算值
pgmerge new_key key1 key2... #合并key至新key

名称定义

什么是UV

Unique Visitor,独立访客,一般理解为客户ip
需要考虑去重

什么是PV

Page View,页面浏览量
不用去重

什么是DAU

Daily Active User,日活跃用户量,登录或者使用了某个产品的用户数(去重复登录的用户)
常用于反映网站、互联网应用或者网络游戏的运营情况

什么是MAU

Monthly Active User,月活跃用户

需求

需求案例

有很多计数类场景,比如每日注册IP数,每日访问IP数,页面实时访问数PV数,访问用户数UV等等。
由于主要的目标是要高效、巨量地进行计数,所以对存储的数据的内容并不关心。即只用于统计巨量数量,不太涉及具体的统计对象的内容和精确性

案例实操

统计单日一个页面的访问量(PV),单次访问就算一次。
统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。
多个key的合并统计,某个门户网站的所有模块的PV模块统计就是整个网站的总PV。
HyperLogLogService:

  1. 通过@PostConstruct注解,启动项目时,就向Redis中添加200个ip
  2. 通过uv()方法,统计用户访问量
public class HyperLogLogService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @PostConstruct指示Spring容器在构造bean之后、并完成依赖注入之后,调用标记的方法进行进一步的初始化工作
     */
    @PostConstruct
    public void initIP() {
        new Thread(() -> {
            String ip = null;
            for (int i = 0; i < 200; i++) {
                Random random = new Random();
                ip = random.nextInt(256) + "." +
                        random.nextInt(256) + "." +
                        random.nextInt(256) + "." +
                        random.nextInt(256);
                long hll = redisTemplate.opsForHyperLogLog().add("hll", ip);
                log.info("ip = {}, 该ip地址访问首页的次数 = {}", ip, hll);
                //暂停3秒
                try{
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "t1").start();
    }

    public long uv() {
        //PFCOUNT
        return redisTemplate.opsForHyperLogLog().size("hll");
    }
}

HyperLogLogController类:
调用HyperLogLogService类中的uv()方法,来查看用户访问量

@RestController
@Slf4j
@RequestMapping("/yperLogLog")
public class HyperLogLogController {

    @Autowired
    private HyperLogLogService hyperLogLogService;

    @ApiOperation("获得ip去重后的UV统计访问量")
    @GetMapping("/uv")
    public long uv() {
        return hyperLogLogService.uv();
    }
}

初始化方法运行结果:
在这里插入图片描述
API测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值