Redis三種特殊資料型別(geospatial、hyperloglog、bitmap)
阿新 • • 發佈:2021-01-16
技術標籤:redis
Redis三種特殊資料型別
Geospatial(地理位置)
127.0.0.1:6379> GEOADD china:city 116.46 39.92 beijing #將指定的地理空間位置(經度,緯度,名稱)新增到key中
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.48 31.22 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 113.23 23.16 guangzhou
(integer) 1
127.0.0.1:6379> GEOADD china:city 114.07 22.62 shenzhen
( integer) 1
127.0.0.1:6379> GEOPOS china:city beijing #查詢key對應的座標(經緯度)
1) 1) "116.45999997854232788"
2) "39.9199990416181052"
127.0.0.1:6379> GEORADIUS china:city 115.00 30.00 1000 km #以給定的經緯度為中心, 返回鍵包含的位置元素當中,與中心的距離不超過給定最大距離的所有位置元素。
1) "guangzhou"
2) "shenzhen"
3) "shanghai"
127.0.0.1:6379> GEODIST china:city beijing shenzhen #返回兩個給定位置之間的距離。
"1937368.5382"
127.0.0.1:6379> GEODIST china:city beijing shenzhen km
"1937.3685"
127.0.0.1:6379> GEORADIUS china:city 115.00 30.00 1000 km withcoord #顯示名稱
1) 1) "guangzhou"
2) 1) "113.22999805212020874"
2) "23.1599994376353493"
2) 1) "shenzhen"
2) 1) "114.07000154256820679"
2) "22.61999990712862285"
3) 1) "shanghai"
2) 1) "121.48000091314315796"
2) "31.21999956478423854"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 2000 km #顯示指定中心名稱在某範圍內的城市
1) "guangzhou"
2) "shenzhen"
3) "shanghai"
4) "beijing"
Geo底層是Zset實現,可以用zset命令來操作geo
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "guangzhou"
2) "shenzhen"
3) "shanghai"
4) "beijing"
127.0.0.1:6379> ZREM china:city shanghai
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "guangzhou"
2) "shenzhen"
3) "beijing"
HyperLogLog
Redis
在 2.8.9 版本添加了 HyperLogLog
結構。
Redis
HyperLogLog
是用來做基數(集合中不重複的數)統計的演算法,HyperLogLog
的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、並且是很小的。
在 Redis
裡面,每個 HyperLogLog
鍵只需要花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基 數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。
計數存在一定的誤差,誤差率整體較低。標準誤差為 0.81% 。
127.0.0.1:6379> PFADD mykeys a b c d e f g #建立第一組元素
(integer) 1
127.0.0.1:6379> PFADD mykeys2 f g h i j k l m n #建立第二組元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykeys #統計mykeys的基數數量
(integer) 7
127.0.0.1:6379> PFCOUNT mykeys2
(integer) 9
127.0.0.1:6379> PFMERGE mykeys3 mykeys mykeys2 #將mykeys和mykeys2合併到mykeys上(並集)
OK
127.0.0.1:6379> PFCOUNT mykeys3
(integer) 14
Bitmaps
位儲存
常見應用場景:某網站活躍、不活躍使用者,登入、未登入使用者,開啟、未打卡,任何兩種狀態都可以用bitmap
(點陣圖)實現、操作二進位制位,只有0、1兩個狀態
127.0.0.1:6379> setbit clock 1 1 #設定週一到週五是否打卡
(integer) 0
127.0.0.1:6379> setbit clock 2 0
(integer) 0
127.0.0.1:6379> setbit clock 3 1
(integer) 0
127.0.0.1:6379> setbit clock 3 1
(integer) 1
127.0.0.1:6379> setbit clock 4 0
(integer) 0
127.0.0.1:6379> setbit clock 5 0
(integer) 0
127.0.0.1:6379> getbit clock 4 #檢視某天是否打卡
(integer) 0
127.0.0.1:6379> bitcount clock #統計開啟的天數
(integer) 2