網站首頁 編程語言 正文
一、HyperLogLog 基數統計
1.1 什么是基數?
我們直接通過一個例子就可以明白什么是基數統計,比如數據集 {1, 2, 3, 3, 5, 5,}, 那么這個數據集的基數集為 {1,2,3,5}, 基數(不重復元素)為4。也就是說是不重復元素的個數。
1.2 使用基數統計的好處
每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比。如果要從內存角度來比較的話Hyperloglog是首選。
1.3 應用場景
? ? 網頁的uv(一個人訪問一個網站多次,但是還是算做一個人)
- ? 傳統的方式:set(因為set不允許重復,如果重復就覆蓋)保存用戶的id,然后就可以統計,set中元素數量作為標準判斷,這個方式如果保存大量的用戶id,就會比較麻煩并且在大型網站中會占用大量的內存。我們的目的是為了計數,而不是保存用戶id。
- ? 使用HyperLogLog:一個HyperLogLog 鍵只需要12KB,能夠計算的數量卻非常巨大,占用的內存空間大大減少。
1.4 注意事項?
如果允許容錯(0.81% 錯誤率,計數的話可以忽略不計),那么一定可以使用Hyperloglog!如果不允許容錯,就使用set或者自己的數據類型即可!
1.5 基本命令
序號 | 命令及描述 |
---|---|
1 | PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。? |
2 | PFCOUNT key [key ...] 返回給定 HyperLogLog 的基數估算值。? |
3 | PFMERGE destkey sourcekey [sourcekey ...] 將多個 HyperLogLog 合并為一個 HyperLogLog? |
1.6 使用
127.0.0.1:6379> pfadd mykey1 a b c d e f #給第一組添加數據 (integer) 1 127.0.0.1:6379> pfcount mykey1 #統計mykey1的基數數量 (integer) 6 127.0.0.1:6379> pfadd mykey2 e e f j #給第二組添加數據 (integer) 1 127.0.0.1:6379> pfcount mykey2 #統計mykey2的基數數量 (integer) 3 127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2 # 合并兩組 mykey1 mykey2 => mykey3 并集 OK 127.0.0.1:6379> pfcount mykey3 #統計mykey3的基數數量 (integer) 7
二、Geospatial 地理位置
2.1 介紹
Redis3.2 版本開始推出的Geospatial,可以推算地理位置的信息,兩地之間的距離,方圓幾里的人。
2.2 使用場景
- ? 朋友定位
- ? 查看附近的人
- ? 打車距離計算
2.3 基本命令
序號 | 命令及描述 |
---|---|
1 |
GEOADD key 經度 緯度 地點名稱 將指定的地理空間位置(緯度、經度、名稱)添加到指定的key中 |
2 |
GEOPOS key 地點名稱 從key里返回所有給定位置元素的位置(經度和緯度)。 |
3 |
GEODIST key 地點1 地點2 單位 返回兩個給定位置之間的距離,如果兩個位置之間的其中一個不存在, 那么命令返回空值。 |
4 |
GEORADIUS key 經度 緯度 范圍數值 單位 以給定的經緯度為中心, 找出某一半徑內的元素 |
5 |
GEORADIUSBYMEMBER key 地點 距離數值 單位 找出位于指定范圍內的元素,中心點是由給定的位置元素決定 |
6 |
GEOHASH key 地點1 地點2 將返回11個字符的Geohash字符串,如果兩個字符串越接近,那么則距離越近。 |
7 |
zrange key start stop 獲得指定key中坐標信息 |
8 |
zrem key 地點 刪除指定key下指定目標的數據 |
查詢地點經緯度:
2.4 詳細講解
2.4.1 GEOADD
作用:添加地理位置
規則:兩級無法直接添加,我們一般會下載城市數據,直接通過java程序一次性導入!
語法:GEOADD key 經度 緯度 地點名稱
? 注意事項
有效的經度從-180度到180度。
有效的緯度從-85.05112878度到85.05112878度。
當坐標位置超出上述指定范圍時,該命令將會返回一個錯誤。
? 使用
#添加單個信息 127.0.0.1:6379> geoadd address 116.708463 23.37102 shantou (integer) 1 #添加多個信息 127.0.0.1:6379> geoadd address 116.405285 39.904989 beijin 121.472644 31.231706 shanghai (integer) 2
2.4.2 GEOPOS
作用:獲得指定地點的位置信息(經緯度)
語法:GEOPOS key 地點名稱
? 使用
127.0.0.1:6379> geopos address beijin #獲得北京的地理位置 1) 1) "116.40528291463851929" #經度 2) "39.9049884229125027" #緯度
2.4.3 GEODIST
作用:返回兩個給定位置之間的距離,如果兩個位置之間的其中一個不存在, 那么命令返回空值。
語法:GEODIST key 地點1 地點2 單位
? 單位參數:
- m 表示單位為米。
- km 表示單位為千米。
- mi 表示單位為英里。
- ft 表示單位為英尺。
如果用戶沒有顯式地指定單位參數, 那么 GEODIST 默認使用米作為單位。
? 使用:
127.0.0.1:6379> geodist address beijin shanghai km #查詢北京與上海之間的距離 "1067.5980"
2.4.4 GEORADIUS
作用:以給定的經緯度為中心, 找出某一半徑內的元素。
語法:GEORADIUS key 經度 緯度 ?范圍數值 ?單位
? 使用:
#查找以116,39這個經緯度為中心,尋找方圓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" ? ? #篩選最近兩個城市以及顯示其距離 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
作用:找出位于指定范圍內的元素,中心點是由給定的位置元素決定。
語法:GEORADIUSBYMEMBER ?key 地點 ?距離數值 ?單位
? 使用:
#找出距離北京方圓1500km內的城市 127.0.0.1:6379> georadiusbymember address beijin 1500 km 1) "shanghai" 2) "beijin"
2.4.6 GEOHASH
作用:將返回11個字符的Geohash字符串,如果兩個字符串越接近,那么則距離越近。
語法:GEOHASH ?key 地點1 ?地點2
? 使用:
127.0.0.1:6379> geohash address beijin shantou 1) "wx4g0b7xrt0" 2) "ws4uzy8d030"
2.4.7 ZRANGE
作用:獲得指定key中坐標信息。
語法:zrange ?key ?start stop
? 使用:
127.0.0.1:6379> zrange address 0 -1 1) "shantou" 2) "shanghai" 3) "beijin"
2.4.8 ZREM
作用:刪除指定key下指定目標的數據。
語法:zrem ?key 地點
? 使用:
127.0.0.1:6379> zrem address shanghai (integer) 1
三、BitMap
? 介紹
BitMap是通過一個bit位來表示某個元素對應的值或者狀態,只有0 和 1 兩個狀態,其中的key就是對應元素本身。365 天 = 365 bit ,1字節 = 8bit ,也就是說統計一年的用戶狀態只需要46 個字節左右,所以其能夠節省很大的空間。
? 應用場景
- (1)用戶簽到
- (2)統計活躍用戶
- (3)用戶在線狀態(在線就設置為1,不在線就設置為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
? 統計本周的打卡記錄
127.0.0.1:6379> bitcount sign (integer) 4
小結
以上就是【一心同學】整理的【Redis】中的【三種特殊數據類型】,或許我們在平時很少用到,但如果我們能夠用得到,那么其對我們的作用是非常大的,可以給我們【節省巨大的空間】以及【帶來極快的速度】。
原文鏈接:https://blog.csdn.net/Huang_ZX_259/article/details/122776830
相關推薦
- 2022-08-28 Oracle觸發器和程序包的基本介紹_oracle
- 2022-09-24 pandas刪除某行或某列數據的實現示例_python
- 2022-09-04 c++?求數組最大最小值函數的實現_C 語言
- 2022-02-18 取一個數組中想要的值,放到一個新的對象里
- 2021-12-06 Linux學習之mkdir命令詳解_Linux
- 2022-05-11 SpringBoot jackson返回值中含有null的解決辦法
- 2022-08-30 Kafka中產生數據積壓的原因以及解決方案
- 2022-12-03 Nginx部署SSL證書的過程_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支