Redis三種特殊數(shù)據(jù)類型的具體使用
一、HyperLogLog 基數(shù)統(tǒng)計(jì)
1.1 什么是基數(shù)?
我們直接通過一個(gè)例子就可以明白什么是基數(shù)統(tǒng)計(jì),比如數(shù)據(jù)集 {1, 2, 3, 3, 5, 5,}, 那么這個(gè)數(shù)據(jù)集的基數(shù)集為 {1,2,3,5}, 基數(shù)(不重復(fù)元素)為4。也就是說是不重復(fù)元素的個(gè)數(shù)。
1.2 使用基數(shù)統(tǒng)計(jì)的好處
每個(gè) HyperLogLog 鍵只需要花費(fèi) 12 KB 內(nèi)存,就可以計(jì)算接近 2^64 個(gè)不同元素的基數(shù)。這和計(jì)算基數(shù)時(shí),元素越多耗費(fèi)內(nèi)存就越多的集合形成鮮明對(duì)比。如果要從內(nèi)存角度來比較的話Hyperloglog是首選。
1.3 應(yīng)用場(chǎng)景
網(wǎng)頁(yè)的uv(一個(gè)人訪問一個(gè)網(wǎng)站多次,但是還是算做一個(gè)人)
- ?? 傳統(tǒng)的方式:set(因?yàn)閟et不允許重復(fù),如果重復(fù)就覆蓋)保存用戶的id,然后就可以統(tǒng)計(jì),set中元素?cái)?shù)量作為標(biāo)準(zhǔn)判斷,這個(gè)方式如果保存大量的用戶id,就會(huì)比較麻煩并且在大型網(wǎng)站中會(huì)占用大量的內(nèi)存。我們的目的是為了計(jì)數(shù),而不是保存用戶id。
- ?? 使用HyperLogLog:一個(gè)HyperLogLog 鍵只需要12KB,能夠計(jì)算的數(shù)量卻非常巨大,占用的內(nèi)存空間大大減少。
1.4 注意事項(xiàng)
如果允許容錯(cuò)(0.81% 錯(cuò)誤率,計(jì)數(shù)的話可以忽略不計(jì)),那么一定可以使用Hyperloglog!如果不允許容錯(cuò),就使用set或者自己的數(shù)據(jù)類型即可!
1.5 基本命令
序號(hào) | 命令及描述 |
---|---|
1 | PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。? |
2 | PFCOUNT key [key ...] 返回給定 HyperLogLog 的基數(shù)估算值。? |
3 | PFMERGE destkey sourcekey [sourcekey ...] 將多個(gè) HyperLogLog 合并為一個(gè) HyperLogLog? |
1.6 使用
127.0.0.1:6379> pfadd mykey1 a b c d e f #給第一組添加數(shù)據(jù) (integer) 1 127.0.0.1:6379> pfcount mykey1 #統(tǒng)計(jì)mykey1的基數(shù)數(shù)量 (integer) 6 127.0.0.1:6379> pfadd mykey2 e e f j #給第二組添加數(shù)據(jù) (integer) 1 127.0.0.1:6379> pfcount mykey2 #統(tǒng)計(jì)mykey2的基數(shù)數(shù)量 (integer) 3 127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2 # 合并兩組 mykey1 mykey2 => mykey3 并集 OK 127.0.0.1:6379> pfcount mykey3 #統(tǒng)計(jì)mykey3的基數(shù)數(shù)量 (integer) 7
二、Geospatial 地理位置
2.1 介紹
Redis3.2 版本開始推出的Geospatial,可以推算地理位置的信息,兩地之間的距離,方圓幾里的人。
2.2 使用場(chǎng)景
- ?? 朋友定位
- ?? 查看附近的人
- ?? 打車距離計(jì)算
2.3 基本命令
序號(hào) | 命令及描述 |
---|---|
1 | GEOADD key 經(jīng)度 緯度 地點(diǎn)名稱 將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的key中 |
2 | GEOPOS key 地點(diǎn)名稱 從key里返回所有給定位置元素的位置(經(jīng)度和緯度)。 |
3 | GEODIST key 地點(diǎn)1 地點(diǎn)2 單位 返回兩個(gè)給定位置之間的距離,如果兩個(gè)位置之間的其中一個(gè)不存在, 那么命令返回空值。 |
4 | GEORADIUS key 經(jīng)度 緯度 范圍數(shù)值 單位 以給定的經(jīng)緯度為中心, 找出某一半徑內(nèi)的元素 |
5 | GEORADIUSBYMEMBER key 地點(diǎn) 距離數(shù)值 單位 找出位于指定范圍內(nèi)的元素,中心點(diǎn)是由給定的位置元素決定 |
6 | GEOHASH key 地點(diǎn)1 地點(diǎn)2 將返回11個(gè)字符的Geohash字符串,如果兩個(gè)字符串越接近,那么則距離越近。 |
7 | zrange key start stop 獲得指定key中坐標(biāo)信息 |
8 | zrem key 地點(diǎn) 刪除指定key下指定目標(biāo)的數(shù)據(jù) |
查詢地點(diǎn)經(jīng)緯度:
城市經(jīng)緯度查詢-國(guó)內(nèi)城市經(jīng)度緯度在線查詢工具
2.4 詳細(xì)講解
2.4.1 GEOADD
作用:添加地理位置
規(guī)則:兩級(jí)無(wú)法直接添加,我們一般會(huì)下載城市數(shù)據(jù),直接通過java程序一次性導(dǎo)入!
語(yǔ)法:GEOADD key 經(jīng)度 緯度 地點(diǎn)名稱
?? 注意事項(xiàng)
有效的經(jīng)度從-180度到180度。
有效的緯度從-85.05112878度到85.05112878度。
當(dāng)坐標(biāo)位置超出上述指定范圍時(shí),該命令將會(huì)返回一個(gè)錯(cuò)誤。
?? 使用
#添加單個(gè)信息 127.0.0.1:6379> geoadd address 116.708463 23.37102 shantou (integer) 1 #添加多個(gè)信息 127.0.0.1:6379> geoadd address 116.405285 39.904989 beijin 121.472644 31.231706 shanghai (integer) 2
2.4.2 GEOPOS
作用:獲得指定地點(diǎn)的位置信息(經(jīng)緯度)
語(yǔ)法:GEOPOS key 地點(diǎn)名稱
?? 使用
127.0.0.1:6379> geopos address beijin #獲得北京的地理位置 1) 1) "116.40528291463851929" #經(jīng)度 2) "39.9049884229125027" #緯度
2.4.3 GEODIST
作用:返回兩個(gè)給定位置之間的距離,如果兩個(gè)位置之間的其中一個(gè)不存在, 那么命令返回空值。
語(yǔ)法:GEODIST key 地點(diǎn)1 地點(diǎn)2 單位
?? 單位參數(shù):
- m 表示單位為米。
- km 表示單位為千米。
- mi 表示單位為英里。
- ft 表示單位為英尺。
如果用戶沒有顯式地指定單位參數(shù), 那么 GEODIST 默認(rèn)使用米作為單位。
?? 使用:
127.0.0.1:6379> geodist address beijin shanghai km #查詢北京與上海之間的距離 "1067.5980"
2.4.4 GEORADIUS
作用:以給定的經(jīng)緯度為中心, 找出某一半徑內(nèi)的元素。
語(yǔ)法:GEORADIUS key 經(jīng)度 緯度 范圍數(shù)值 單位
?? 使用:
#查找以116,39這個(gè)經(jīng)緯度為中心,尋找方圓1500km的城市 127.0.0.1:6379> georadius address 116 39 1500 km 1) "shanghai" 2) "beijin" ? # 顯示到中間距離的位置 127.0.0.1:6379> georadius address 116 39 1500 km withdist 1) 1) "shanghai" ? ?2) "996.7313" 2) 1) "beijin" ? ?2) "106.5063" ? #顯示他人的定位信息 127.0.0.1:6379> georadius address 116 39 1500 km withcoord 1) 1) "shanghai" ? ?2) 1) "121.47264629602432251" ? ? ? 2) "31.23170490709807012" 2) 1) "beijin" ? ?2) 1) "116.40528291463851929" ? ? ? 2) "39.9049884229125027" ? #篩選出最近的城市以及顯示其距離 127.0.0.1:6379> georadius address 116 39 1500 km withdist withcoord count 1 1) 1) "beijin" ? ?2) "106.5063" ? ?3) 1) "116.40528291463851929" ? ? ? 2) "39.9049884229125027" ? ? #篩選最近兩個(gè)城市以及顯示其距離 127.0.0.1:6379> georadius address 116 39 1500 km withdist withcoord count 2 1) 1) "beijin" ? ?2) "106.5063" ? ?3) 1) "116.40528291463851929" ? ? ? 2) "39.9049884229125027" 2) 1) "shanghai" ? ?2) "996.7313" ? ?3) 1) "121.47264629602432251" ? ? ? 2) "31.23170490709807012"
2.4.5 GEORADIUSBYMEMBER
作用:找出位于指定范圍內(nèi)的元素,中心點(diǎn)是由給定的位置元素決定。
語(yǔ)法:GEORADIUSBYMEMBER key 地點(diǎn) 距離數(shù)值 單位
?? 使用:
#找出距離北京方圓1500km內(nèi)的城市 127.0.0.1:6379> georadiusbymember address beijin 1500 km 1) "shanghai" 2) "beijin"
2.4.6 GEOHASH
作用:將返回11個(gè)字符的Geohash字符串,如果兩個(gè)字符串越接近,那么則距離越近。
語(yǔ)法:GEOHASH key 地點(diǎn)1 地點(diǎn)2
?? 使用:
127.0.0.1:6379> geohash address beijin shantou 1) "wx4g0b7xrt0" 2) "ws4uzy8d030"
2.4.7 ZRANGE
作用:獲得指定key中坐標(biāo)信息。
語(yǔ)法:zrange key start stop
?? 使用:
127.0.0.1:6379> zrange address 0 -1 1) "shantou" 2) "shanghai" 3) "beijin"
2.4.8 ZREM
作用:刪除指定key下指定目標(biāo)的數(shù)據(jù)。
語(yǔ)法:zrem key 地點(diǎn)
?? 使用:
127.0.0.1:6379> zrem address shanghai (integer) 1
三、BitMap
?? 介紹
BitMap是通過一個(gè)bit位來表示某個(gè)元素對(duì)應(yīng)的值或者狀態(tài),只有0 和 1 兩個(gè)狀態(tài),其中的key就是對(duì)應(yīng)元素本身。365 天 = 365 bit ,1字節(jié) = 8bit ,也就是說統(tǒng)計(jì)一年的用戶狀態(tài)只需要46 個(gè)字節(jié)左右,所以其能夠節(jié)省很大的空間。
?? 應(yīng)用場(chǎng)景
- (1)用戶簽到
- (2)統(tǒng)計(jì)活躍用戶
- (3)用戶在線狀態(tài)(在線就設(shè)置為1,不在線就設(shè)置為0)
?? 使用
- ?? 需求:記錄 周一到周日的打卡
- 1:表示有打卡
- 0:表示沒有打卡
127.0.0.1:6379> setbit sign 0 1 (integer) 0 127.0.0.1:6379> setbit sign 1 1 (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 6 (integer) 0
?? 統(tǒng)計(jì)本周的打卡記錄
127.0.0.1:6379> bitcount sign (integer) 4
小結(jié)
以上就是【一心同學(xué)】整理的【Redis】中的【三種特殊數(shù)據(jù)類型】,或許我們?cè)谄綍r(shí)很少用到,但如果我們能夠用得到,那么其對(duì)我們的作用是非常大的,可以給我們【節(jié)省巨大的空間】以及【帶來極快的速度】。
到此這篇關(guān)于Redis三種特殊數(shù)據(jù)類型的具體使用的文章就介紹到這了,更多相關(guān)Redis 特殊數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟
這篇文章主要介紹了redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04深入解析Redis中常見的應(yīng)用場(chǎng)景
這篇文章主要給大家介紹了關(guān)于Redis中常見的應(yīng)用場(chǎng)景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09詳解Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表
這篇文章主要介紹了Redis數(shù)據(jù)結(jié)構(gòu)中的跳躍表的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11redis快照模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了redis快照模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08redis實(shí)現(xiàn)分布式的方法總結(jié)
在本篇文章中小編給大家整理了關(guān)于redis分布式怎么做的具體內(nèi)容以及知識(shí)點(diǎn)總結(jié),有興趣的朋友們參考下。2019-06-06