在上一篇文章中,講到了redis五大基本資料型別的使用場景,除了string,hash,list,set,zset之外,redis還提供了一些其他的資料結構(當然,嚴格意義上也不算資料結構),一起來看看redis還可以做哪些事?
一 Bitmaps
在計算機中,使用二進位制做為資訊的基礎單元,也就是輸入的任何資訊,最終在計算機底層都會轉會為一串二進位制的數字。在redis中,提供了Bitmaps來進行位操作。我們可以把Bitmaps想象成一個以位為單位的陣列,陣列的下標叫做偏移量。使用Bitmaps的優勢就是佔用空間更少。
假如我們想記錄員工今天是否登入過公司官網,我們可以日期做為key,員工id做為偏移量(這裡員工id在資料庫中是自增的),如果id是從1000開始,為了節省空間,一般會將員工id減去這個初始值來做為偏移量,偏移量一般從0
開始。是否訪問官網用0
和1
來表示。
這樣的話,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還支援釋出訂閱模式,即一個訊息由所有訂閱者消費,比如廣播、公告等等,釋出一條公告後,所有關注了我的使用者都可以收到這條公告。
- 釋出訊息
釋出到通道channel:message一條訊息,訊息內容為hi
pulish channel:message hi
- 訂閱通道
訂閱者可以訂閱一個或多個通道,比如訂閱channel:message
subscribe channel:message
- 取消訂閱
unsubscribe channel:message
- 檢視活躍通道
pubsub channels
- 檢視訂閱數
檢視通道channel:message訂閱個數
pubsub numsub channel:message
redis的釋出訂閱模式和專業的訊息中介軟體相比,略顯粗糙,但是實現起來非常簡單,學習成本較低。
五 Bloom Filter
布隆過濾器是redis4
版本中新增的一個功能。其實現原理和Bitmaps差不多,也是利用一個位陣列,將你的值經過多個hash函式,得到對應的位陣列的位置,將這些值設定為1。布隆過濾器經常別用來防止快取穿透。
存在的問題,如果說某個元素不存在,則一定不存在,如果說某個元素存在,則可能不存在。這是因為如果有三個元素a
,b
,c
要放入同一個陣列中去,假設a
經過三次hash,得到1,5,7三個位置,那麼就會將這三個位置修改成1
,b
經過三次hash,得到2,4,6三個位置,將這三個位置修改成1
。c
經過三次hash得到2,5,7三個位置,但是經過前兩個元素hash後,這三個位置已經修改成1
了,那麼我們能說c
一定存在嗎?顯然不能!
點關注、不迷路
如果覺得文章不錯,歡迎關注、點贊、收藏,你們的支援是我創作的動力,感謝大家。
如果文章寫的有問題,請不要吝惜文筆,歡迎留言指出,我會及時核查修改。
如果你還想更加深入的瞭解我,可以微信搜尋「Java旅途」進行關注。回覆「1024」即可獲得學習視訊及精美電子書。每天7:30準時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬實力!