1. 程式人生 > 其它 >Redis特殊資料型別GeoSpatical+Hyperloglog+.Bitmaps

Redis特殊資料型別GeoSpatical+Hyperloglog+.Bitmaps

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