1. 程式人生 > 其它 >Redis三種特殊資料型別(geospatial、hyperloglog、bitmap)

Redis三種特殊資料型別(geospatial、hyperloglog、bitmap)

技術標籤: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