天天看點

redis知識盤點【捌】_redis新特性HyperLogLogBloom Filter(布隆過濾器)GEO

這個月終于有了一些時間,看了幾本書。歸。繼續更新。這次還是先分享幾個redis之前沒寫的新特性。

HyperLogLog

2.8版本引入,可用于巨量去重統計,比如統計UV。有點是需要空間很小,隻有12KB;缺點是平均會有0.81%的誤差。不過當統計量級特别大的時候,HyperLogLog的成本效益還是很高的。

基本指令

主要有三個指令:

pfadd:增加成員

pfcount:統計成員數

pfmerge:将多個pf計數值累加一起

Bloom Filter(布隆過濾器)

4.0版本引入,可以在快速巨量資料裡去判斷某一成員是否存在。優點是相比其他實作方式節省空間,缺點是有一定的誤判機率。

基本指令

bf.add  key  sub-key:增加成員

bf.madd  key   sub-key1  sub-key2:批量增加成員

bf.exists  key   sub-key:判斷成員是否存在

可以通過bf.reverse指令來自定義布隆過濾器參數:

key:名稱

error_rate:容錯率,預設0.01。這個值越低需要的空間越大

initial_size:預計放入的元素數量,預設100。當實際數量大于這個值後,誤判率會上升

實作原理

布隆過濾器的實作原理大概是這樣的:

redis知識盤點【捌】_redis新特性HyperLogLogBloom Filter(布隆過濾器)GEO

向過濾器增加key的時候,會有多個hash算法對該key計算,基于計算結果按數組長度取模将對應數組位置置為1。當判斷一個key是否存在時,則同樣用多個hash算法對該key計算,然後判斷計算結果對應數組位置是否都為1,若是則認為該key存在。

這裡有個問題,有可能其他key計算的結果落在了同樣的數組位置上,導緻本不存在的key誤判為存在。這就是布隆過濾器誤差原因所在。也就是說,當布隆過濾器傳回這個key存在時,那麼這個key可能不存在;但是如果傳回這個key不存在,那麼這個key一定不存在。

GEO

在3.2版本引入。可用于實作類似附近的人的功能。

基本指令

geoadd  key  longitude   latitude   subkey:增加

geoadd  key  longitude-1   latitude-1   subkey-1  longitude-2   latitude-2   subkey-2:批量增加

geodist  key  subkey1   subkey2  km:計算距離

geopos  key  subkey:擷取元素位置

geohash   key    subkey:擷取元素hash值

georadiusbymember    key   subkey   {length}   km   count   {num}:擷取元素length千米内最近的num個元素,注意元素本身也傳回,如果加上withcoord傳回元素經緯度,withdist傳回距離,withhash傳回hash值

georadius   key   longitude   latitude    {length}   km   count   {num}:擷取坐标length千米内最近的num個元素,同樣可使用上面三個參數

實作原理

使用的是業界比較通用的GeoHash算法。就是将二維的經緯度映射到一維的整數,這樣大家都相當于在一條線上,隻要比較點之間的距離即可。redis是使用zset儲存元素,key為元素的健值,value是一個52位的整數。