Redis三種特殊結構的資料類型
geospatial
朋友的定位、附近的人、打車距離計算?
Redis的Geospatial在Redis3.2就推出了,這個功能可以推算地理位置的資訊,兩地之間的距離,方圓幾裡的人!
-
getadd 添加地理位置,規則:兩級無法直接添加,我們一般會下載下傳城市資料,直接通過java程式一次性導入!參數 key 值(次元、經度、名稱)
例如:
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing #添加城市的經度緯度
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> GEOPOS china:city beijing shenzhen #擷取指定城市的經度緯度
1) 1) “116.39999896287918091”
2) “39.90000009167092543”
2) 1) “114.04999762773513794”
2) “22.5200000879503861”
-
GEODIST:兩人之間的距離!
機關:
m表示機關、km表示千米
127.0.0.1:6379> GEODIST china:city beijing shenzhen #北京到深圳的直線距離 機關:米
“1945788.0901”
127.0.0.1:6379> GEODIST china:city beijing shenzhen km #北京到深圳的直線距離 機關:千米
“1945.7881”
-
GEORADIUS 以給定的經緯度為中心,找出某一半徑内的元素
我附近的人?(獲得所有附近的人的位址,定位!)通過半徑來查詢!
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #查詢以110 30經緯度為中心,半徑為1000km的中國城市
1) “chongqing”
2) “shenzhen”
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) “chongqing”
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist #withdist顯示直線距離
1) 1) “chongqing”
2) “341.9374”
2) 1) “shenzhen”
2) “924.6408”
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord #顯示經緯度
1) 1) “chongqing”
2) 1) “106.49999767541885376”
2) “29.52999957900659211”
2) 1) “shenzhen”
2) 1) “114.04999762773513794”
2) “22.5200000879503861”
#找出位于指定元素周圍的其他元素:
127.0.0.1:6379> GEORADIUSBYMEMBER china:city chongqing 1100 km
1) “chongqing”
2) “shenzhen”
GEOHASH指令-傳回一個或多個位置元素的Geohash字元串屬性
127.0.0.1:6379> ZRANGE china:city 0 -1
1) “chongqing”
2) “shenzhen”
3) “beijing”
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) “chongqing”
2) “shenzhen”
Hyperloglog
什麼是基數?
A{1,3,5,7,8,9} B{1,3,5,7,8}
基數(不重複的元素)= 5,可以接受誤差!
簡介
Redis2.8.9版本就更新了Hyperloglog資料結構!
Redis Hyperloglog 基數統計的算法!
優點:占用的記憶體是固定,2^64不同的元素的技術,隻需要費12KB記憶體!
網頁的UV(一個人通路一個網站多次,但是還是算作一個人!)
傳統的方式,set儲存使用者的id,然後就可以統計set中的元素數量作為标準判斷!
這個方式如果儲存大量的使用者id,就會比較麻煩!我們的目的是為了技術,而不是儲存使用者id;0.81%錯誤率!統計UV任務,可以忽略不計的!
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
位存儲
統計使用者資訊,活躍,不活躍!登入,未登入!打卡,365打卡!兩個狀态的,都可以使用Bitmaps!
Bitmaps位圖,資料結構!都是操作二進制位來進行記錄,就隻有0和1兩個狀态!
365天=365bit 1位元組=8bit 46個位元組左右!
- 常用操作:模拟一周打卡的情況
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> bitcount sign #統計這周的打卡記錄,就可以看到是否有全勤!
(integer) 3