Redis HyperLogLog常用指令
基數是一種算法。舉個例子,一本英文著作由數百萬個單詞組成,你的記憶體卻不足以存儲它們,那麼我們先分析一下業務。
英文單詞本身是有限的,在這本書的幾百萬個單詞中有許許多多重複單詞,扣去重複的單詞,這本書中也就是幾千到一萬多個單詞而已,那麼記憶體就足夠存儲它們了。
比如數字集合 {1,2,5,7,9,1,5,9} 的基數集合為 {1,2,5,7,9} 那麼基數(不重複元素)就是 5,基數的作用是評估大約需要準備多少個存儲單元去存儲資料,但是基數的算法一般會存在一定的誤差(一般是可控的)。Redis 對基數資料結構的支援是從版本 2.8.9 開始的。
基數并不是存儲元素,存儲元素消耗記憶體空間比較大,而是給某一個有重複元素的資料集合(一般是很大的資料集合)評估需要的空間單元數,是以它沒有辦法進行存儲,加上在工作中用得不多,是以簡要介紹一下 Redis 的 HyperLogLog 指令就可以了,如表 1 所示。
命 令 | 說 明 | 備 注 |
---|---|---|
pfadd key element | 添加指定元素到 HyperLogLog 中 | 如果已經存儲元索,則傳回為 0,添加失敗 |
pfcount key | 傳回 HyperLogLog 的基數值 | — |
pfmerge desKey key1 [key2 key3...] | 合并多個 HyperLogLog,并将其儲存在 desKey 中 | — |
分析一下邏輯,首先往一個鍵為 h1 的 HyperLogLog 插入元素,讓其計算基數,到了第 5 個指令“pfadd h1 a”的時候,由于在此以前已經添加過,是以傳回了 0。它的基數集合是 {a,b,c,d},故而求集合長度為 4;之後再添加了第二個基數,它的基數集合是{a,z},是以在 h1 和 h2 合并為 h3 的時候,它的基數集合為 {a,b,c,d,z},是以求取它的基數就是 5。