public class DataService {
@Autowired
private RedisTemplate redisTemplate;
private SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
public void recordUV(String ip) {
String redisKey = RedisKeyUtil.getUVKey(df.format(new Date()));
redisTemplate.opsForHyperLogLog().add(redisKey,ip);
}
public long calculateUV(Date start, Data end) {
if (start == null || end == null) {
throw new IllegalArgumentException("参数不能为空!");
}
ArrayList<String> keyList = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(start);
while (!calendar.getTime().after((Date) end)) {
String key = RedisKeyUtil.getUVKey(df.format(calendar.getTime()));
keyList.add(key);
calendar.add(Calendar.DATE,1);
}
String redisKey = RedisKeyUtil.getUVKey(df.format(start), df.format(end));
redisTemplate.opsForHyperLogLog().union(redisKey,keyList.toArray());
return redisTemplate.opsForHyperLogLog().size(redisKey);
}
public void recordDAU(int userId) {
String uvKey = RedisKeyUtil.getUVKey(df.format(new Date()));
redisTemplate.opsForValue().setBit(uvKey,userId,true);
}
public long calculateDAU(Data start, Data end) {
if (start == null || end == null) {
throw new IllegalArgumentException("参数不能为空!");
}
List<byte[]> keyList = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime((Date) start);
while (!calendar.getTime().after((Date) end)) {
String key = RedisKeyUtil.getUVKey(df.format(calendar.getTime()));
keyList.add(key.getBytes());
calendar.add(Calendar.DATE,1);
}
return(long)redisTemplate.execute(new RedisCallback() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
String redisKey = RedisKeyUtil.getDAUKey(df.format(start), df.format(end));
connection.bitOp(RedisStringCommands.BitOperation.OR,redisKey.getBytes(),
keyList.toArray(new byte[0][0]));
return connection.bitCount(redisKey.getBytes());
}
});
}
@Controller
public class DataController {
@Autowired
private DataService dataService;
@RequestMapping(path = "/data",method = {RequestMethod.GET,RequestMethod.POST})
public String getDataPage() {
return"/site/admin/data";
}
@RequestMapping(path = "/data/uv",method = RequestMethod.POST)
public String getUV(@DateTimeFormat(pattern = "yyyy-MM-dd") Date start,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date end,Model model) {
long uv = dataService.calculateUV(start, (Data) end);
model.addAttribute("uvResult",uv);
model.addAttribute("uvStartDate",start);
model.addAttribute("uvEndDate",end);
return "forward:/data";
}
public String getDAU(@DateTimeFormat(pattern = "yyyy-MM-dd") Date start,
@DateTimeFormat(pattern = "yyyy-MM-dd") Data end, Model model) {
long dau = dataService.calculateDAU((Data) start, end);
model.addAttribute("dauResult",dau);
model.addAttribute("dauStartDate",start);
model.addAttribute("aduEndDate",end);
return "forward:/data";
}
}