文章目錄
- 1、Geospatial地理位置詳解
- 2、Hyperloglog基數統計
- 3、Bitmap位圖場景詳解
1、Geospatial地理位置詳解
Redis的Geo在Redis3.2版本就推出了!這個功能可以推算地理位置的資訊,兩地之間的距離,方圓幾裡的人
精度次元查詢工具:網站
相關指令
- GEOADD
- GEODIST
- GEOHASH
- GEOPOS
- GEORADIUS
- GEORADIUSBYMEMBER
1、
getadd
:添加地理位置
将指定的
地理空間位置(緯度、經度、名稱)添加到指定的key中
。這些資料将會存儲到
sorted set
這樣的目的是為了友善使用
GEORADIUS或者GEORADIUSBYMEMBER指令對資料進行半徑查詢等操作
。
該指令以采用标準格式的參數x,y,是以
經度必須在緯度之前
。這些坐标的限制是可以被編入索引的,區域面積可以很接近極點但是不能索引。具體的限制,由
EPSG:900913 / EPSG:3785 / OSGEO:41001
規定如下:
- 有效的
從``-180度到180度`。經度
- 有效的
從緯度
。-85.05112878度到85.05112878度
- 當坐标位置超出上述指定範圍時,該指令将會傳回一個錯誤
- 參考文檔:官網
-
key(精度 緯度)
規則:兩級無法直接添加,我們一般會下載下傳城市資料,直接通過java程式一次性導入!!!
1.1、設定值
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.56 29.53 chongqin
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzheng 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
127.0.0.1:6379>
1.2、擷取指定城市的精度和緯度
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing chongqin
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.55999869108200073"
2) "29.52999957900659211"
127.0.0.1:6379>
2、
geodist
:傳回兩個給定位置之間的距離
機關
-
表示機關為米m
-
表示機關為千米km
-
表示機關為英裡mi
-
表示機關為英尺ft
127.0.0.1:6379> geodist china:city beijing shanghai # 檢視上海到比較的直線距離
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379>
3、
georadius
:以給定的經緯度為中心, 找出某一半徑内的元素
前提:所有資料都應錄入,才會讓結果更加清晰
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km # 以110,30 這個經緯度為中心,尋找方圓500km内的城市
1) "chongqin"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 5000 km # 顯示到110,30距離的位置
1) "chongqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 顯示他人的定位資訊
1) 1) "chongqin"
2) "336.2141"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 帥選出指定的結果
1) 1) "chongqin"
2) 1) "106.55999869108200073"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1 # 帥選出指定的結果
1) 1) "chongqin"
2) "336.2141"
3) 1) "106.55999869108200073"
2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2 # 帥選出指定的結果
1) 1) "chongqin"
2) "336.2141"
3) 1) "106.55999869108200073"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379>
4、
georadiusbymember
:找出位于指定範圍内的元素,中心點是由給定的位置元素決定
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km # 找出距離北京1000km的城市
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379>
5、
geohash
:傳回一個或多個位置元素的 Geohash 表示
(了解即可)
該指令将傳回11個字元的Geohash字元串
# 将二維的經緯度轉換成一維的字元串,如果兩個字元串越接近,那麼距離越近
127.0.0.1:6379> geohash china:city beijing
1) "wx4fbxxfke0"
127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
2) "wm5zbzf8ey0"
127.0.0.1:6379>
GEO底層的實作原理其實就是Zset !我們可以使用Zset指令來操作geo
127.0.0.1:6379> ZRANGE china:city 0 -1 # 檢視地圖中全部的元素
1) "chongqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> ZREM china:city beijing # 移除指定的元素
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
127.0.0.1:6379>
2、Hyperloglog基數統計
先介紹一下什麼是基數:不重複的元素
Redis 2.8.9版本就更新了
Hyperloglog
資料結構!
優點∶占用的記憶體是固定,2^64不同的元素的技術,隻需要廢12KB記憶體!如果要從記憶體角度來比較的話
Hyperloglog
首選
測試使用
127.0.0.1:6379> PFADD mykey a b c d e f g h i j # 建立第一組元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey # 統計mykey中元素的基數數量
(integer) 10
127.0.0.1:6379> PFADD mykey2 i j z x c v b n m # 建立第二組元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2
OK # 合并兩組 mykey mykey2 ==> mykey3
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
127.0.0.1:6379>
- 如果允許容錯,那麼一定可以使用
Hyperloglog
- 如果不允許容錯,就使用set或者自己的資料類型即可
3、Bitmap位圖場景詳解
位存儲
Bitmaps
位圖,資料結構,都是操作二進制位來進行記錄,就隻有0和1兩個狀态

使用
Bitmap
來記錄周一到周日的打卡,
1
是打卡,
是沒有打卡
檢視某一天是否打卡
127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379>
統計操作,統計打卡的天數
127.0.0.1:6379> bitcount sign # 統計這周的打卡記錄,就可以看到是否有全勤
(integer) 3
127.0.0.1:6379>
學習視訊:走你