搜尋
首頁資料庫RedisRedis怎麼使用HyperLogLog實現

1. 概述

Redis 在2.8.9 版本增加了HyperLogLog 資料結構,用來做基數統計,其優點是在輸入元素的數量非常大時,計算基數所需的空間比較小並且一般比較恆定。

在 Redis 裡面,每個 HyperLogLog 鍵只需要花費 12 KB 記憶體就可以計算接近 2^64 個不同元素的基數。這和計算基數時,元素越多耗費記憶體越多的集合形成鮮明對比。但是,因為 HyperLogLog 只會根據輸入元素來計算基數,並不會儲存輸入元素本身,所以 HyperLogLog 不能像集合一樣會傳回輸入的各個元素。

2. 什麼是基數?

例如資料集{1, 3, 5, 7, 5, 7, 8}, 那麼這個資料集的基數集是{1, 3, 5 ,7, 8}, 基數(不重複元素)為5。基數估計就是在誤差可接受的範圍內,快速計算基數。

3. 指令

目前只有 PFADD、PFCOUNT 和 PFMERGE 三個指令被 HyperLogLog 支援。我們先來逐一介紹一下。

3.1 PFADD

最早可用版本:2.8.9。時間複雜度:O(1)。

PFADD 指令可以將元素(可以指定多個元素)加入到 HyperLogLog 資料結構中,儲存到第一個參數 key 指定的鍵中。若基數估計(評估的元素個數)發生變化,回傳1,否則傳回0,即在執行指令後確認基數估計是否已變化。如果指定的 key 不存在,那麼就建立一個空的 HyperLogLog 資料結構(即,指定字串長度以及編碼的 Redis String)。也可以呼叫不指定元素參數而只指定鍵的指令。如果鍵存在,不執行任何操作並傳回 0;如果鍵不存在,則會建立新的 HyperLogLog 資料結並且傳回 1。實質上只是產生一個新的 HyperLogLog 資料結構,而不儲存任何元素。

(1) 語法格式:

PFADD key element [element ...]

(2) 傳回值:

整數,如果至少有個元素被加回 1,否則回傳 0。

(3) Example:

127.0.0.1:6379> PFADD hll a b c d e f g
(integer) 1
127.0.0.1:6379> pfcount hll
(integer) 7

3.2 PFCOUNT

最早可用版本:2.8.9。時間複雜度:O(1),對於多個比較大的key的時間複雜度是O(N)。

使用PFCOUNT指令可以得到一個HyperLogLog估算基數的值(也就是元素的數量)。如果鍵不存在,則指令傳回 0,否則傳回該鍵的基數估算值。對於多個鍵,傳回的是多個 HyperLogLog 並集的基數估算值,透過將多個 HyperLogLog 合併為一個臨時的 HyperLogLog 計算基數估算值。使用極少且一貫的記憶體量,HyperLogLog 可以計算集合的唯一元素數量。每個 HyperLogLog 只用 12K 加上鍵本身的幾個位元組。

(1) 語法格式:

PFCOUNT key [key ...]

(2) 傳回值:

整數,傳回指定HyperLogLog 的基數估算值,如果多個HyperLogLog 則傳回並集的基數估算值。

(3) Example:

127.0.0.1:6379> PFADD hll foo bar zap
(integer) 1
127.0.0.1:6379> PFADD hll zap zap zap
(integer) 0
127.0.0.1:6379> PFADD hll foo bar
(integer) 0
127.0.0.1:6379> PFCOUNT hll
(integer) 3
127.0.0.1:6379> PFADD some-other-hll 1 2 3
(integer) 1
127.0.0.1:6379> PFCOUNT some-other-hll
(integer) 3
127.0.0.1:6379> PFCOUNT hll some-other-hll
(integer) 6

(4) 限制:

HyperLogLog 回傳的結果並不精確,錯誤率大概在 0.81% 左右。

使用這個指令將會改變 HyperLogLog,並且使用 8 個位元組來儲存上一次計算的基數。所以,從技術角度來講,PFCOUNT 是一個寫指令。

(5) 效能問題

即使理論上處理一個密集型 HyperLogLog 需要花費較長時間,但是當只指定一個鍵時,PFCOUNT 指令仍然具有很高的效能。這是因為 PFCOUNT 會快取上一次計算的基數,而這個基數並不會一直變動,因為 PFADD 指令大多數情況下不會更新暫存器。所以才可以達到每秒上百次請求的效果。

當使用 PFCOUNT 指令處理多個鍵時,會對 HyperLogLog 進行合併操作,這一步非常耗時,更重要的是透過計算出來的並集的基數是不能快取的。使用多個按鍵時,PFCOUNT 的執行可能需要花費一些時間(通常為毫秒級),因此建議不要過度使用。

