目錄
1. HyperLogLog 的原理
2.使用步驟:
jedis.pfmerge("hll:unique_ips", "hll:unique_ips1", "hll:unique_ips2", "hll:unique_ips3");
登入後複製
" >
jedis.pfmerge("hll:unique_ips", "hll:unique_ips1", "hll:unique_ips2", "hll:unique_ips3");
登入後複製
首頁 資料庫 Redis Redis中HyperLogLog資料類型如何使用

Redis中HyperLogLog資料類型如何使用

May 29, 2023 am 09:29 AM
redis hyperloglog

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis指令怎麼用 redis指令怎麼用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

redis怎麼使用單線程 redis怎麼使用單線程 Apr 10, 2025 pm 07:12 PM

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

redis怎麼讀源碼 redis怎麼讀源碼 Apr 10, 2025 pm 08:27 PM

理解 Redis 源碼的最佳方法是逐步進行:熟悉 Redis 基礎知識。選擇一個特定的模塊或功能作為起點。從模塊或功能的入口點開始,逐行查看代碼。通過函數調用鏈查看代碼。熟悉 Redis 使用的底層數據結構。識別 Redis 使用的算法。

redis底層怎麼實現 redis底層怎麼實現 Apr 10, 2025 pm 07:21 PM

Redis 使用哈希表存儲數據,支持字符串、列表、哈希表、集合和有序集合等數據結構。 Redis 通過快照 (RDB) 和追加只寫 (AOF) 機制持久化數據。 Redis 使用主從復制來提高數據可用性。 Redis 使用單線程事件循環處理連接和命令,保證數據原子性和一致性。 Redis 為鍵設置過期時間,並使用 lazy 刪除機制刪除過期鍵。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

redis怎麼使用鎖 redis怎麼使用鎖 Apr 10, 2025 pm 08:39 PM

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

See all articles