三種特殊數據類型


三種特殊數據類型

geospatial 地理位置

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

Redis的Geo在Redis3.2版本就推出了!這個功能可以推算地理位置的信息,兩地之間的距離,方圓幾里的人!

可以查詢一些測試數據:https://jingweidu.bmcx.com/

只有六個命令

img

GEOADD

# geoadd  添加地理位置
# 規則:兩級無法直接添加,我們一般會下載城市數據,直接通過java程序一次性導入!
#有效的經度從-180度到180度
#有效的緯度從-85.05112878度到85.05112878度
# 參數 key 值 ()
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd shanghai:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shengzheng
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2

geopos

獲得當前定位:一定是一個坐標值!

127.0.0.1:6379> geopos china:city beijing    # 獲取指定的城市的經度和緯度!
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city chongqin
1) 1) "106.49999767541885376"
   2) "29.52999957900659211"

geodist

兩人之間的距離

單位

  • m 表示單位為米。
  • km 表示單位為千米。
  • mi 表示單位為英里。
  • ft 表示單位為英尺。
127.0.0.1:6379> geodist china:city beijing chongqin km
"1464.0708"
127.0.0.1:6379> geodist china:city beijing hangzhou km
"1127.3378"

georadius

我附近的人?(獲得所有附近的人的地址,定位!)

獲取指定數量的人,200

所有數據應該都錄入:china:city,才會讓結果更加請求!

127.0.0.1:6379> georadius china:city 110 30 1000 km    #以110,30這個經緯度為中心,尋找方圓1000km內的城市
1) "chongqin"
2) "xian"
3) "shengzheng"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqin"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist    # 顯示到中心的距離
1) 1) "chongqin"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord    # 顯示定位
1) 1) "chongqin"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord withdist count 1    # 數量限制
1) 1) "chongqin"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"

georadiusbymember

127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km    # 找出位於指定元素周圍的其他元素!
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
(error) ERR could not decode requested zset member

geohash

返回一個或多個位置元素的geohash表示

該命令將返回11個字符串的geohash字符串!如果兩個字符串越接近,那么則距離越接近!

127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
2) "wm5xzrybty0"

geo 底層的實現原理其實就是Zset!我們可以使用Zset命令來操作geo!

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqin"
2) "xian"
3) "shengzheng"
4) "hangzhou"
5) "beijing"
127.0.0.1:6379> zrem china:shanghai shanghai
(integer) 0
127.0.0.1:6379> zrange china:shanghai 0 -1
(empty array)
127.0.0.1:6379> zrange shanghai:city 0 -1
1) "shanghai"
127.0.0.1:6379> zrem shanghai:city shanghai
(integer) 1

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;

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

測試使用

127.0.0.1:6379> pfadd mykey a b c d e f g h i j    # 創建第一組元素 mykey
(integer) 1
127.0.0.1:6379> pfcount mykey    # 統計 mykey 元素的基數數量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x d k b s l m
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 10
127.0.0.1:6379> pfmerge mykey3 mykey mykey2    # 合並兩組數,並集
OK
127.0.0.1:6379> pfcount mykey3
(integer) 16

如果允許容錯,那么一定可以使用Hyperloglog!

如果不允許容錯,那么就是用set或者自己的數據類型即可!

Bitmaps

位存儲

統計用戶信息,活躍,不活躍!登錄、未登錄!打卡,365打卡!兩個狀態的,都可以使用Bitmaps!

Bitmaps位圖,數據結構!都是操作二進制位進行記錄,就只有0和1兩個狀態!

365天=365bit 1字節 = 8bit 46字節左右!

使用bitmap來記錄周一到周日的打卡!

127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0

查看某一天是否有打卡!

127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0

統計操作,統計打卡的天數!

127.0.0.1:6379> bitcount sign    # 統計這周的打卡記錄,就可以看到是否有全勤!
(integer) 3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM