首頁  >  文章  >  資料庫  >  Redis中HyperLogLog資料類型如何使用

Redis中HyperLogLog資料類型如何使用

PHPz
PHPz轉載
2023-05-29 09:29:12923瀏覽

1. HyperLogLog 的原理

Redis HyperLogLog使用機率演算法-HyperLogLogLog演算法,來估計基數。使用一組雜湊函數和長度為m的位數組,HyperLogLog能夠估算集合中獨特元素的數量。

在 HyperLogLog 演算法中,對每個元素進行雜湊處理,把雜湊值轉換為二進位後,根據二進位字串中 1 的個數來給每個元素打分數。例如,一個元素的雜湊值為01110100011,那麼前綴中1的個數是3,因此在 HyperLogLog 演算法中,這個元素的分數為3。

  當所有元素的分數統計完之後,取每一個分數的倒數(1 / 2^n),然後將這些倒數相加後取倒數,就得到一個基數估計值,這個值就是HyperLogLog算法的估計結果。

  HyperLogLog演算法透過對位數組的長度m的大小進行取捨,折衷資料結構所佔用的記憶體與估計值的精確度(即估計誤差),得到了在資料佔用空間與錯誤較小程度之間完美的平衡。

  簡而言之,HyperLogLog演算法的核心思想是基於雜湊函數和位元運算,透過將雜湊值轉換成位元流並統計前導0的個數,從而快速估算大型資料集中唯一值的數量。利用 hyperloglog 演算法,我們能夠快速辨識非常大的資料集中的重複網頁。

2.使用步驟:

  Redis HyperLogLog是一種可用於估算集合中元素數量的資料結構,它能夠透過使用非常少的記憶體來維護海量的資料。它的精確性高於常規估算演算法,並且處理大量資料時速度非常快。

  一個簡單的例子,我們可以用HyperLogLog來計算訪問網站的獨立IP數,具體可以按以下步驟操作:

  • 首先建立一個HyperLogLog資料結構: PFADD hll:unique_ips 127.0.0.1

  • 為每次存取ip 新增至unique_ips資料結構:PFADD hll:unique_ips 192.168.1.1#PFADD hll:unique_ips 192.168.1.1

  • #取得計算集合中元素數量的近似值: PFCOUNT hll:unique_ips

  • 可以透過對多個HyperLogLogLog結構(例如按天或按小時)的合併,以獲得更精確的計數。

  需要注意的是,HyperLogLog雖然可以節省大量的內存,但它是一種估計演算法,誤差範圍並不是完全精確的,實際使用時應注意其適用範圍。

3.實作請求ip去重的瀏覽量使用範例

Redis中HyperLogLog資料類型如何使用

4.Jedis客戶端使用

  1. 新增依賴,引入jedis依賴:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.0</version>
</dependency>

  2.建立一個Jedis物件:

Jedis jedis = new Jedis("localhost");

  3.向HyperLogLog資料結構新增元素:

jedis.pfadd("hll:unique_ips", "127.0.0.1");

  4.取得計算集合中元素數量的近似值:

Long count = jedis.pfcount("hll:unique_ips");
System.out.println(count);
  5.可以透過多個HyperLogLog結構的合併來獲得更精確的計數。在Jedis中可以使用PFMERGE

指令來合併HyperLogLogLog資料結構:

jedis.pfmerge("hll:unique_ips", "hll:unique_ips1", "hll:unique_ips2", "hll:unique_ips3");

5.Redission使用依賴

  1.建立RedissonClient物件

Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379");
RedissonClient redisson = Redisson.create(config);

   1.建立RedissonClient物件

RHyperLogLog<String> uniqueIps = redisson.getHyperLogLog("hll:unique_ips");

  222 .建立RHyperLogLog物件

uniqueIps.add("127.0.0.1");

  3.新增元素

long approximateCount = uniqueIps.count();
System.out.println(approximateCount);

  4..取得近似數量

RHyperLogLog<String> uniqueIps1 = redisson.getHyperLogLog("hll:unique_ips1");
RHyperLogLog<String> uniqueIps2 = redisson.getHyperLogLog("hll:unique_ips2");
uniqueIps.mergeWith(uniqueIps1, uniqueIps2);

  5.合併多個HyperLogLogLog物件

rrreee

#[6 .HyperLogLog 提供了哪些特性與方法
  •   特性:

  • 精確度低,但佔用記憶體極少。

  • 支援插入新元素,同時不會重複計數。

  • 提供指令來優化記憶體使用和計數準確性。例如PFADD、PFCOUNT、PFMERGE等指令。

  • 能夠估計一個資料集中的不同元素數量,即集合的基底數(cardinality)。

支援對多個HyperLogLog物件進行合併操作,以獲得這些集合的總基數的近似值。

  •   HyperLogLog常用的方法:

  • PFADD key element [element ...]:新增一個或多個元素到HyperLogLogLog結構中。

  • PFCOUNT key [key ...]:取得一個或多個HyperLogLogLog結構的基數估計值。

  • PFMERGE destkey sourcekey [sourcekey ...]:合併一個或多個HyperLogLog架構到一個目標結構。

PFSELFTEST [numtests]: 測試HyperLogLogLog估值效能與準確度(僅限Redis4.0 版本)

  需要注意的是, HyperLogLog雖然可以節省大量內存,但仍然是一種估計演算法,誤差範圍並不是完全精確的,並且具有一定的計算成本。根據實際應用情況,需要斟酌是否要使用HyperLogLog或其他資料結構來估計元素數量。

7.使用場景總結:

  Redis使用HyperLogLog的主要作用是在大數據流(view,IP,城市)的情況下進行去重計數。 ######  具體來說,以下是Redis HyperLogLog用來去重計數的一些場景:###
  • 统计页面访问量 - 在Web应用程序中, HyperLogLog可以使用为每个页面计算多少次独特的访问者。利用HyperLogLog技术,跨越不同的时间段计算该页面的平均访问量。

  • HyperLogLog在分析大数据集合中的用户数量方面具有显著的实用性。在处理独特的用户ID这类数据集合时,一种基于概率的数据结构显得尤为有效。HyperLogLog会在进行散列计算后,仅保存有限数量的散列值,并且能够推断出数据集的大小。

  • 统计广告点击量 - 对于网站或应用程序的广告分析,HyperLogLog可以用于捕获有效点击数量,即非重复或唯一点击数量。

以上是Redis中HyperLogLog資料類型如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除