目录
一、亿级系统常见的四中统计
1、聚合统计
聚合统计:统计多个集合元素的聚合结果,交并差集和聚合函数的应用。用于推广社交
2、排序统计
排序统计:在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,建议使用zset。
3、二值统计
二值统计:用于签到打卡,使用bitmap
4、基数统计
基数统计:指统计一个集合中不重复的元素个数,使用hyperloglog
统计名词
UV:Unique Visitor 独立访客,一般伟客户端IP(需要去重)
PV:Page View 页面浏览量(不去重)
DAU:Daily Active User 日活跃用户,登录或者使用了某个产品的用户数(去除重复登录的用户)
常用于反映网站、互联网应用或者网络游戏的运营情况。
MAU:Monthly Active User 月活跃用户
二、hyperloglog
需求分析
统计单日一个页面的访问量(PV),单次访问就算一次。
统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。
多个key的合并统计,某个门户网站的所有模块的PV聚合统计就是整个网站的总PV。
去重的方式有哪些?
1、HashSet
2、bitmap
bitmap是通过用位bit数组来表示各元素是否出现,每个元素对应一位,所需的总内存为N个bit。
基数计数则将每一个元素对应到bit数组中的其中一位,比如bit数组010010101(按照从零开始下标,有的就是1、4、6、8)。新进入的元素只需要将已经有的bit数组和新加入的元素进行按位或计算就行。这个方式能大大减少内存占用且位操作迅速。但是对于亿级统计不太合适。
3、hyperloglog
只是进行不重复的基数统计,不是集合也不保存数据,只记录数量而不是具体内容。Hyperloglog
提供不精确的去重计数方案,牺牲准确率来换取空间,误差仅仅只是0.81%左右。
hyperloglog实战演示
示例:淘宝网站首页亿级UV的Redis统计方案
1、UV的统计需要去重,一个用户一天内的多次访问只能算作一次。
2、淘宝、天猫首页的UV,平均每天是1~1.5个亿左右。
3、每天存1.5个亿的IP,访问者来了后先去查是否存在,不存在加入。
1、技术选型
使用mysql
mysql扛不住稍微大一点的并发,而且都需要存入mysql中,导致mysql的检索也会变慢
使用redis的hash结构存储
按照ipv4的结构来说明,一个ip最多15个字节(ip=“192.168.238.1xx”),某一天 1.5亿*15个字节 = 2G,一个月60G,内存直接没了,加内存条都没用
使用hyperloglog
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2的64次方个不同元素的基数。
2、代码演示
HypeLogLogService
public interface HypeLogLogService {
public long uv();
}
HyperLogLogServiceImpl
import com.xfcy.service.HypeLogLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Random;
import java.util.concurrent.TimeUnit;
&