天天看點

Redis進階資料結構GEO/HyperLogLog/BitMapsBitmaps 位圖HyperLoglogGEO

Bitmaps 位圖

由二進制數組成的數組叫做位圖

SETBIT key offset value			給位圖指定索引設定值
GETBIT key offset			擷取位圖指定索引的值
BITCOUNT key [start] [end]     擷取位圖指定範圍(start到end,機關為位元組,如果不指定就是擷取全部)位值為1的個數
BITPOS key bit [start] [end]   擷取位圖中第一個值為 bit(0/1) 的二進制位的位置。
           

位圖應用

如果一個網站有1億使用者,假如user_id用的是整型,長度為32位,每天有5千萬獨立使用者通路,如何判斷是哪5千萬使用者通路了網站

  • 方式一:用set來儲存,使用set來儲存資料運作一天需要占用的記憶體為
32bit * 50000000 = (4 * 50000000) / 1024 /1024 MB,約為200MB
           
  • 方式二:使用bitmap的方式,如果user_id通路網站,則在user_id的索引上設定為1,沒有通路網站的user_id,其索引設定為0,此種方式運作一天占用的記憶體為
1 * 100000000 = 100000000 / 1014 /1024/ 8MB,約為12.5MB
           

由此可見,使用bitmap可以節省大量的記憶體資源

Bitmaps 最大可以存儲2^32 位

HyperLoglog

基于基數算法,極小空間完成獨立數量統計.基數就是一個資料集中不重複的元素.

PFADD key element [element …] //将任意數量的元素添加到指定的 HyperLogLog 裡面。
PFCOUNT key [key …] // 傳回基數
    // 作用于單個鍵時, 傳回儲存在給定鍵的 HyperLogLog 的近似基數
    // 作用于多個鍵時, 傳回所有給定 HyperLogLog 的并集的近似基數
PFMERGE destkey sourcekey [sourcekey …] //将多個 HyperLogLog 合并為一個 HyperLogLog , 合并後的 HyperLogLog 的基數接近于所有輸入 HyperLogLog 的可見集合(observed set)的并集.合并得出的 HyperLogLog 會被儲存在 destkey 中.
           

使用Hyperloglog注意事項:

  • Hyperloglog基數統計有0.81%錯誤率
  • Hyperloglog無法得到單條記錄

GEO

GEO即位址資訊定位可以用來存儲經緯度,計算兩地距離,範圍計算等

GEOADD key longitude latitude member [longitude latitude member …] // 将給定的空間元素(經度、緯度、名字)添加到指定的鍵裡面。
GEOPOS key member [member …] // 擷取指定名字的經緯度
GEODIST key member1 member2 [unit] //傳回兩個給定位置之間的距離。
    // unit 指定機關.m 表示機關為米(預設),km 表示機關為千米,mi 表示機關為英裡,ft 表示機關為英尺
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]  //以給定的經緯度為中心, 傳回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。
    // radius 半徑
    // WITHDIST 位置元素與中心之間的距離,距離的機關和使用者給定的範圍機關保持一緻。
    // WITHCOORD 将位置元素的經度和次元也一并傳回。
    // WITHHASH 以 52 位有符号整數的形式, 傳回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用于底層應用或者調試, 實際中的作用并不大。
    // COUNT count 擷取前N個比對元素
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count] //中心點是由給定的位置元素決定
GEOHASH key member [member …] //傳回一個或多個位置元素的 11位Geohash 表示。(經緯度轉字元串,不常用)
           

使用GEO注意事項:

  • GEO本質存儲在Zset中,可以使用Zset的指令進行删除
  • GEO有效的經度從-180度到180度。
  • GEO有效的緯度從-85.05112878度到85.05112878度。
  • GEODIST 指令在計算距離時會假設地球為完美的球形, 在極限情況下, 這一假設最大會造成 0.5% 的誤差。

繼續閱讀