Redis還可以做哪些事?


上一篇文章中,講到了redis五大基本數據類型的使用場景,除了string,hash,list,set,zset之外,redis還提供了一些其他的數據結構(當然,嚴格意義上也不算數據結構),一起來看看redis還可以做哪些事?

一 Bitmaps

在計算機中,使用二進制做為信息的基礎單元,也就是輸入的任何信息,最終在計算機底層都會轉會為一串二進制的數字。在redis中,提供了Bitmaps來進行位操作。我們可以把Bitmaps想象成一個以位為單位的數組,數組的下標叫做偏移量。使用Bitmaps的優勢就是占用空間更少。

假如我們想記錄員工今天是否登錄過公司官網,我們可以日期做為key,員工id做為偏移量(這里員工id在數據庫中是自增的),如果id是從1000開始,為了節省空間,一般會將員工id減去這個初始值來做為偏移量,偏移量一般從0開始。是否訪問官網用01來表示。

這樣的話,id為3的員工訪問了官網,就將他的值寫成1

# id為3的員工訪問了官網
setbit user:2020-11-04 3 1
# id為18的員工訪問了官網
setbit user:2020-11-04 18 1

查看某個員工是否訪問過官網

getbit user:2020-11-04 1

查詢指定范圍(字節)內值為1的個數,比如我想查看id從1-30之間有多少員工訪問了官網

bitcount user:2020-11-04 0 3

二 HyperLogLog

HyperLogLog可以利用極小的內存空間完成數據統計,無法獲取單條數據,只能做為統計使用,會有一定的誤差率。

假如我想統計訪問官網的IP地址

添加官網今天訪問的ip列表

# 2020-11-04訪問的ip
pfadd 2020-11-04:ip "ip1" "ip2" "ip3" 
# 2020-11-05訪問的ip
pfadd 2020-11-05:ip "ip3" "ip4" "ip5" 

計算今天官網訪問的ip數

pfcount 2020-11-04:ip

返回結果為3

查看2020-11-04和2020-11-05這兩天總共有多少個獨立ip訪問過網站

先將兩天的數據做並集,並復制給某個值

pfmerge 2020-11:ip 2020-11-04:ip 2020-11-05:ip

然后使用pfcount命令查詢,獲得的值為5

pfcount 2020-11:ip

三 GEO

Redis3.2版本中增加了GEO(地理位置定位)功能,可以使用此功能來獲取附近的人。

添加命令如下,可批量添加

geoadd city longitud latitude member

我們添加幾個城市的位置信息,來獲取某個城市附近的城市

geoadd city 116.28 39.55 beijing 117.12 39.08 tianjin

獲取北京的經緯度命令如下

geopos city beijing

查看beijing和tianjin兩座城市的距離

geodist city beijing tianjin km

最后面的km表示距離單位是公里,支持的單位有以下幾個:

  • m,米
  • km,千米
  • mi,英里
  • ft,尺

獲取附近的位置有兩個命令,georadius根據經緯度獲取,georadiusbymember根據成員獲取

georadius key longitude laitude [單位]
georadiusbymember key member [單位]

后面還可以跟非必須參數,參數分別如下

  • withcoord:返回結果中包含經緯度
  • withdist:返回結果中包含距離中心位置的距離
  • withhash:返回結果中包含geohash(就是將經緯度轉換為hash值)
  • COUNT count:指定返回結果的數量
  • asc|desc:返回結果按距離中心位置的距離排序
  • store key:將返回結果的地理位置信息保存到指定key中
  • storedist key:將返回結果距離中心位置的距離保存到指定key中

四 發布訂閱模式消息

上一篇文章中講到了可以使用list和zset來實現消息隊列,但是上面實現的消息隊列是點對點模式,也就是一條消息只能由一個消費者來消費。除此之外,redis還支持發布訂閱模式,即一個消息由所有訂閱者消費,比如廣播、公告等等,發布一條公告后,所有關注了我的用戶都可以收到這條公告。

  1. 發布消息

發布到信道channel:message一條消息,消息內容為hi

pulish channel:message hi
  1. 訂閱信道

訂閱者可以訂閱一個或多個信道,比如訂閱channel:message

subscribe channel:message
  1. 取消訂閱
unsubscribe channel:message
  1. 查看活躍信道
pubsub channels
  1. 查看訂閱數

查看信道channel:message訂閱個數

pubsub numsub channel:message

redis的發布訂閱模式和專業的消息中間件相比,略顯粗糙,但是實現起來非常簡單,學習成本較低。

五 Bloom Filter

布隆過濾器是redis4版本中新增的一個功能。其實現原理和Bitmaps差不多,也是利用一個位數組,將你的值經過多個hash函數,得到對應的位數組的位置,將這些值設置為1。布隆過濾器經常別用來防止緩存穿透。

存在的問題,如果說某個元素不存在,則一定不存在,如果說某個元素存在,則可能不存在。這是因為如果有三個元素abc要放入同一個數組中去,假設a經過三次hash,得到1,5,7三個位置,那么就會將這三個位置修改成1b經過三次hash,得到2,4,6三個位置,將這三個位置修改成1c經過三次hash得到2,5,7三個位置,但是經過前兩個元素hash后,這三個位置已經修改成1了,那么我們能說c一定存在嗎?顯然不能!


點關注、不迷路

如果覺得文章不錯,歡迎關注點贊收藏,你們的支持是我創作的動力,感謝大家。

如果文章寫的有問題,請不要吝惜文筆,歡迎留言指出,我會及時核查修改。

如果你還想更加深入的了解我,可以微信搜索「Java旅途」進行關注。回復「1024」即可獲得學習視頻及精美電子書。每天7:30准時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬實力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM