吃透Redis系列:琳瑯滿目的數(shù)據(jù)類型(下篇,文末彩蛋)
歡迎關(guān)注微信公眾號: 互聯(lián)網(wǎng)全棧架構(gòu)
上一篇文章我們介紹了Redis的五種基本數(shù)據(jù)類型,詳細(xì)內(nèi)容請參見:吃透Redis系列:琳瑯滿目的數(shù)據(jù)類型(上篇)。除了這幾種基本的數(shù)據(jù)類型外,Redis還提供了五種擴(kuò)展數(shù)據(jù)類型,從使用頻率上來講,它可能不如基本數(shù)據(jù)類型那么高,但對于某些特定應(yīng)用場景,它們能很好地滿足,所以也有必要進(jìn)行學(xué)習(xí)和了解,以便有備無患。 在文章的最后,我們用一張圖來總結(jié)這十種數(shù)據(jù)類型的含義(畢竟,一圖勝千言,更方便記?。?。為了方便閱讀,還是把這張數(shù)據(jù)類型的思維導(dǎo)圖放出來:
1
Stream
Stream是流的意思,它類似于一個(gè)日志追加(append-only)的數(shù)據(jù)結(jié)構(gòu),在實(shí)際應(yīng)用中,它主要用于實(shí)現(xiàn)消息隊(duì)列的功能,也可以用于記錄和處理各種事件,或者作為一個(gè)通知系統(tǒng),把消息推送給用戶或者其他系統(tǒng)。 在Stream中,每條數(shù)據(jù)都被賦予唯一的一個(gè)序列號,可以使用這個(gè)序列號來獲取關(guān)聯(lián)的數(shù)據(jù),或者處理Stream中后面的數(shù)據(jù),這個(gè)序列號是隨著時(shí)間順序遞增的。
Stream的一些常用操作(更詳細(xì)的說明請參考官方網(wǎng)站):
#用于向Stream中添加消息
XADD key <* | id > field value [field value ...]
#從Stream中讀取消息
XREAD [COUNT count] STREAMS key [key ...] id [id ...]
#獲取指定范圍內(nèi)的消息
XRANGE key start end [COUNT count]
#返回消息的數(shù)量
XLEN key
示例:
127.0.0.1:6379> XADD mystream * name Tom age 23 height 178
"1709386483610-0"
127.0.0.1:6379> XREAD COUNT 1 STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) "1709386483610-0"
2) 1) "name"
2) "Tom"
3) "age"
4) "23"
5) "height"
6) "178"
127.0.0.1:6379> XRANGE mystream - +
1) 1) "1709386483610-0"
2) 1) "name"
2) "Tom"
3) "age"
4) "23"
5) "height"
6) "178"
127.0.0.1:6379> XLEN mystream
(integer) 1
2
Geospatial
翻譯過來是地理空間的意思,它可以用來保存坐標(biāo)并進(jìn)行搜索。對于地理位置和距離計(jì)算的需求,這種數(shù)據(jù)結(jié)構(gòu)非常適合。地理位置使用經(jīng)度和緯度來表示。 向key中添加地理位置的命令如下(其它命令參見官網(wǎng)):
#將一個(gè)或者多個(gè)位置添加到key中。其中l(wèi)ongtitude是經(jīng)度,latitude是緯度,member是地理位置的名稱
GEOADD key longitude latitude member [longitude latitude member ...]
3
Bitmap
Bitmap就是位圖,它不是一個(gè)真正意義上的數(shù)據(jù)結(jié)構(gòu),而是對于字符串類型的一些位操作,通過最小的單位bit來進(jìn)行0和1的設(shè)置。使用它進(jìn)行存儲非常節(jié)省空間且運(yùn)行效率高,比較適合活躍用戶統(tǒng)計(jì)、登錄天數(shù)計(jì)算、過濾器等應(yīng)用場景。
Bitmap的一些常用操作:
#設(shè)置或者清除某一位上的值
SETBIT key offset value
#獲取某一位上的值
GETBIT key offset
#統(tǒng)計(jì)1的數(shù)量
BITCOUNT key [start end [BYTE | BIT]]
示例:
# 比如統(tǒng)計(jì)登錄天數(shù),第一天在線,第三天在線,最后統(tǒng)計(jì)出來一共兩天在線
127.0.0.1:6379> SETBIT user-login 1 1
(integer) 0
127.0.0.1:6379> SETBIT user-login 3 1
(integer) 0
127.0.0.1:6379> GETBIT user-login 3
(integer) 1
127.0.0.1:6379> BITCOUNT user-login
(integer) 2
4
Bitfield
Bitfield(位域),它把字符串當(dāng)成位數(shù)組進(jìn)行處理,它 可以操作任意位長度的整數(shù),從無符號的1位整數(shù)到有符號的63位整數(shù)。 這些值是使用二進(jìn)制編碼的Redis字符串來存儲的。 bitfield結(jié)構(gòu)支持原子的讀、寫和增加操作,使它們成為管理計(jì)數(shù)器和類似數(shù)值的好選擇。
5
HyperLogLog
HyperLogLog,它是用來做基數(shù)統(tǒng)計(jì)的,所謂基數(shù),是指集合中不同元素的個(gè)數(shù),而基數(shù)統(tǒng)計(jì)是指在允許誤差的情況下估算出一組數(shù)據(jù)的基數(shù)。它經(jīng)常用于統(tǒng)計(jì)網(wǎng)站的ip訪問量、頁面的uv數(shù)等場景。
HyperLogLog的一些常用操作:
#將任意數(shù)量的元素添加到HyperLogLog
PFADD key [element [element ...]]
#返回一個(gè)或者多個(gè)key的近似基數(shù)
PFCOUNT key [key ...]
#將多個(gè)HyperLogLog合并為一個(gè)HyperLogLog
PFMERGE destkey [sourcekey [sourcekey ...]]
示例:
127.0.0.1:6379> PFADD web-view "Tom" "John" "Tony"
(integer) 1
127.0.0.1:6379> PFCOUNT web-view
(integer) 3
127.0.0.1:6379> PFADD web-view2 "John"
(integer) 1
127.0.0.1:6379> PFMERGE web-view web-view2
OK
127.0.0.1:6379> PFCOUNT web-view
(integer) 3
6
總結(jié)
本文介紹了五種擴(kuò)展數(shù)據(jù)類型,包括流、地理空間、位圖、位域、基數(shù)統(tǒng)計(jì)等,它們對于一些互聯(lián)網(wǎng)相關(guān)的業(yè)務(wù)需求非常適合,與傳統(tǒng)的實(shí)現(xiàn)方案相比(比如采用關(guān)系型數(shù)據(jù)庫),這些數(shù)據(jù)結(jié)構(gòu)可能更有針對性、效率更高,使用起來也更為簡便 。
為了方便記憶和理解,我們用一張示例圖來總結(jié)這十種數(shù)據(jù)類型的含義:

創(chuàng)作不易,煩請點(diǎn)個(gè)在看、點(diǎn)個(gè)贊,非常感謝!
推薦閱讀:
