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>

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>
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>
北京到上海的直線距離,百度查詢 1088
說明還是有誤差
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>
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>
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>
- 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>
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>
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.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.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.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>