需要注意的是,該命令的單鍵和多鍵執行語義是不同的並且具有不同的性能。不建議過度使用多鍵執行語意。

3.3 PFMERGE

最早可用版本:2.8.9。時間複雜度:O(N),N是要合併的HyperLogLog的數量。

多個 HyperLogLog 可以透過 PFMERGE 指令合併成一個 HyperLogLog。合併後的 HyperLogLog 的基數估算值是透過對所有給定 HyperLogLog 進行並集計算得出的。計算完的結果儲存到指定的鍵中。

語法格式:

PFMERGE destkey sourcekey [sourcekey ...]

傳回值:

傳回 OK。

Example:

127.0.0.1:6379> PFADD hll1 foo bar zap a
(integer) 1
127.0.0.1:6379> PFADD hll2 a b c foo
(integer) 1
127.0.0.1:6379> PFMERGE hll3 hll1 hll2
OK
127.0.0.1:6379> PFCOUNT hll3
(integer) 6

以上是Redis怎麼使用HyperLogLog實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
REDIS:揭示其目的和關鍵應用程序REDIS:揭示其目的和關鍵應用程序May 03, 2025 am 12:11 AM

Redisisanopen-Source,內存內部的庫雷斯塔氏菌,卡赫和梅斯吉級,excellingInsPeedAndVersatory.itiswidelysusedforcaching,Real-Timeanalytics,Session Management,Session Managements,and sessighterboarderboarderboardobboardotoitsssupportfortfortfortfortfortfortfortfortorvortfortfortfortfortfortforvortfortforvortforvortforvortfortforvortforvortforvortforvortdatastherctuct anddatataCcessandcessanddataaCces

REDIS:鍵值數據存儲的指南REDIS:鍵值數據存儲的指南May 02, 2025 am 12:10 AM

Redis是一個開源的內存數據結構存儲,用作數據庫、緩存和消息代理,適合需要快速響應和高並發的場景。 1.Redis使用內存存儲數據,提供微秒級的讀寫速度。 2.它支持多種數據結構,如字符串、列表、集合等。 3.Redis通過RDB和AOF機制實現數據持久化。 4.使用單線程模型和多路復用技術高效處理請求。 5.性能優化策略包括LRU算法和集群模式。

REDIS:緩存,會話管理等REDIS:緩存,會話管理等May 01, 2025 am 12:03 AM

Redis的功能主要包括緩存、會話管理和其他功能:1)緩存功能通過內存存儲數據,提高讀取速度,適用於電商網站等高頻訪問場景;2)會話管理功能在分佈式系統中共享會話數據,並通過過期時間機制自動清理;3)其他功能如發布-訂閱模式、分佈式鎖和計數器,適用於實時消息推送和多線程系統等場景。

REDIS:探索其核心功能和好處REDIS:探索其核心功能和好處Apr 30, 2025 am 12:22 AM

Redis的核心功能包括內存存儲和持久化機制。 1)內存存儲提供極快的讀寫速度,適用於高性能應用。 2)持久化通過RDB和AOF兩種方式確保數據不丟失,選擇依據應用需求。

REDIS的服務器端操作:它提供的REDIS的服務器端操作:它提供的Apr 29, 2025 am 12:21 AM

Redis'sserver-sedierations offerfunctions andTriggersForexeCutingCompleXoperationsontheserver.1)函數functionsAllowCompOustomoperationsInlua,JavaScript,javaScript,orredis'sscriptinglanguigh,增強效率和增強性。 2)

REDIS:數據庫還是服務器?揭開角色的神秘面紗REDIS:數據庫還是服務器?揭開角色的神秘面紗Apr 28, 2025 am 12:06 AM

redisisbothadatabaseandaserver.1)asadatabase,ituseSin-memorystorageforfastaccess,ifealforreal-timeapplications andCaching.2)Asaserver,ItsupportsPub/submessagingAndluAsessingandluAsessingandluascriptingftingftingftingftingftingftingftingfinteral-timecommunicationandserverserverserverserverserverserverserver-soperations。

REDIS:NOSQL方法的優勢REDIS:NOSQL方法的優勢Apr 27, 2025 am 12:09 AM

Redis是NoSQL數據庫,提供高性能和靈活性。 1)通過鍵值對存儲數據,適合處理大規模數據和高並發。 2)內存存儲和單線程模型確保快速讀寫和原子性。 3)使用RDB和AOF機制進行數據持久化,支持高可用性和橫向擴展。

REDIS:了解其架構和目的REDIS:了解其架構和目的Apr 26, 2025 am 12:11 AM

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具