天天看點

3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

1.geospatial(地理位置詳解)

geospatial可以幹什麼?

  • 朋友的定位,附近的人,打車距離的計算

geospatial隻有6個指令

  • geoadd :添加資料,但是這麼很麻煩,我們一般使用java代碼,進行添加
  • geopos :獲得目前的定位,一定是一個坐标值,也就是獲得我們輸入的資料
  • geodist :計算距離
  • georadius :以某某為中心,x為半徑,查詢半徑内的資料
  • georadiusbymember :找出位于指定元素周圍的其他元素
  • geohash :使用hash 來傳回坐标值

1.1、geoadd:

  • 注意:添加城市資料,兩極無法直接添加,我們一般會下載下傳城市資料,直接通過java程式一次性導入

添加城市經緯度

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing  # 添加城市的經緯度,這裡是北京 前面是經度,後面是緯度
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai # 添加城市的經緯度,這裡是上海 前面是經度,後面是緯度
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin # 添加城市的經緯度,這裡是重慶 前面是經度,後面是緯度
(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.16 30.24 hangzhou 108.96 34.26 xian  # 添加城市的經緯度,這裡是杭州和西安 前面是經度,後面是緯度
(integer) 2
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

1.2、geopos:

  • 檢視錄入資料城市的經緯度
127.0.0.1:6379> keys *
1) "china:city"
127.0.0.1:6379> geopos china:city shanghai   # 檢視上海的經緯度
1) 1) "121.47000163793563843"
   2) "31.22999903975783553"
127.0.0.1:6379> geopos china:city beijing     # 檢視北京的經緯度
1) 1) "116.39999896287918091"
   2) "39.90000009167092543" 
127.0.0.1:6379> geopos china:city shenzhen   # 檢視深圳的經緯度
1) 1) "114.04999762773513794"
   2) "22.5200000879503861"
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

1.3、geodist:

  • 檢視兩個城市之間的直線距離
127.0.0.1:6379> geodist china:city beijing shanghai km   # 計算北京到上海的直線距離
"1067.3788"
127.0.0.1:6379> geodist china:city beijing chongqin km   # 計算北京到重慶的直線距離
"1464.0708"
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

北京到上海的直線距離,百度查詢 1088

3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

說明還是有誤差

1.4、georadius:

  • 以xx為中心,xx為半徑,找尋半徑記憶體在的資料
  • 這裡無法使用錄入的城市資料名為中心
127.0.0.1:6379> georadius china:city 110 30 1000 km  # 查找以經度110 緯度30為中心,1000km為半徑的 ,china:city裡面符合條件的資料
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

1.5、georadiusbymember:

  • 找到成員的距離,城市之間的定位
  • 找出位于指定元素周圍的其他元素
  • 注意對比georadius
127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km  # 以china:city 中的城市 上海為中心,半徑為1000km ,查找china:city 裡面在1000km裡面的城市
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> georadiusbymember china:city beijing 500 km  # 以china:city 中的城市 北京為中心,半徑為500km ,查找china:city 裡面在500km裡面的城市
1) "beijing"
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

1.6、geohash:

  • geohash 指令,傳回一個或者多個元素的geohash表示
  • 該指令傳回11個字元串的geohash字元串
  • 将二維的經緯度,轉換為1維的字元串,如果2個字元越接近,那麼則距離越近!
127.0.0.1:6379> geohash china:city beijing shanghai chongqin  # 将china:city裡面城市坐标的經緯度,轉換為11為的hash字元串
1) "wx4fbxxfke0"
2) "wtw3sj5zbj0"
3) "wm5xzrybty0"
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps
  • geo底層的實作原理就是Zset! 我們可以使用Zset指令來操作geo
  • 删除城市資料zrem
127.0.0.1:6379> zrange china:city 0 -1   # 檢視所有城市
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrange china:city 1 3   
1) "xian"
2) "shenzhen"
3) "hangzhou"
127.0.0.1:6379> zrangebyscore china:city -inf +inf  # 升序排列
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
127.0.0.1:6379>  zrem china:city chongqin  # 删除城市的資料
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> 


           

