Redis 特殊數據類型

一、Geo

Geo,即地理位置,核心原理是使用 GeoHash 這種地理空間位置編碼方法,將二維的地理空間位置的經度、緯度、名稱編碼成一維字符串,GeoHash 表示的是一個區域。

可以用來計算兩個位置之間的距離(測距),某位置周圍一定距離有哪些位置(實現附近的人、車輛功能)等。

經緯度可以通過座標拾取工具 http://api.map.baidu.com/lbsapi/getpoint/index.html 來獲取

  • geoadd:添加地理位置(經度、緯度、名稱),可以一次添加一個或多個
geoadd sights 108.971152 34.225619 dayanta
geoadd sights 108.95346 34.265725 zhonglou
geoadd sights 109.2851 34.389417 bingmayong
geoadd sights 108.779778 34.210991 kunmingchi 110.073028 34.497647 huashan
  • geopos:根據地理位置名稱獲取對應經緯度,存儲的經緯度和獲取的在精度上有所差異。
geopos sights zhonglou
  • geodist:計算兩個地理位置之間的距離,可以指定距離的單位:m、km、mi、ft
geodist sights dayanta zhonglou km
  • georadiusbymember:我們舉例來說明該指令的用法,以zhonglou爲中心,查找其方圓50km範圍內距離最近的3個地理位置,並按照距離升序排列,withdist參數表示返回對應的距離,該命令返回結果不會排除指定的中心地理位置
georadiusbymember sights zhonglou 50 km withdist count 3 asc
  • georadius:和 georadiusbymember 功能類似,但是需要指定中心位置的經緯度,而不是指定中心位置的名稱
georadius sights 108.95346 34.265725 50 km withdist count 3 asc
  • geohash:返回地理位置經緯度對應的11位geohash編碼字符串
 geohash sights zhonglou
  • 移除地理位置:官方並未直接提供移除的命令,但是,由於 GeoHash 底層是基於 ZSet 實現的,我們可以使用zrem 命令來移除
zrem sights huashan

二、HyperLogLog

如果需要統計一個網站的 UV,數據量較少的情況下可以使用Set實現,但如果是百萬甚至千萬級別的 UV 則會消耗大量的內存空間,效率低。更好的辦法是使用 HyperLogLog,它是一種不精確的數據去重、統計方案,統計結果可能存在最大0.81%的誤差,最多需要12kb的內存空間,效率高,UV 統計結果也允許有一定誤差,就可以考慮使用 HyperLogLog。

  • pfadd:添加數據記錄

  • pfcount:統計數據

  • pfmerge:根據 key 將多個 HyperLogLog 合併成一個新的 HyperLogLog,如下根據 uv uv2 合併一個新的 uv3:

pfmerge uv3 uv uv2

三、Bitmap

Bitmap,位圖,不是一種實際的數據類型,而是在 String 類型基礎上定義的位操作。在 Redis 中,字符串最終也是以二進制01組合的形式存儲的,Bitmap 相關命令就是用來操作二進制數據的。可以用來存儲一些只有兩種狀態的數據,例如簽到、打卡數據,效果高而且節省空間,比如要記錄某個用戶一年365天的打卡記錄,只需要365bit,約46byte。

  • setbit:設置 key 對應 value 在指定 offset(偏移量,從0開始) 位置的 bit(0、1)值。
    比如我們記錄某個用戶一週內每天的簽到情況,0表示未簽到,1表示簽到:
setbit sign 0 1
  • getbit:獲取 key 對應 value 在指定 offset 位置的 bit 值,如下獲取用戶一週內某一天的簽到情況:
getbit sign 1
  • bitcount:統計在指定 offset 範圍內,二進制數據中1的個數,如下統計用戶一週內簽到的天數:
bitcount sign 0 6
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章