Redis三種特殊數據類型的具體使用

一、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】中的【三種特殊數據類型】,或許我們在平時很少用到,但如果我們能夠用得到,那麼其對我們的作用是非常大的,可以給我們【節省巨大的空間】以及【帶來極快的速度】。

到此這篇關於Redis三種特殊數據類型的具體使用的文章就介紹到這瞭,更多相關Redis 特殊數據類型內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: