最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis如何使用HyperLogLog的實(shí)現(xiàn)

 更新時(shí)間:2022年06月02日 10:48:54   作者:@SmartSi  
本文主要介紹了Redis如何使用HyperLogLog的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 概述

Redis 在 2.8.9 版本添加了 HyperLogLog 數(shù)據(jù)結(jié)構(gòu),用來做基數(shù)統(tǒng)計(jì),其優(yōu)點(diǎn)是在輸入元素的數(shù)量非常大時(shí),計(jì)算基數(shù)所需的空間比較小并且一般比較恒定。

在 Redis 里面,每個(gè) HyperLogLog 鍵只需要花費(fèi) 12 KB 內(nèi)存就可以計(jì)算接近 2^64 個(gè)不同元素的基數(shù)。這和計(jì)算基數(shù)時(shí),元素越多耗費(fèi)內(nèi)存越多的集合形成鮮明對比。但是,因?yàn)?HyperLogLog 只會根據(jù)輸入元素來計(jì)算基數(shù),并不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣能返回輸入的各個(gè)元素。

2. 什么是基數(shù)?

比如數(shù)據(jù)集 {1, 3, 5, 7, 5, 7, 8}, 那么這個(gè)數(shù)據(jù)集的基數(shù)集為 {1, 3, 5 ,7, 8}, 基數(shù)(不重復(fù)元素)為5。基數(shù)估計(jì)就是在誤差可接受的范圍內(nèi),快速計(jì)算基數(shù)。

3. 命令

HyperLogLog 目前只支持 3 個(gè)命令,PFADD、PFCOUNT、PFMERGE。我們先來逐一介紹一下。

3.1 PFADD

最早可用版本:2.8.9。時(shí)間復(fù)雜度:O(1)。

PFADD 命令可以將元素(可以指定多個(gè)元素)添加到 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)中,存儲到第一個(gè)參數(shù) key 指定的鍵中。命令執(zhí)行之后,如果基數(shù)估計(jì)(評估的元素個(gè)數(shù))發(fā)生變化就返回 1,否則返回 0。如果指定的 key 不存在,那么就創(chuàng)建一個(gè)空的 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)(即,指定字符串長度以及編碼的 Redis String)。也可以調(diào)用不指定元素參數(shù)而只指定鍵的命令。如果鍵存在,不執(zhí)行任何操作并返回 0;如果鍵不存在,則會創(chuàng)建一個(gè)新的 HyperLogLog 數(shù)據(jù)結(jié)并且返回 1。本質(zhì)上只是創(chuàng)建一個(gè)新的 HyperLogLog 數(shù)據(jù)結(jié),不存儲任何元素。

(1) 語法格式:

PFADD key element [element ...]

(2) 返回值:

整型,如果至少有個(gè)元素被添加返回 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。時(shí)間復(fù)雜度:O(1),對于多個(gè)比較大的key的時(shí)間復(fù)雜度是O(N)。

PFCOUNT 命令返回指定 HyperLogLog 的基數(shù)估算值(元素個(gè)數(shù))。對于單個(gè)鍵,該命令返回的是該鍵的基數(shù)估算值,如果該鍵不存在,則返回 0。對于多個(gè)鍵,返回的是多個(gè) HyperLogLog 并集的基數(shù)估算值,通過將多個(gè) HyperLogLog 合并為一個(gè)臨時(shí)的 HyperLogLog 計(jì)算基數(shù)估算值。HyperLogLog 只使用很少且恒定的內(nèi)存來計(jì)算集合的不同元素個(gè)數(shù)。每個(gè) HyperLogLog 只用 12K 加上鍵本身的幾個(gè)字節(jié)。

(1) 語法格式:

PFCOUNT key [key ...]

(2) 返回值:

整數(shù),返回指定 HyperLogLog 的基數(shù)估算值,如果多個(gè) HyperLogLog 則返回并集的基數(shù)估算值。

(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 返回的結(jié)果并不精確,錯(cuò)誤率大概在 0.81% 左右。

該命令會修改 HyperLogLog,會使用8個(gè)字節(jié)來存儲上一次計(jì)算的基數(shù)。所以,從技術(shù)角度來講,PFCOUNT 是一個(gè)寫命令。

(5) 性能問題

即使理論上處理一個(gè)密集型 HyperLogLog 需要花費(fèi)較長時(shí)間,但是當(dāng)只指定一個(gè)鍵時(shí),PFCOUNT 命令仍然具有很高的性能。這是因?yàn)?PFCOUNT 會緩存上一次計(jì)算的基數(shù),并且這個(gè)基數(shù)并不會一直變動(dòng),因?yàn)?PFADD 命令大多數(shù)情況下不會更新寄存器。所以才可以達(dá)到每秒上百次請求的效果。

當(dāng)使用 PFCOUNT 命令處理多個(gè)鍵時(shí),會對 HyperLogLog 進(jìn)行合并操作,這一步非常耗時(shí),更重要的是通過計(jì)算出來的并集的基數(shù)是不能緩存的。因此當(dāng)使用多個(gè)鍵時(shí),PFCOUNT 可能需要花費(fèi)一些時(shí)間(毫秒數(shù)量級),因此不建議過多使用。

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

