UV(Unique Visitor)
(1)独立访客,需通过用户IP排重统计数据。
(2)每次访问都要进行统计。
(3)HyperLogLog,性能好,且存储空间小。
DAU(Daily Active User)
(1)日活跃用户,需通过用户ID排重统计数据。
(2)访问过一次,则认为其活跃。
(3)Bitmap,性能好、且可以统计精确的结果。
在RedisKeyUtil类里,添加
private static final String PREFIX_UV = "uv";
private static final String PREFIX_DAU = "dau";
// 单日
public static String getUVKey(String date){
return PREFIX_UV + SPLIT + date;
}
// 区间UV
public static String getUVKey(String startDate,String endDate){
return PREFIX_UV + SPLIT + startDate + SPLIT +endDate;
}
//单日活跃用户
public static String getDAUKey(String date){
return PREFIX_DAU + SPLIT + date;
}
//区间活跃用户
public static String getDAUKey(String startDate,String endDate){
return PREFIX_DAU + SPLIT + startDate + SPLIT +endDate;
}
新建DataService类,
@Autowired
private RedisTemplate redisTemplate;
private SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
// 将指定的IP计入UV,至于在这之前这个ip怎么获取,可以参考ServiceLogAspect
public void recordUV(String ip){
String redisKey = RedisKeyUtil.getUVKey(df.format(new Date()));
redisTemplate.opsForHyperLogLog().add(redisKey, ip);
}
//统计指定日期范围内的UV
public long calculateUV(Date start,Date end){
if(start==null||end==null){
throw new IllegalArgumentException