首頁  >  文章  >  資料庫  >  深入了解Redis中的特殊資料類型:基數統計、點陣圖、地理位置

深入了解Redis中的特殊資料類型:基數統計、點陣圖、地理位置

青灯夜游
青灯夜游轉載
2021-12-22 09:59:402449瀏覽

這篇文章帶大家了解Redis中的三種特殊資料類型(基數統計、點陣圖、地理位置),希望對大家有幫助!

深入了解Redis中的特殊資料類型:基數統計、點陣圖、地理位置

Redis除了5種基礎資料類型,還有三種特殊的資料類型,分別是HyperLogLogs(基數統計), Bitmaps (點陣圖) 和geospatial (地理位置)。 【相關推薦:Redis影片教學

HyperLogLogs(基數統計)

Redis 2.8.9 版本更新了 Hyperloglog 資料結構!

  • 什麼是基數?

舉個例子,A = {1, 2, 3, 4, 5}, B = {3, 5, 6, 7, 9};則基數(不重複的元素)= 1, 2, 4, 6, 7, 9;(允許容錯,即可以接受一定誤差)

  • HyperLogLogs基數統計用來解決什麼問題

這個結構可以非常省記憶體的去統計各種計數,例如註冊IP 數、每日存取IP 數、頁面即時UV、線上用戶數,共同好友數等。

  • 它的優勢體現在哪

一個大型的網站,每天 IP 例如有 100 萬,粗算一個 IP 消耗 15 位元組,那麼 100 萬個 IP 就是 15M。而HyperLogLog 在Redis 中每個鍵佔用的內容都是12K,理論儲存近似接近2^64 個值,不管儲存的內容是什麼,它一個基於基數估算的演算法,只能比較準確的估算出基數,可以使用少量固定的記憶體去儲存並識別集合中的唯一元素。而這個估算的基數不一定準確,是一個帶有 0.81% 標準誤差的近似值(對於可以接受一定容錯的業務場景,例如IP數統計,UV等,是可以忽略的)。

  • 相關指令使用

#
127.0.0.1:6379> pfadd key1 a b c d e f g h i	# 创建第一组元素
(integer) 1
127.0.0.1:6379> pfcount key1					# 统计元素的基数数量
(integer) 9
127.0.0.1:6379> pfadd key2 c j k l m e g a		# 创建第二组元素
(integer) 1
127.0.0.1:6379> pfcount key2
(integer) 8
127.0.0.1:6379> pfmerge key3 key1 key2			# 合并两组:key1 key2 -> key3 并集
OK
127.0.0.1:6379> pfcount key3
(integer) 13

Bitmap(位元儲存)

Bitmap 即點陣圖資料結構,都是操作二進位位元來進行記錄,只有0 和1 兩個狀態。

  • 用來解決什麼問題

例如:統計用戶訊息,活躍,不活躍!登入,未登入!打卡,不打卡! 兩個狀態的,都可以使用 Bitmaps

如果儲存一年的打卡狀態需要多少記憶體呢? 365 天 = 365 bit 1位元組 = 8bit 46 個位元組左右!

  • 相關指令使用

#使用bitmap 來記錄 週一到週日的打卡!週一:1 週二:0 週三:0 週四:1 ......

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 0
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0

查看某一天是否有打卡!

127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0

統計操作,統計 打卡的天數!

127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤!
(integer) 3

geospatial (地理位置)

Redis 的Geo 在Redis 3.2 版本就推出了! 這個功能可以推算地理位置的資訊:兩地之間的距離,,方圓幾裡的人。

geoadd

#新增地理位置

127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang
(integer) 3
127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3

規則

兩個等級無法直接添加,我們通常會下載城市資料(這個網址可以查詢GEO:http://www.jsons.cn/lngcode)!

  • 有效的經度從-180度到180度。
  • 有效的緯度從-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
(error) ERR invalid longitude,latitude pair 39.900000,116.400000

geopos

#取得指定的成員的經度和緯度

127.0.0.1:6379> geopos china:city taiyuan manjing
1) 1) "112.54999905824661255"
   1) "37.86000073876942196"
2) 1) "118.75999957323074341"
   1) "32.03999960287850968"

獲得目前定位, 一定是座標值!

geodist

#如果不存在, 回傳空

單位如下

  • m
  • km
  • mi 英哩
  • ft 英尺
  • ##
    127.0.0.1:6379> geodist china:city taiyuan shenyang m
    "1026439.1070"
    127.0.0.1:6379> geodist china:city taiyuan shenyang km
    "1026.4391"

georadius

附近的人==> 取得所有附近的人的地址, 定位, 透過半徑來查詢

獲得指定數量的人

127.0.0.1:6379> georadius china:city 110 30 1000 km			以 100,30 这个坐标为中心, 寻找半径为1000km的城市
1) "xian"
2) "hangzhou"
3) "manjing"
4) "taiyuan"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2
1) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
2) 1) "manjing"
   2) "864.9816"
   3) 1) "118.75999957323074341"
      2) "32.03999960287850968"

參數key 經度緯度半徑單位[顯示結果的經度和緯度] [顯示結果的距離] [顯示的結果的數量]

georadiusbymember

顯示與指定成員一定半徑範圍內的其他成員

127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km
1) "manjing"
2) "taiyuan"
3) "xian"
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2
1) 1) "taiyuan"
   2) "0.0000"
   3) 1) "112.54999905824661255"
      2) "37.86000073876942196"
2) 1) "xian"
   2) "514.2264"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
參數與georadius 一樣

#geohash(較少使用)

此指令傳回11個字元的hash字串

127.0.0.1:6379> geohash china:city taiyuan shenyang
1) "ww8p3hhqmp0"
2) "wxrvb9qyxk0"
將二維的經緯度轉換為一維的字串, 如果兩個字串越接近, 則距離越近

底層#

geo底层的实现原理实际上就是Zset, 我们可以通过Zset命令来操作geo

127.0.0.1:6379> type china:city
zset

查看全部元素 删除指定的元素

127.0.0.1:6379> zrange china:city 0 -1 withscores
 1) "xian"
 2) "4040115445396757"
 3) "hangzhou"
 4) "4054133997236782"
 5) "manjing"
 6) "4066006694128997"
 7) "taiyuan"
 8) "4068216047500484"
 9) "shenyang"
1)  "4072519231994779"
2)  "shengzhen"
3)  "4154606886655324"
127.0.0.1:6379> zrem china:city manjing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "taiyuan"
4) "shenyang"
5) "shengzhen"

更多编程相关知识,请访问:编程视频!!

以上是深入了解Redis中的特殊資料類型:基數統計、點陣圖、地理位置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除