三種特殊資料類型(geospatial,hyperloglog,Bitmaps)
geospatial
geoadd 添加地理位置資訊
該指令以采用标準格式的參數x y,是以經度必須在緯度之前。這些坐标的限制是可以被編入索引的,區域面積可以很接近極點但是不能索引。具體的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001規定如下:
有效的經度從-180度到180度。
有效的緯度從-85.05112878度到85.05112878度。
當坐标位置超出上述指定範圍時,該指令将會傳回一個錯誤。
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 127.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 108.94 34.26 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.26 30.24 hangzhu
(integer) 1
geopos 擷取指定城市的經度和緯度
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
geodist 擷取指定城市之間的距離,機關自選
127.0.0.1:6379> geodist china:city beijing xian km
"911.3409"
georadius 以給定的經緯度為中心,找出某一半徑内的元素
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #以110,30這個經緯度為中心,尋找方圓1000km内的城市
1) "xian"
2) "shenzhen"
3) "hangzhu"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist #顯示到中間距離的位置
1) 1) "xian"
2) "484.2186"
2) 1) "shenzhen"
2) "924.6408"
3) 1) "hangzhu"
2) "987.1218"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord
1) 1) "xian"
2) 1) "108.93999785184860229"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist count 2 #篩選出指定的結果!
1) 1) "xian"
2) "484.2186"
2) 1) "shenzhen"
2) "924.6408"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km #以北京為中心,找出半徑1000km内的城市
1) "beijing"
2) "xian"
geohash 将城市的經緯度轉換為11個字元的字元串,如果兩個字元串越接近,則距離越近
127.0.0.1:6379> geohash china:city shanghai xian
1) "wvd9sthzfm0"
2) "wqj6yuzdvy0"
geo底層就是zset,可以使用zset來操作geo
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhu"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> zrem china:city shanghai
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhu"
4) "beijing"
hyperloglog
基數
A{1,3,5,7,8,7}
B{1,3,5,7,8}
基數(不重複的元素)=5,(可以接受的誤差)
Redis 2.8.9版本就更新了Hyperloglog資料結構。Redis Hyperloglog基數統計的算法
- 優點∶占用的記憶體是固定,2^64不同的元素的基數,隻需要用12KB記憶體!如果要從記憶體角度來比較的話,Hyperloglog首選
網頁的UV(一個人通路一個網站多次,但是還是算作一個人)
傳統的方式,set儲存使用者的id,然後就可以統計set 中的元素數量作為标準判斷。這個方式如果儲存大量的使用者id,就會比較麻煩。目的是為了計數,而不是儲存使用者id 。
Hyperloglog會有0.81%的錯誤率,但對于統計任務來說,可忽略不計。
127.0.0.1:6379> PFADD mycount 1 2 3 4 5 6 7 8 9 #建立第一組元素mykey
(integer) 1
127.0.0.1:6379> PFCOUNT mycount #計數mycount元素個數
(integer) 9
127.0.0.1:6379> pfadd mycount2 2 6 5 47 8 9 1 2 3
(integer) 1
127.0.0.1:6379> pfcount mycount2
(integer) 8
127.0.0.1:6379> PFMERGE mycount3 mycount mycount1 #合并mycount mycount1至mycount3
OK
127.0.0.1:6379> PFCOUNT mycount3
(integer) 9
綜上比較:
允許容錯,則可以使用hyperloglog
如果不允許,就使用set或自定義資料類型
Bitmaps
位儲存
bitmaps:位圖,資料結構。都是通過二進制位來進行記錄。
統計使用者資訊,活躍/不活躍。
setbit (setbit 圖名 位置 值 )設定位圖某一位置的值
getbit 擷取某一位置的值
統計一周七天打卡情況(0代表未打卡,1代表打卡)
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 4
(integer) 0
