Redis三种特殊数据类型
Redis三種特殊數(shù)據(jù)類型
geospatial 地理位置
朋友的定位, 附近的人, 打車的距離計算
Redis的Geo在Redis3.2版本就推出了.這個功能可以推算地理位置信息, 兩地之間的距離, 方圓幾里的人
首先需要一個城市經(jīng)度緯度查詢工具 自行百度搜索
只有六個命令
相關(guān)命令
GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER
getadd
添加地理位置
規(guī)則:兩級無法添加, 我們一般會下載城市數(shù)據(jù), 直接通過java程序一次性導入
參數(shù)key 值(緯度、經(jīng)度、名稱)
具體的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 規(guī)定如下:
有效的經(jīng)度從-180度到180度。
有效的緯度從-85.05112878度到85.05112878度。
當坐標位置超出上述指定范圍時,該命令將會返回一個錯誤。
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
GEOADD
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 chongqing (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>GEOPOS
獲取當前位置定位: 一定是一個坐標值!
127.0.0.1:6379> geopos china:city beijing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 127.0.0.1:6379> geopos china:city beijing chongqing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 2) 1) "106.49999767541885"2) "29.529999579006592" 127.0.0.1:6379>GEODIST
獲取當前位置定位: 一定是一個坐標值!
127.0.0.1:6379> geopos china:city beijing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 127.0.0.1:6379> geopos china:city beijing chongqing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 2) 1) "106.49999767541885"2) "29.529999579006592" 127.0.0.1:6379>GEODIST
兩人之間的距離
返回兩個給定位置之間的距離。
如果兩個位置之間的其中一個不存在, 那么命令返回空值。
指定單位的參數(shù) unit 必須是以下單位的其中一個:
- m 表示單位為米。
- km 表示單位為千米。
- mi 表示單位為英里。
- ft 表示單位為英尺。
GEORADIUS
附近的人(獲取所有附近的人的地址, 定位! )通過半徑來查詢
以給定的經(jīng)緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。
范圍可以使用以下其中一個單位:
- m 表示單位為米。
- km 表示單位為千米。
- mi 表示單位為英里。
- ft 表示單位為英尺。
所有數(shù)據(jù)都應該錄入: china:city 才會讓結(jié)果更加的準確
127.0.0.1:6379> georadius china:city 110 30 1500 km # 獲取 110 30 這個經(jīng)緯度為中心 尋找方圓1000km 內(nèi)的城市 1) "chongqing" 2) "xian" 3) "shenzhen" 4) "hangzhou" 5) "shanghai" 6) "beijing" 127.0.0.1:6379>georadius china:city 110 30 150 km withdist # 顯示到中間距離的位置 127.0.0.1:6379> georadius china:city 110 30 150 km withcoord # 顯示他人的定位信息 127.0.0.1:6379> georadius china:city 110 30 150 km withdist withcoord count 2 # 篩選指定的結(jié)果 (empty list or set) 127.0.0.1:6379>GEORADIUSBYMEMBER
找出位于指定元素周圍元素的其他元素.
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km 1) "beijing" 2) "xian" 127.0.0.1:6379>GEOHASH
命令返回一個或多個位置的geohash表示
該命令將返回11個字符的Geohash字符串
GEO底層實現(xiàn)原理
其實就是Zset 我們可以使用Zset命令來操作geo
127.0.0.1:6379> zrange china:city 0 -1 1) "chongqing" 2) "xian" 3) "shenzhen" 4) "hangzhou" 5) "shanghai" 6) "beijing" 127.0.0.1:6379>HyperLogLogs
什么是基數(shù)
基數(shù)(cardinality,也譯作勢),是指一個集合(這里的集合允許存在重復元素,與集合論對集合嚴格的定義略有不同,如不做特殊說明,本文中提到的集合均允許存在重復元素)中不同元素的個數(shù)。例如看下面的集合:
A{1, 2, 3, 4, 5, 2, 3, 9, 7}
這個集合有9個元素,但是2和3各出現(xiàn)了兩次,因此不重復的元素為1,2,3,4,5,9,7,所以這個集合的基數(shù)是7。
如果兩個集合具有相同的基數(shù),我們說這兩個集合等勢?;鶖?shù)和等勢的概念在有限集范疇內(nèi)比較直觀,但是如果擴展到無限集則會比較復雜,一個無限集可能會與其真子集等勢(例如整數(shù)集和偶數(shù)集是等勢的)。
簡介
Redis 2.8.9 版本就更新了 HyperLogLogs 數(shù)據(jù)結(jié)構(gòu)
優(yōu)點: 占用內(nèi)存是固定的 2^64 不同的元素的技術(shù) 只需要12kb 的內(nèi)存 若從內(nèi)存角度比較的話 HyperLogLogs 首選
Redis HyperLogLogs 基數(shù)統(tǒng)計算法
網(wǎng)頁UV(一個人訪問網(wǎng)站多次, 但是還是算作一個人)
傳統(tǒng)方式 set保存用戶的id 然后就可以統(tǒng)計set元素數(shù)量就可以作為標準判斷
這種方式保存大量的用戶id就會比較麻煩 我們的目的是為了計數(shù) 而不是保存用戶id
0.81%錯誤率 統(tǒng)計UV任務 可以忽略不記的
如果允許容錯 那么一定可以使用 HyperLogLogs
如果不允許容錯 就使用set或者自己的數(shù)據(jù)類型即可
Bitmaps
位存儲
統(tǒng)計用戶信息(活躍 不活躍)
登錄 未登錄 打卡(365打卡)
兩個狀態(tài) 都可以使用Bitmaps
Bitmaps 位圖 數(shù)據(jù)結(jié)構(gòu) 都是操作二進制位 來進行記錄
就只有 0 和1 兩個狀態(tài)
測試
使用bitmap來記錄周一到周日的打卡
周一 1 周二 0 周三 1 周四 0 周五 1 周六 1 周日 0
查看某一天是否打卡
127.0.0.1:6379> getbit sign 5 (integer) 1 127.0.0.1:6379> getbit sign 3 (integer) 0 127.0.0.1:6379>統(tǒng)計操作 統(tǒng)計打卡的天數(shù)
127.0.0.1:6379> bitcount sign (integer) 4 127.0.0.1:6379>參考文獻來源
http://blog.codinglabs.org
總結(jié)
以上是生活随笔為你收集整理的Redis三种特殊数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NoClassDefFoundError
- 下一篇: Redis事务与监控