一、使用hyperloglog实现淘宝网站首页亿级UV的redis统计方案
@Service
@Slf4j
public class HyperLogLogService {
@Resource
private RedisTemplate redisTemplate;
/**
* 模拟后台用户点击淘宝首页,每个用户IP地址不同
*/
@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 taobao = redisTemplate.opsForHyperLogLog().add("taobao", ip);
log.info("ip={},该ip地址访问首页的次数={}",ip,taobao);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"1").start();
}
public long uv(){
//size等价于pfcount
return redisTemplate.opsForHyperLogLog().size("taobao");
}
}
@Resource
private HyperLogLogService hyperLogLogService;
@RequestMapping(value = "/uv",method = RequestMethod.GET)
@ApiOperation("获得IP去重后的UV访问量")
public long uv(){
return hyperLogLogService.uv();
}