5.1.4 NoSQL資料庫-Redis(鍵值key-value)-三種特殊資料型別
技術標籤:大資料成神之路
目錄
1.Geospatial(地理位置)
使用經緯度定位地理座標並用一個有序集合zset儲存,可以使用Zset命令來操作。Redis 的 Geo 在Redis3.2 版本就推出了! 這個功能可以推算地理位置的資訊,兩地之間的距離,方圓幾裡的人!
命令 | 描述 | 舉例 |
---|---|---|
geoadd key longitud(經度) latitude(緯度) member [..] | 將具體經緯度的座標存入一個有序集合 # 規則:兩級無法直接新增,我們一般會下載城市資料,直接通過java程式一次性匯入! # 有效的經度從-180度到180度。 # 有效的緯度從-85.05112878度到85.05112878度。 # 當座標位置超出上述指定範圍時,該命令將會返回一個錯誤 | geoadd china:city 116.40 39.90 beijing |
geopos key member [member..] | 獲取集合中的一個/多個成員座標 | GEOPOS china:city beijing # 獲取指定的城市的經度和緯度! |
geodist key member1 member2 [unit] | 返回兩個給定位置之間的距離。預設以米作為單位。 指定單位的引數unit必須是以下單位的其中一個:
| GEODIST china:city beijing shanghai km # 檢視上海到北京的直線距離 |
georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count] | 以給定的經緯度為中心, 返回集合包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。 關於GEORADIUS的引數
| GEORADIUS china:city 110 30 1000 km # 以110,30 這個經緯度為中心,尋找方圓1000km內的城市 GEORADIUS china:city 110 30 500 km withdist # 顯示到中間距離的位置 GEORADIUS china:city 110 30 500 km withdist withcoord count 1 # 篩選出指定的結果! |
GEORADIUSBYMEMBER key member radius... | 功能與GEORADIUS相同,只是中心位置不是具體的經緯度,而是使用結合中已有的成員作為中心點。 | GEORADIUSBYMEMBER china:city beijing 1000 km # 找出位於指定元素周圍的其他元素! |
geohash key member1 [member2..] | 返回一個或多個位置元素的Geohash表示。使用Geohash位置52點整數編碼。該命令將返回11個字元的Geohash字串! | geohash china:city beijing chongqi 1) "wx4fbxxfke0" 2) "wm5xzrybty0" |
----------------georadius---------------------
127.0.0.1:6379> GEORADIUS china:city 120 30 500 km withcoord withdist # 查詢經緯度(120,30)座標500km半徑內的成員
1) 1) "hangzhou"
2) "29.4151"
3) 1) "120.20000249147415"
2) "30.199999888333501"
2) 1) "shanghai"
2) "205.3611"
3) 1) "121.40000134706497"
2) "31.400000253193539"
------------geohash---------------------------
127.0.0.1:6379> geohash china:city yichang shanghai # 獲取成員經緯座標的geohash表示
1) "wmrjwbr5250"
2) "wtw6ds0y300"
2.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 |
----------PFADD--PFCOUNT---------------------
127.0.0.1:6379> PFADD myelemx a b c d e f g h i j k # 新增元素
(integer) 1
127.0.0.1:6379> type myelemx # hyperloglog底層使用String
string
127.0.0.1:6379> PFCOUNT myelemx # 估算myelemx的基數
(integer) 11
127.0.0.1:6379> PFADD myelemy i j k z m c b v p q s
(integer) 1
127.0.0.1:6379> PFCOUNT myelemy
(integer) 11
----------------PFMERGE-----------------------
127.0.0.1:6379> PFMERGE myelemz myelemx myelemy # 合併myelemx和myelemy 成為myelemz
OK
127.0.0.1:6379> PFCOUNT myelemz # 估算基數
(integer) 17
如果允許容錯,那麼一定可以使用Hyperloglog ! 如果不允許容錯,就使用set或者自己的資料型別即可 !
3.BitMaps(點陣圖)
使用位儲存,資訊狀態只有 0 和 1
Bitmap是一串連續的2進位制數字(0或1),每一位所在的位置為偏移(offset),在bitmap上可執行AND,OR,XOR,NOT以及其它位操作。
應用場景
簽到統計(到了1,未到0)、狀態統計(每天打卡,打卡了1,未打卡0)
命令 | 描述 |
---|---|
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只能按位元組,不能按位 |
------------setbit--getbit--------------
127.0.0.1:6379> setbit sign 0 1 # 設定sign的第0位為 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 設定sign的第2位為 1 不設定預設 是0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> type sign
string
127.0.0.1:6379> getbit sign 2 # 獲取第2位的數值
(integer) 1
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 4 # 未設定預設是0
(integer) 0
-----------bitcount----------------------------
127.0.0.1:6379> BITCOUNT sign # 統計sign中為1的位數
(integer) 4