redis-22.高階資料型別

aliyeye 發表於 2021-03-04

Bitmaps

Bitmaps型別的基礎操作

  • 獲取指定key對應偏移量上的bit值

    getbit key offset
  • 設定指定key對應偏移量上的bit值,value只能是1或0

    setbit key offset value

Bitmaps型別的擴充套件操作

業務場景

電影網站

  • 統計每天某一部電影是否被點播
  • 統計每天有多少部電影被點播
  • 統計每週/月/年有多少部電影被點播
  • 統計年度哪部電影沒被點播

業務分析

54Rl1eOmNC.png!large

  • 對指定key按位進行交、並、非、異或操作,並將結果儲存到destKey中

    bitop op destKey key1 [key2 ...]
    • and : 交
    • or :並
    • not :非
    • xor :異或
  • 統計指定key中1的數量

    bitcount key [start end]

Tips:

  • redis應用於資訊狀態統計

HyperLogLog

統計獨立UV

  • 原始方案:set

    • 儲存每個使用者的id(字串)
  • 改進方案:Bitmaps

    • 儲存每個使用者狀態(bit)
  • 全新的方案:Hyperloglog

基數

  • 基數是資料集去重後元素個數
  • HyperLogLog是用來做基數統計的,運用了LogLog的演算法

TcuzkOlzIS.png!large

LogLog演算法

AePxFVFZOP.png!large

  • 原始碼

KJD8VJHJUw.png!large

HyperLogLog型別的基本操作

  • 新增資料

    pfadd key element [element ...]
  • 統計資料

    pfcount key [key ...]
  • 合併資料

    pfmerge destkey sourcekey [sourcekey ...]

Tips:

  • redis應用於獨立資訊統計

相關說明

  • 用於進行基數統計,不是集合,不儲存資料,只記錄數量而不是具體資料
  • 核心是基數估算演算法,最終數值存在一定誤差
  • 誤差範圍:基數估計的結果是一個帶有0.81%標準錯誤的近似值
  • 耗空間極小,每個hyperloglog key佔用了12K的記憶體用於標記基數
  • pfadd命令不是一次性分配12K記憶體使用,會隨著基數的增加記憶體逐漸增大
  • pfmerge命令合併後佔用的儲存空間為12K,無論合併之前資料量多少

GEO

GEO型別的基本操作

  • 新增座標點

    geoadd key longitude latitude member [longitude latitude member ...]
  • 獲取座標點

    geopos key member [member ...]
  • 計算座標點距離

    geodist key member1 member2 [unit]

    unit 單位:m、km等

  • 根據座標求範圍內的資料

    georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
  • 根據點求範圍內資料

    georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
  • 獲取指定點對應的座標hash值

    geohash key member [member ...]

Tips:

  • redis應用於地理位置計算
本作品採用《CC 協議》,轉載必須註明作者和本文連結