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

本篇文章帶大家了解一下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視頻教程!!

以上就是深入了解Redis中的特殊數據類型:基數統計、位圖、

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享