三種特殊資料類型
Geospatial(地理位置)
朋友的定位,附近的人,打車距離計算? Redis 的 Geo 在Redis3.2 版本就推出了! 這個功能可以推算地理位置的資訊,兩地之間的距離,方圓 幾裡的人!
可以查詢一些測試資料:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/
隻有 六個指令:
使用經緯度定位地理坐标并用一個有序集合zset儲存,是以zset指令也可以使用
指令 | 描述 |
---|---|
| 将具體經緯度的坐标存入一個有序集合 |
| 擷取集合中的一個/多個成員坐标 |
| 傳回兩個給定位置之間的距離。預設以米作為機關。 |
| 以給定的經緯度為中心, 傳回集合包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。 |
| 功能與GEORADIUS相同,隻是中心位置不是具體的經緯度,而是使用結合中已有的成員作為中心點。 |
| 傳回一個或多個位置元素的Geohash表示。使用Geohash位置52點整數編碼。 |
getadd 添加地理位置
# 規則:兩級無法直接添加,我們一般會下載下傳城市資料,直接通過java程式一次性導入!
# 有效的經度從-180度到180度。
# 有效的緯度從-85.05112878度到85.05112878度。
# 當坐标位置超出上述指定範圍時,該指令将會傳回一個錯誤。
# 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
# 參數 key 值()
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.50 29.53 chongqi 114.05 22.52 shengzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
getpos 獲得目前定位:一定是一個坐标值!
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 chongqi
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
getdist 兩人之間的距離!
指定機關的參數 unit 必須是以下機關的其中一個:
- m 表示機關為米。
- km 表示機關為千米。
- mi 表示機關為英裡。
- ft 表示機關為英尺。
127.0.0.1:6379> GEODIST china:city beijing shanghai km # 檢視上海到北京的直線距離
"1067.3788"
127.0.0.1:6379> GEODIST china:city beijing chongqi km # 檢視重慶到北京的直線距離
"1464.0708"
getradius 以給定的經緯度為中心, 找出某一半徑内的元素
我附近的人?
(獲得所有附近的人的位址,定位!)通過半徑來查詢!
獲得指定數量的人,200
所有資料應該都錄入:china:city ,才會讓結果更加請求!
關于GEORADIUS的參數
通過
georadius
就可以完成 附近的人功能
withcoord:帶上坐标
withdist:帶上距離,機關與半徑機關相同
COUNT n : 隻顯示前n個(按距離遞增排序)
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 以110,30 這個經緯度為中心,尋
找方圓1000km内的城市
1) "chongqi"
2) "xian"
3) "shengzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqi"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 顯示到中間距離的位置
1) 1) "chongqi"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 顯示他人的定位資訊
1) 1) "chongqi"
2) 1) "106.49999767541885376"
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) "chongqi"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqi"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
georadiusbymember 找出位于指定元素周圍的其他元素!
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
geohash 指令 - 傳回一個或多個位置元素的 Geohash 表示
該指令将傳回11個字元的Geohash字元串!
# 将二維的經緯度轉換為一維的字元串,如果兩個字元串越接近,那麼則距離越近!
127.0.0.1:6379> geohash china:city beijing chongqi
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
GEO 底層的實作原理其實就是 Zset!我們可以使用Zset指令來操作geo!
127.0.0.1:6379> ZRANGE china:city 0 -1 # 檢視地圖中全部的元素
1) "chongqi"
2) "xian"
3) "shengzhen"
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) "chongqi"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
Hyperloglog(基數統計)
Redis HyperLogLog 是用來做基數統計的算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、并且是很小的。
花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基數。
因為 HyperLogLog 隻會根據輸入元素來計算基數,而不會儲存輸入元素本身,是以 HyperLogLog 不能像集合那樣,傳回輸入的各個元素。
其底層使用String資料類型
什麼是基數?
資料集中不重複的元素的個數。
應用場景:
網頁的通路量(UV):一個使用者多次通路,也隻能算作一個人。
傳統實作,存儲使用者的id,然後每次進行比較。當使用者變多之後這種方式及其浪費空間,而我們的目的隻是計數,Hyperloglog就能幫助我們利用最小的空間完成。
指令 | 描述 |
---|---|
| 添加指定元素到 HyperLogLog 中 |
| 傳回給定 HyperLogLog 的基數估算值。 |
| 将多個 HyperLogLog 合并為一個 HyperLogLog |
127.0.0.1:6379> PFadd mykey a b c d e f g h i j # 建立第一組元素 mykey
(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 # 建立第二組元素 mykey2
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 # 合并兩組 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> PFCOUNT mykey3 # 看并集的數量!
(integer) 15
如果允許容錯,那麼一定可以使用Hyperloglog !
如果不允許容錯,就使用set或者自己的資料類型即可 !
BitMaps(位圖)
使用位存儲,資訊狀态隻有 0 和 1
Bitmap是一串連續的2進制數字(0或1),每一位所在的位置為偏移(offset),在bitmap上可執行AND,OR,XOR,NOT以及其它位操作。
應用場景
統計使用者資訊,活躍,不活躍! 登入 、 未登入! 打卡,365打卡! 兩個狀态的,都可以使用 Bitmaps! Bitmap 位圖,資料結構! 都是操作二進制位來進行記錄,就隻有0 和 1 兩個狀态! 365 天 = 365 bit 1位元組 = 8bit 46 個位元組左右!
指令 | 描述 |
---|---|
| 為指定key的offset位設定值 |
| 擷取offset位的值 |
| 統計字元串被設定為1的bit數,也可以指定統計範圍按位元組 |
| 對一個或多個儲存二進制位的字元串 key 進行位元操作,并将結果儲存到 destkey 上。 |
| 傳回字元串裡面第一個被設定為1或者0的bit位。start和end隻能按位元組,不能按位 |
使用bitmap 來記錄 周一到周日的打卡! 周一:1 周二:0 周三:0 周四:1 …
#存入打卡資訊
127.0.0.1:6379> setbit singel 0 1
(integer) 0
127.0.0.1:6379> setbit singel 1 0
(integer) 0
127.0.0.1:6379> setbit singel 2 0
(integer) 0
127.0.0.1:6379> setbit singel 3 0
(integer) 0
127.0.0.1:6379> setbit singel 4 1
(integer) 0
127.0.0.1:6379> setbit singel 5 0
(integer) 0
127.0.0.1:6379> setbit singel 6 1
(integer) 0
#檢視某一天是否有打卡!
127.0.0.1:6379> getbit singel 6
(integer) 1
#統計操作,統計 打卡的天數!
127.0.0.1:6379> bitcount sign # 統計這周的打卡記錄,就可以看到是否有全勤!
(integer) 3
bitmaps的底層
bitmaps是一串從左到右的二進制串