1. 程式人生 > 其它 >5.1.4 NoSQL資料庫-Redis(鍵值key-value)-三種特殊資料型別

5.1.4 NoSQL資料庫-Redis(鍵值key-value)-三種特殊資料型別

技術標籤:大資料成神之路

目錄

1.Geospatial(地理位置)

2.Hyperloglog(基數統計)

3.BitMaps(點陣圖)


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必須是以下單位的其中一個:

  • m表示單位為米。

  • km

    表示單位為千米。

  • mi表示單位為英里。

  • ft表示單位為英尺。

GEODIST china:city beijing shanghai km # 檢視上海到北京的直線距離
georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count]

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

關於GEORADIUS的引數

通過georadius就可以完成附近的人功能

withcoord:帶上座標

withdist:帶上距離,單位與半徑單位相同

COUNT n : 只顯示前n個(按距離遞增排序)

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