一、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