2.hyperloglog(基數統計)

  • 什麼是基數?

    a{1,3,5,7,9}

    b{1,2,3,4,5,6}

  • 基數:不重複的元素 :ab的基數是12345679 ,hyperloglog允許接受誤差!
簡介
  • Redis 2.8.9 版本就更新了Hypeloglog資料結構!
  • Hypeloglog 是用來做基數統計的算法!
  • 網頁的UV (一個人通路一個網站,算做一次,但是一個人多次同時通路一個網站,我們也隻算作是一個人)
  • 傳統的方式 set 儲存使用者的id 然後就可以統計set中的元素數量作為标準判斷!
  • 這個方式儲存大量的使用者id就會比較麻煩,我們的目的是為了計數,而不是為了儲存使用者id

優點 :

占用的記憶體是固定的 2^64 不同元素的計數,隻需要12KB的記憶體,如果要從記憶體角度來比較的話,hyperloglog首選

0.81% 錯誤率 統計uv任務,可以忽略不計的!

如果不允許容錯,就别用它

2.1 、pfadd

  • 添加資料
127.0.0.1:6379> pfadd myhyperloglog1 a b c d e f g h i j  # 存入資料到myhyperloglog1
(integer) 1
127.0.0.1:6379> pfadd myhyperloglog2 i j k l m n o p q r  # 存入資料到myhyperloglog2
(integer) 1
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

2.2 、pfcount

  • 檢視資料
127.0.0.1:6379> pfcount myhyperloglog1   # 檢視myhyperloglog1裡面的資料有多少個不重複的
(integer) 10
127.0.0.1:6379> pfcount myhyperloglog2
(integer) 10
127.0.0.1:6379> pfadd myhyperloglog3 i j k l m n o p q r i i i i 
(integer) 1
127.0.0.1:6379> pfcount myhyperloglog3 # 檢視myhyperloglog3裡面的資料有多少個不重複的
(integer) 10
127.0.0.1:6379> 


           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

2.3 、pfmerge

  • 将兩個基數合并在一起,成為一個基數
127.0.0.1:6379> pfmerge heti myhyperloglog1 myhyperloglog2  # 将myhyperloglog1 myhyperloglog2合并到heti裡面,heti也是基數
OK
127.0.0.1:6379> pfcount heti  # 檢視裡面有多少個資料
(integer) 18
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

3.bitmaps

位存儲用處:

疫情:0000000,如果被感染 寫為1 統計疫情感染人數,

統計使用者資訊 ,活躍 不活躍

登陸 , 沒登入 打卡365 打卡

兩個狀态的都可以使用bitmaps

bitmaps位圖,資料結構,都是操作二進制位來進行記錄,就隻有0 1 兩個狀态

365天 = 365bit 1位元組 = 8 bit 46個位元組左右

3.1、setbit

  • 打個比方登記打卡
127.0.0.1:6379> setbit sign 0 1   # 第1天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 1 0   # 第2天打卡失敗
(integer) 0
127.0.0.1:6379> setbit sign 2 1   # 第3天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 3 1   # 第4天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 4 0   # 第5天打卡失敗
(integer) 0
127.0.0.1:6379> setbit sign 5 1   # 第6天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 6 1   # 第7天打卡成功
(integer) 0
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

3.2、getbit

  • 檢視當天打卡情況
127.0.0.1:6379> getbit sign 3   #第四天打卡成功
(integer) 1
127.0.0.1:6379> getbit sign 1   #第二天打卡失敗
(integer) 0
127.0.0.1:6379> 

           
3. Redis三大特殊類型geospatial ,hyperloglog,bitmaps1.geospatial(地理位置詳解)2.hyperloglog(基數統計)3.bitmaps

3.3、bitcount

  • 檢視一段時間内的打卡情況
127.0.0.1:6379> bitcount sign 0 6    # 一周内打卡成功4天
(integer) 4
127.0.0.1:6379> bitcount sign 1 4   # 周二到周五 打卡
(integer) 0
127.0.0.1:6379> 
           

繼續閱讀