Redis特殊資料型別GeoSpatical+Hyperloglog+.Bitmaps
阿新 • • 發佈:2022-04-19
GeoSpatical
城市經度緯度查詢
定位朋友 附近的人 打車距離計算
半徑之內的人 附近的人城市距離遠近等等
https://redis.io/commands/geoadd/
新增資訊查詢資訊
127.0.0.1:6379> GEOADD china:city 116.41667 39.91667 beijing #新增城市資訊 經度維度 (integer) 1 127.0.0.1:6379> GEOADD china:city 121.43333 31.23000 shanghai (integer) 1 127.0.0.1:6379> GEOADD china:city 106.45000 29.56667 chongqing (integer) 1 127.0.0.1:6379> GEOADD china:city 114.06667 22.61667 shenzhen (integer) 1 127.0.0.1:6379> GEOADD china:city 120.20000 30.26667 hangzhou (integer) 1 127.0.0.1:6379> GEOADD china:city 108.95000 34.26667 xian (integer) 1 127.0.0.1:6379> GEOPOS china:city beijing #查詢一個城市的經緯度 1) 1) "116.41667157411575317" 2) "39.91667095273589183" 127.0.0.1:6379> GEOPOS china:city beijing xian #一次查詢多個城市的經緯度 1) 1) "116.41667157411575317" 2) "39.91667095273589183" 2) 1) "108.95000249147415161" 2) "34.2666710302806834"
查詢城市之間的直線距離
127.0.0.1:6379> GEODIST china:city beijing shanghai #查詢beijing shanghai距離
"1066981.1340"
127.0.0.1:6379> GEODIST china:city beijing shanghai km # 以km為單位查詢
"1066.9811"
127.0.0.1:6379> GEODIST china:city beijing chongqing km
"1465.8918"
指定座標周圍的人
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #查詢指定座標 1000km的城市 1) "chongqing" 2) "xian" 3) "shenzhen" 4) "hangzhou" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km # 500km周圍的城市 1) "chongqing" 2) "xian" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 查詢周圍城市+直線距離 1) 1) "chongqing" 2) "346.0548" 2) 1) "xian" 2) "484.7511" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord #查詢周圍城市+經緯度 1) 1) "chongqing" 2) 1) "106.4500012993812561" 2) "29.56666939001875249" 2) 1) "xian" 2) 1) "108.95000249147415161" 2) "34.2666710302806834" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoo rd count 1 #查詢指定定位指定直線距離的城市 並帶上直線距離和經緯度 查詢一個城市 1) 1) "chongqing" 2) "346.0548" 3) 1) "106.4500012993812561" 2) "29.56666939001875249" #場景 周圍的人 100人 就 count 100 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2 #2個人 1) 1) "chongqing" 2) "346.0548" 3) 1) "106.4500012993812561" 2) "29.56666939001875249" 2) 1) "xian" 2) "484.7511" 3) 1) "108.95000249147415161" 2) "34.2666710302806834"
根據城市周圍定位
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km #beijing周圍100km的城市
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 1000 km #shanghai周圍 1000km的城市
1) "hangzhou"
2) "shanghai"
經緯度轉換成hash值
127.0.0.1:6379> GEOHASH china:city beijing chongqing 1) "wx4g14s53n0" 2) "wm78nq6w2f0"
關於geo
redis底層就是五大基礎資料型別 其它的型別本質上也是五大基本型別轉變體
geo底層的基本資料型別是zset
127.0.0.1:6379> zrange china:city 0 -1 #可以通過zset查詢所有城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing #geo沒有刪除功能 可以通過zrem 刪除某個城市
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1 # 刪除成功
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
Hyperloglog
基數統計的演算法
基數 集合內不重複的數的統計
a{a,b,c,c,d}
b{d,e,f,g}
abd的基數={a,b,c,d,e,f,g}=7
應用場景
網站訪問量uv (一個人的多次不重複動作要被統計為一個人)
傳統方式set使用者儲存使用者id 使用者量大 佔用大量記憶體來儲存id 但是我們的目只是統計uv
記憶體浪費了
Hyperloglog的優點 佔用記憶體小12kb記憶體 錯誤了0.81% 可以被允許
127.0.0.1:6379> PFADD mypf a b c d e f g h #建立一個集合a-h
(integer) 1
127.0.0.1:6379> PFCOUNT mypf #查詢統計數量為8
(integer) 8
127.0.0.1:6379> PFADD mypf1 h i j k l m n u #建立另外一個集合h-u
(integer) 1
127.0.0.1:6379> PFCOUNT mypf1 #拆線呢統計數量也是8 連個集合有一個重複元素h
(integer) 8
127.0.0.1:6379> PFMERGE mypf2 mypf mypf1 #把上面連個元素放到mypf2
OK
127.0.0.1:6379> PFCOUNT mypf2 #查詢新元素的個數 15 自動去重了
(integer) 15
Bitmaps
位儲存 佔用空間最小
適用於非黑即白的兩種狀態的場景 0 1
判斷、統計活躍、不活躍,登入、未登入這些非1即0的場景
打卡 沒打卡 bitmaps使用起來 很省記憶體
以一年365天卡資訊為例
365=365bit /8=64位元組 一年的打卡記錄資訊只佔用64位元組
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379>
127.0.0.1:6379> SETBIT daka 0 1
(integer) 0
127.0.0.1:6379> SETBIT daka 1 1
(integer) 0
127.0.0.1:6379> SETBIT daka 2 1
(integer) 0
127.0.0.1:6379> SETBIT daka 3 1
(integer) 0
127.0.0.1:6379> SETBIT daka 4 1
(integer) 0
127.0.0.1:6379> SETBIT daka 5 1
(integer) 0
127.0.0.1:6379> SETBIT daka 6 0
(integer) 0
127.0.0.1:6379> SETBIT daka 7 0 #錄入7天開啟資訊
(integer) 0
127.0.0.1:6379> GETBIT daka 4 #週四大卡了
(integer) 1
127.0.0.1:6379> GETBIT daka 6 #週六沒打卡
(integer) 0
127.0.0.1:6379> BITCOUNT daka #一共開啟6天 0-5
(integer) 6