Redis HyperLogLog 是用來做基數(shù)統(tǒng)計的算法揩晴,它的優(yōu)點是 在輸入元素的數(shù)量或者體積非常大時搔预,計算基數(shù)所需的空間總是固定的且很小的灵疮。
每個 HyperLogLog 鍵只需要花費12KB內存叽讳,就可以計算接近 2的64次方個不同元素的基數(shù)褒脯。
HyperLogLog 只會根據輸入元素來計算基數(shù)便瑟,不會儲存輸入元素本身。
(1)什么是基數(shù)番川?
一個集合中不重復元素的個數(shù)到涂。
例如: 數(shù)據集{1,3,5,7,5,7,8} ,它的基數(shù)集為 {1,3,5,7,8} , 基數(shù)為5
(2)php redis HyperLogLog 操作示例
1. pfAdd - 添加指定元素到 HyperLogLog 中
//成功時返回1颁督,失敗返回0
$redis->pfAdd('pkey', [1,3,5,7,5,7,8]);
2. pfCount - 返回給定 HyperLogLog 的基數(shù)估算值
// 成功時返回基數(shù)践啄; 如果鍵不存在返回0
$count = $redis->pfCount('pkey');
3. pfMerge - 將多個 HyperLogLog 合并為一個 HyperLogLog
$redis->pfAdd('pkey2', [1,3,5,7,5,7,8]);// 5
$redis->pfAdd('pkey3', [11,12,13,14,15]); // 5
$redis->pfMerge('pk', ['pkey', 'pkey2', 'pkey3']);
$count = $redis->pfCount('pk'); // 返回10
(3)應用場景
用于計算日活、7日活沉御、3月活
思路:
使用 `pfAdd` 命令把 ip 信息(或用戶id)按天添加入 Redis HpyerLogLog 中屿讽,計算某一天的日活時 執(zhí)行`pfCount` 操作就可以了。
每個月的第一天執(zhí)行 pfMerge
將上一個月的所有數(shù)據合并成一個 HyperLogLog