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
	}
}