前言
Redis有三種特殊的資料格式:GEO存儲地理坐标和計算,Hyperloglog用于不重複的基數統計,Bitmap位圖用于統計互斥事件。
GEO 的資料結構總共有六個指令
- geoadd
- geopos
- geodist
- georadius
- georadiusbymember
- geohash
Redis GEOADD 指令
說明
将指定的地理空間位置(緯度、經度、名稱)添加到指定的key中。
執行個體
在任意一個城市經緯度查詢網站進行查詢擷取城市資訊,然後我們對其進行操作:
參數:geoadd [key] [longitude(經度)] [latitude(次元)]
geoadd chinaCity 113.27 23.15 GuangZhou

GEOPOS - geo 查詢指令
相當于查詢geo資訊
執行個體
參數:geopos [key]
GEODIST - 檢視坐标之間的舉例
距離結果參數:
- m辨別機關為米
- km辨別機關為千米
- mi辨別機關為英裡
- ft辨別機關為英尺
執行個體
北京到廣州的距離:再添加一下北京的坐标:geoadd chinaCity 116.23 40.22 BeiJing
參數:geodist [key] [hashkey(字段)] [hashkey(字段)] 機關(不要也可以,預設米)
傳回結果為:"1918.8645"
查詢北京到廣州的直線距離:1856km 實際差不多
GEORADIUS - 查詢半徑中的資料
業務背景:擷取我附近的人?城市?
執行個體
參數:geodist [key] [hashkey(字段)] [hashkey(字段)] 機關(不要也可以,預設米)
georadius chinaCity 100 30 2000 km #以經度100,緯度30 半徑2000km的内的城市
georadius chinaCity 100 30 2000 km withdist #顯示城市名稱和到中心位置的距離
georadius chinaCity 100 30 2000 km withcoord #顯示符合條件的定位
georadius chinaCity 100 30 2000 km withcoord count 1 #輸出指定個數符合條件的
效果分别如下
Hyperloglog基數統計
說明
常用于人數統計,比如說多次通路網站的使用者,如何統計真實的不重複的通路人數:篩選重複的id——基數統計 【不重複的元素】。
那為什麼不用SET呢?因為我們的最終目的不是為了儲存id而是計數。如何了解?
比如說2^64個不同id,我們隻需要12kb記憶體,每個id存一個bool即可無需存id字元串,便可知道id是否存在。leetcode常用這種hash算法。
執行個體
127.0.0.1:6379> pfadd class1 a b c d e
(integer) 0
127.0.0.1:6379> pfcount class1
(integer) 5
127.0.0.1:6379> pfadd class2 f g h i j
(integer) 1
127.0.0.1:6379> pfcount class2
(integer) 5
127.0.0.1:6379> pfmerge class3 class1 class2
OK
127.0.0.1:6379> pfcount class3
(integer) 10
127.0.0.1:6379>
Redis(四)Redis的三種特殊資料類型:GEO、Hyperloglog和Bitmap前言GEO 的資料結構總共有六個指令
Bitmap
說明
Bitmap就是通過一個
bit
位來表示某個元素對應的值或者狀态。Bitmaps位圖操作二進制進行記錄,隻有0和1兩個狀态。
比如統計vip和非vip使用者,和其它的狀态:審批,未審批等,以及打卡,想起了優酷的窮vip注解。。。
以打卡為例:365天中每天為一個Bit,一個位元組8bit,隻需要幾十個位元組!
setbit [key] [offset] [value]
getbit [key]
bitcount [key]
舉例
😘如果對你有所幫助點個贊,給點小動力,謝謝啦~