這個月終于有了一些時間,看了幾本書。歸。繼續更新。這次還是先分享幾個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。當實際數量大于這個值後,誤判率會上升
實作原理
布隆過濾器的實作原理大概是這樣的:
向過濾器增加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位的整數。