stream lib - 969251639/study GitHub Wiki
互联网企业中经常会有统计PV或UV的需求,由于UV需要去重,但不要求准确性,完全可以牺牲准确度来换取性能和空间的提升,stream-lib采用基数估算法实现了去重的统计
public class UVTest {
public static void main(String[] args) {
ICardinality card = AdaptiveCounting.Builder.obyCount(Integer.MAX_VALUE).build();
for(int i = 0; i < 10; i++) {
card.offer(i);//塞数据
}
for(int i = 0; i < 10; i++) {
card.offer(i);//塞数据
}
//获取去重数
System.out.println("UV: " + card.cardinality());//输出10
}
}
另外stream-lib也实现了HyperLogLog算法,也是可以实现上面的UV统计效果(Redis也有HyperLogLog算法的实现)
public class UVTest {
public static void main(String[] args) {
ICardinality card1 = new HyperLogLog(Integer.MAX_VALUE);
for(int i = 0; i < 10; i++) {
card1.offer(i);//塞数据
}
for(int i = 0; i < 10; i++) {
card1.offer(i);//塞数据
}
System.out.println(card1.cardinality()); //输出10
}
}