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