3.3 PFMERGE

最早可用版本:2.8.9。時(shí)間復(fù)雜度:O(N),N是要合并的HyperLogLog的數(shù)量。

PFMERGE 命令將多個(gè) HyperLogLog 合并為一個(gè) HyperLogLog。合并后的 HyperLogLog 的基數(shù)估算值是通過對所有給定 HyperLogLog 進(jìn)行并集計(jì)算得出的。計(jì)算完的結(jié)果保存到指定的鍵中。

語法格式:

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

到此這篇關(guān)于Redis如何使用HyperLogLog的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis HyperLogLog內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis哨兵機(jī)制的使用詳解

    Redis哨兵機(jī)制的使用詳解

    文章講解了Redis哨兵機(jī)制的基本原理、主庫和從庫自動(dòng)切換的過程、如何減少誤判、哨兵集群的組成和通信機(jī)制,以及哨兵在故障發(fā)生時(shí)如何選舉Leader進(jìn)行主從切換
    2025-01-01
  • 手把手教你使用redis實(shí)現(xiàn)排行榜功能

    手把手教你使用redis實(shí)現(xiàn)排行榜功能

    使用Redis中有序集合的特性來實(shí)現(xiàn)排行榜是又好又快的選擇,一般排行榜都是有實(shí)效性的,比如“用戶積分榜”,下面這篇文章主要給大家介紹了關(guān)于使用redis實(shí)現(xiàn)排行榜功能的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • linux下安裝redis圖文詳細(xì)步驟

    linux下安裝redis圖文詳細(xì)步驟

    大家好,本篇文章主要講的是linux下安裝redis圖文詳細(xì)步驟,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • redis和redisson實(shí)現(xiàn)分布式鎖的操作方法

    redis和redisson實(shí)現(xiàn)分布式鎖的操作方法

    使用 Redis 實(shí)現(xiàn)分布式鎖,最直接的想法是利用 setnx 和 expire 命令實(shí)現(xiàn)加鎖,這篇文章主要介紹了redis和redisson實(shí)現(xiàn)分布式鎖的操作方法,需要的朋友可以參考下
    2024-03-03
  • Redis如何在項(xiàng)目中合理使用經(jīng)驗(yàn)分享

    Redis如何在項(xiàng)目中合理使用經(jīng)驗(yàn)分享

    這篇文章主要給大家介紹了關(guān)于Redis如何在項(xiàng)目中合理使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Redis?HyperLogLog數(shù)據(jù)量統(tǒng)計(jì)的實(shí)現(xiàn)實(shí)例

    Redis?HyperLogLog數(shù)據(jù)量統(tǒng)計(jì)的實(shí)現(xiàn)實(shí)例

    在大數(shù)據(jù)時(shí)代,統(tǒng)計(jì)海量數(shù)據(jù)中的唯一值是一個(gè)常見的需求,但同時(shí)也是極具挑戰(zhàn)性的任務(wù),傳統(tǒng)的統(tǒng)計(jì)方法可能會消耗大量內(nèi)存或計(jì)算資源,而?Redis?的?HyperLogLog?數(shù)據(jù)結(jié)構(gòu)?則提供了一種高效、輕量的解決方案,下面就來詳細(xì)介紹一下HyperLogLog的使用,感興趣的可以了解一下
    2025-09-09
  • linux 常見的標(biāo)識與Redis數(shù)據(jù)庫詳解

    linux 常見的標(biāo)識與Redis數(shù)據(jù)庫詳解

    這篇文章主要介紹了linux 常見的標(biāo)識與Redis數(shù)據(jù)庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 嵌入式Redis服務(wù)器在Spring Boot測試中的使用教程

    嵌入式Redis服務(wù)器在Spring Boot測試中的使用教程

    這篇文章主要介紹了嵌入式Redis服務(wù)器在Spring Boot測試中的使用,本文通過實(shí)例代碼場景分析給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • 深入了解Redis的性能

    深入了解Redis的性能

    這篇文章主要介紹了Redis的性能,作者通過Visual Studio上的C#程序?qū)ζ溥M(jìn)行了分析,需要的朋友可以參考下
    2015-06-06
  • redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)

    redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)

    本文主要介紹了redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10

最新評論

泗水县| 九龙县| 疏附县| 凤山县| 正阳县| 水城县| 博兴县| 清镇市| 佛山市| 竹山县| 桃园市| 米林县| 十堰市| 九寨沟县| 延安市| 金门县| 鲜城| 炎陵县| 玛曲县| 旬阳县| 太原市| 枞阳县| 建阳市| 临桂县| 屏南县| 聂荣县| 奎屯市| 都江堰市| 北流市| 富民县| 临猗县| 昌黎县| 阳江市| 齐齐哈尔市| 宾阳县| 平阳县| 柞水县| 淮滨县| 玉屏| 兴隆县| 松原市|