①. 什么是UV、PV、DAU、MAU
①. UV:Unique Visitor,独立访客,一般理解为客户端IP(需要去重考虑)
②. PV:Page View,页面浏览量(不用去重)
③. DAU:日活跃用户量(登录或者使用了某个产品的用户数(去重复登录的用户))
④. MAU:MonthIy Active User,月活跃用户量
②. HyperLogLog的概述
- ①. 在Redis里面,每个HyperLogLog的键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数
- ②. 去重复统计功能的基数估计算法-就是HyperLogLog
全集i={1,2,3,4,5,6,7,8,8,9,9,5} 去掉重复的内容 基数={1,2,3,4,5,6,7,8,9}
- ③. 有误差,非精确统计,牺牲准确率来换取空间,误差仅仅只是0.81%左右
③. HyperLogLog的指令
- ①. HyperLogLog的基本指令
②. 指令演示
④. 首页UV的Redis统计方案
- ①. 需求:UV的统计需要去重,一个用户一天内的多次访问只能算作一次
- ②. 代码展示
@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(); } }
@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"); } }