天天看點

【Redis】Redis三種特殊資料類型(geospatial,hyperloglog,Bitmaps)三種特殊資料類型(geospatial,hyperloglog,Bitmaps)

三種特殊資料類型(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
           
【Redis】Redis三種特殊資料類型(geospatial,hyperloglog,Bitmaps)三種特殊資料類型(geospatial,hyperloglog,Bitmaps)