天天看點

redis學習四、redis三種特殊資料類型

三種特殊資料類型

Geospatial(地理位置)

朋友的定位,附近的人,打車距離計算? Redis 的 Geo 在Redis3.2 版本就推出了! 這個功能可以推算地理位置的資訊,兩地之間的距離,方圓 幾裡的人!

可以查詢一些測試資料:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/

隻有 六個指令:

使用經緯度定位地理坐标并用一個有序集合zset儲存,是以zset指令也可以使用
指令 描述

geoadd key longitud(經度) latitude(緯度) member [..]

将具體經緯度的坐标存入一個有序集合

geopos key member [member..]

擷取集合中的一個/多個成員坐标

geodist key member1 member2 [unit]

傳回兩個給定位置之間的距離。預設以米作為機關。

georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count]

以給定的經緯度為中心, 傳回集合包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。

GEORADIUSBYMEMBER key member radius...

功能與GEORADIUS相同,隻是中心位置不是具體的經緯度,而是使用結合中已有的成員作為中心點。

geohash key member1 [member2..]

傳回一個或多個位置元素的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就能幫助我們利用最小的空間完成。
指令 描述

PFADD key element1 [elememt2..]

添加指定元素到 HyperLogLog 中

PFCOUNT key [key]

傳回給定 HyperLogLog 的基數估算值。

PFMERGE destkey sourcekey [sourcekey..]

将多個 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 個位元組左右!

指令 描述

setbit key offset value

為指定key的offset位設定值

getbit key offset

擷取offset位的值

bitcount key [start end]

統計字元串被設定為1的bit數,也可以指定統計範圍按位元組

bitop operration destkey key[key..]

對一個或多個儲存二進制位的字元串 key 進行位元操作,并将結果儲存到 destkey 上。

BITPOS key bit [start] [end]

傳回字元串裡面第一個被設定為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是一串從左到右的二進制串

繼續閱讀