文章目录
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:
- 通过@PostConstruct注解,启动项目时,就向Redis中添加200个ip
- 通过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测试结果:

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

1402

被折叠的 条评论
为什么被折叠?



