0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis 五大數(shù)據(jù)類(lèi)型使用場(chǎng)景有哪些

數(shù)據(jù)分析與開(kāi)發(fā) ? 來(lái)源:數(shù)據(jù)分析與開(kāi)發(fā) ? 作者:周明堯 ? 2020-11-05 17:35 ? 次閱讀

Redis是一種基于鍵值對(duì)的NoSQL數(shù)據(jù)庫(kù),它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五種基本數(shù)據(jù)結(jié)構(gòu)構(gòu)成,除此之外還支持一些其他的數(shù)據(jù)結(jié)構(gòu)和算法。key都是由字符串構(gòu)成的,那么這五種數(shù)據(jù)結(jié)構(gòu)的使用場(chǎng)景有哪些?一起來(lái)看看!

一 字符串

字符串類(lèi)型是Redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),字符串類(lèi)型可以是JSON、XML甚至是二進(jìn)制的圖片等數(shù)據(jù),但是最大值不能超過(guò)512MB。

1.1 內(nèi)部編碼

Redis會(huì)根據(jù)當(dāng)前值的類(lèi)型和長(zhǎng)度決定使用哪種內(nèi)部編碼來(lái)實(shí)現(xiàn)。

字符串類(lèi)型的內(nèi)部編碼有3種:

int:8個(gè)字節(jié)的長(zhǎng)整型。

embstr:小于等于39個(gè)字節(jié)的字符串。

raw:大于39個(gè)字節(jié)的字符串。

1.2 使用場(chǎng)景

1.2.1 緩存

在web服務(wù)中,使用MySQL作為數(shù)據(jù)庫(kù),Redis作為緩存。由于Redis具有支撐高并發(fā)的特性,通常能起到加速讀寫(xiě)和降低后端壓力的作用。web端的大多數(shù)請(qǐng)求都是從Redis中獲取的數(shù)據(jù),如果Redis中沒(méi)有需要的數(shù)據(jù),則會(huì)從MySQL中去獲取,并將獲取到的數(shù)據(jù)寫(xiě)入redis。

1.2.2 計(jì)數(shù)

Redis中有一個(gè)字符串相關(guān)的命令incr key,incr命令對(duì)值做自增操作,返回結(jié)果分為以下三種情況:

值不是整數(shù),返回錯(cuò)誤

值是整數(shù),返回自增后的結(jié)果

key不存在,默認(rèn)鍵為0,返回1

比如文章的閱讀量,視頻的播放量等等都會(huì)使用redis來(lái)計(jì)數(shù),每播放一次,對(duì)應(yīng)的播放量就會(huì)加1,同時(shí)將這些數(shù)據(jù)異步存儲(chǔ)到數(shù)據(jù)庫(kù)中達(dá)到持久化的目的。

1.2.3 共享Session

在分布式系統(tǒng)中,用戶(hù)的每次請(qǐng)求會(huì)訪問(wèn)到不同的服務(wù)器,這就會(huì)導(dǎo)致session不同步的問(wèn)題,假如一個(gè)用來(lái)獲取用戶(hù)信息的請(qǐng)求落在A服務(wù)器上,獲取到用戶(hù)信息后存入session。下一個(gè)請(qǐng)求落在B服務(wù)器上,想要從session中獲取用戶(hù)信息就不能正常獲取了,因?yàn)橛脩?hù)信息的session在服務(wù)器A上,為了解決這個(gè)問(wèn)題,使用redis集中管理這些session,將session存入redis,使用的時(shí)候直接從redis中獲取就可以了。

1.2.4 限速

為了安全考慮,有些網(wǎng)站會(huì)對(duì)IP進(jìn)行限制,限制同一IP在一定時(shí)間內(nèi)訪問(wèn)次數(shù)不能超過(guò)n次。

二 哈希

Redis中,哈希類(lèi)型是指一個(gè)鍵值對(duì)的存儲(chǔ)結(jié)構(gòu)。

2.1 內(nèi)部編碼

哈希類(lèi)型的內(nèi)部編碼有兩種:

ziplist(壓縮列表):當(dāng)哈希類(lèi)型元素個(gè)數(shù)小于hash-max-ziplist-entries配置(默認(rèn)512個(gè))同時(shí)所有值都小于hash-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí)使用。ziplist使用更加緊湊的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)元素的連續(xù)存儲(chǔ),所以比hashtable更加節(jié)省內(nèi)存。

hashtable(哈希表):當(dāng)ziplist不能滿(mǎn)足要求時(shí),會(huì)使用hashtable。

2.2 使用場(chǎng)景

由于hash類(lèi)型存儲(chǔ)的是一個(gè)鍵值對(duì),比如數(shù)據(jù)庫(kù)有以下一個(gè)用戶(hù)表結(jié)構(gòu)

id name age
1 Java旅途 18

將以上信息存入redis,用表明:id作為key,用戶(hù)屬性作為值:

hsetuser:1nameJava旅途age18

使用哈希存儲(chǔ)會(huì)比字符串更加方便直觀

三 列表

列表類(lèi)型用來(lái)存儲(chǔ)多個(gè)有序的字符串,一個(gè)列表最多可以存儲(chǔ)2^32-1個(gè)元素,列表的兩端都可以插入和彈出元素。

3.1 內(nèi)部編碼

列表的內(nèi)部編碼有兩種:

ziplist(壓縮列表):當(dāng)哈希類(lèi)型元素個(gè)數(shù)小于list-max-ziplist-entries配置(默認(rèn)512個(gè))同時(shí)所有值都小于list-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí)使用。ziplist使用更加緊湊的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)元素的連續(xù)存儲(chǔ),所以比hashtable更加節(jié)省內(nèi)存。

linkedlist(鏈表):當(dāng)ziplist不能滿(mǎn)足要求時(shí),會(huì)使用linkedlist。

3.2 使用場(chǎng)景

3.2.1 消息隊(duì)列

列表用來(lái)存儲(chǔ)多個(gè)有序的字符串,既然是有序的,那么就滿(mǎn)足消息隊(duì)列的特點(diǎn)。使用lpush+rpop或者rpush+lpop實(shí)現(xiàn)消息隊(duì)列。除此之外,redis支持阻塞操作,在彈出元素的時(shí)候使用阻塞命令來(lái)實(shí)現(xiàn)阻塞隊(duì)列。

3.2.2 棧

由于列表存儲(chǔ)的是有序字符串,滿(mǎn)足隊(duì)列的特點(diǎn),也就能滿(mǎn)足棧先進(jìn)后出的特點(diǎn),使用lpush+lpop或者rpush+rpop實(shí)現(xiàn)棧。

3.2.3 文章列表

因?yàn)榱斜淼脑夭坏怯行虻?,而且還支持按照索引范圍獲取元素。因此我們可以使用命令lrange key 0 9分頁(yè)獲取文章列表

四 集合

集合類(lèi)型也可以保存多個(gè)字符串元素,與列表不同的是,集合中不允許有重復(fù)元素并且集合中的元素是無(wú)序的。一個(gè)集合最多可以存儲(chǔ)2^32-1個(gè)元素。

4.1 內(nèi)部編碼

集合類(lèi)型的內(nèi)部編碼有兩種:

intset(整數(shù)集合):當(dāng)集合中的元素都是整數(shù)且元素個(gè)數(shù)小于set-max-intset-entries配置(默認(rèn)512個(gè))時(shí),redis會(huì)選用intset來(lái)作為集合的內(nèi)部實(shí)現(xiàn),從而減少內(nèi)存的使用。

hashtable(哈希表):當(dāng)intset不能滿(mǎn)足要求時(shí),會(huì)使用hashtable。

4.2 使用場(chǎng)景

4.2.1 用戶(hù)標(biāo)簽

例如一個(gè)用戶(hù)對(duì)籃球、足球感興趣,另一個(gè)用戶(hù)對(duì)橄欖球、乒乓球感興趣,這些興趣點(diǎn)就是一個(gè)標(biāo)簽。有了這些數(shù)據(jù)就可以得到喜歡同一個(gè)標(biāo)簽的人,以及用戶(hù)的共同感興趣的標(biāo)簽。給用戶(hù)打標(biāo)簽的時(shí)候需要①給用戶(hù)打標(biāo)簽,②給標(biāo)簽加用戶(hù),需要給這兩個(gè)操作增加事務(wù)。

給用戶(hù)打標(biāo)簽

saddusertagstag1tag2

給標(biāo)簽添加用戶(hù)

saddtag1:usersuser:1 saddtag2:usersuser:1

使用交集(sinter)求兩個(gè)user的共同標(biāo)簽

sinterusertagsusertags

4.2.2 抽獎(jiǎng)功能

集合有兩個(gè)命令支持獲取隨機(jī)數(shù),分別是:

隨機(jī)獲取count個(gè)元素,集合元素個(gè)數(shù)不變

srandmember key [count]

隨機(jī)彈出count個(gè)元素,元素從集合彈出,集合元素個(gè)數(shù)改變

spop key [count]

用戶(hù)點(diǎn)擊抽獎(jiǎng)按鈕,參數(shù)抽獎(jiǎng),將用戶(hù)編號(hào)放入集合,然后抽獎(jiǎng),分別抽一等獎(jiǎng)、二等獎(jiǎng),如果已經(jīng)抽中一等獎(jiǎng)的用戶(hù)不能參數(shù)抽二等獎(jiǎng)則使用spop,反之使用srandmember。

五 有序集合

有序集合和集合一樣,不能有重復(fù)元素。但是可以排序,它給每個(gè)元素設(shè)置一個(gè)score作為排序的依據(jù)。最多可以存儲(chǔ)2^32-1個(gè)元素。

5.1 內(nèi)部編碼

有序集合類(lèi)型的內(nèi)部編碼有兩種:

ziplist(壓縮列表):當(dāng)有序集合的元素個(gè)數(shù)小于list-max-ziplist-entries配置(默認(rèn)128個(gè))同時(shí)所有值都小于list-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí)使用。ziplist使用更加緊湊的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)元素的連續(xù)存儲(chǔ),更加節(jié)省內(nèi)存。

skiplist(跳躍表):當(dāng)不滿(mǎn)足ziplist的要求時(shí),會(huì)使用skiplist。

5.2 使用場(chǎng)景

5.2.1 排行榜

用戶(hù)發(fā)布了n篇文章,其他人看到文章后給喜歡的文章點(diǎn)贊,使用score來(lái)記錄點(diǎn)贊數(shù),有序集合會(huì)根據(jù)score排行。流程如下

用戶(hù)發(fā)布一篇文章,初始點(diǎn)贊數(shù)為0,即score為0

zadduser:article0a

有人給文章a點(diǎn)贊,遞增1

zincrbyuser:article1a

查詢(xún)點(diǎn)贊前三篇文章

zrevrangebyscoreuser:article02

查詢(xún)點(diǎn)贊后三篇文章

zrangebyscoreuser:article02

5.2.2 延遲消息隊(duì)列

下單系統(tǒng),下單后需要在15分鐘內(nèi)進(jìn)行支付,如果15分鐘未支付則自動(dòng)取消訂單。將下單后的十五分鐘后時(shí)間作為score,訂單作為value存入redis,消費(fèi)者輪詢(xún)?nèi)ハM(fèi),如果消費(fèi)的大于等于這筆記錄的score,則將這筆記錄移除隊(duì)列,取消訂單。

總結(jié)

在開(kāi)發(fā)中,字符串類(lèi)型是用的最多的數(shù)據(jù)類(lèi)型,導(dǎo)致我們忽視了redis的其他四種數(shù)據(jù)類(lèi)型,在具體場(chǎng)景下選擇具體的數(shù)據(jù)類(lèi)型對(duì)提升redis性能有非常大的幫助。redis雖然支持消息隊(duì)列的實(shí)現(xiàn),但是并不支持ack。所以redis實(shí)現(xiàn)的消息隊(duì)列不能保證消息的可靠性,除非自己實(shí)現(xiàn)消息確認(rèn)機(jī)制,不過(guò)這非常麻煩,所以如果是重要的消息還是推薦使用專(zhuān)門(mén)的消息隊(duì)列去做。

責(zé)任編輯:xj

原文標(biāo)題:Redis 五大數(shù)據(jù)類(lèi)型使用場(chǎng)景

文章出處:【微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7103

    瀏覽量

    89287
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2973

    瀏覽量

    104907
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    376

    瀏覽量

    10898

原文標(biāo)題:Redis 五大數(shù)據(jù)類(lèi)型使用場(chǎng)景

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    系統(tǒng)放大器的技術(shù)原理和應(yīng)用場(chǎng)景

    系統(tǒng)放大器是一種重要的電子設(shè)備,其技術(shù)原理和應(yīng)用場(chǎng)景都具有一定的專(zhuān)業(yè)性和廣泛性。以下是對(duì)系統(tǒng)放大器的技術(shù)原理和應(yīng)用場(chǎng)景的詳細(xì)介紹:一、技術(shù)原理系統(tǒng)放大器的工作原理基于電子器件的非線性特性,通過(guò)控制
    發(fā)表于 11-18 14:46

    SD NAND在大數(shù)據(jù)時(shí)代的應(yīng)用場(chǎng)景

    和相對(duì)較低的成本,可以用于多種場(chǎng)景數(shù)據(jù)采集 :在大數(shù)據(jù)領(lǐng)域,大量的數(shù)據(jù)需要被采集和存儲(chǔ)。SD NAND卡可以用于各種數(shù)據(jù)采集設(shè)備,如物聯(lián)
    的頭像 發(fā)表于 10-29 15:49 ?292次閱讀
    SD NAND在<b class='flag-5'>大數(shù)據(jù)</b>時(shí)代的應(yīng)<b class='flag-5'>用場(chǎng)景</b>

    智能IC卡測(cè)試設(shè)備的技術(shù)原理和應(yīng)用場(chǎng)景

    智能IC卡測(cè)試設(shè)備的技術(shù)原理和應(yīng)用場(chǎng)景,可以從以下幾個(gè)方面進(jìn)行闡述:技術(shù)原理智能IC卡測(cè)試設(shè)備的技術(shù)原理主要圍繞IC卡的通信和數(shù)據(jù)處理機(jī)制展開(kāi)。IC卡(包括智能IC卡)通常內(nèi)置微電子芯片,該芯片
    發(fā)表于 09-26 14:27

    USB協(xié)議分析儀的技術(shù)原理和應(yīng)用場(chǎng)景

    USB協(xié)議分析儀的技術(shù)原理和應(yīng)用場(chǎng)景可以詳細(xì)闡述如下:技術(shù)原理USB協(xié)議分析儀的技術(shù)原理主要基于以下幾個(gè)方面: 總線監(jiān)聽(tīng):USB協(xié)議分析儀通過(guò)監(jiān)聽(tīng)USB總線上的數(shù)據(jù)傳輸過(guò)程,實(shí)時(shí)捕獲USB設(shè)備之間
    發(fā)表于 09-24 14:29

    labview數(shù)據(jù)類(lèi)型的取值范圍是多少

    LabVIEW的數(shù)據(jù)類(lèi)型豐富多樣,涵蓋了整數(shù)、小數(shù)(浮點(diǎn)數(shù))、復(fù)數(shù)等多種類(lèi)型,每種類(lèi)型都有其特定的取值范圍。以下是對(duì)LabVIEW中常見(jiàn)數(shù)據(jù)類(lèi)型取值范圍的說(shuō)明: 整數(shù)
    的頭像 發(fā)表于 09-04 17:33 ?1239次閱讀

    常見(jiàn)的遙感數(shù)據(jù)類(lèi)型哪些

    遙感技術(shù)是一種通過(guò)遙感器在遠(yuǎn)離目標(biāo)的位置獲取目標(biāo)地物的電磁波信息,并進(jìn)行分析的技術(shù)。遙感數(shù)據(jù)類(lèi)型繁多,涵蓋了從可見(jiàn)光到紅外、微波等多個(gè)波段,以及不同的數(shù)據(jù)格式和分辨率。 光學(xué)遙感數(shù)據(jù) : 全色影像
    的頭像 發(fā)表于 09-04 14:30 ?1924次閱讀

    恒訊科技分析:云數(shù)據(jù)庫(kù)rds和redis區(qū)別是什么如何選擇?

    數(shù)據(jù)庫(kù)RDS(Relational Database Service)和Redis是兩種不同類(lèi)型數(shù)據(jù)庫(kù)服務(wù),它們各自的特點(diǎn)和適
    的頭像 發(fā)表于 08-19 15:31 ?432次閱讀

    技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:基本數(shù)據(jù)類(lèi)型和變量

    在C語(yǔ)言中,數(shù)據(jù)類(lèi)型和變量是編程的基礎(chǔ),也是理解更復(fù)雜概念的關(guān)鍵。數(shù)據(jù)類(lèi)型決定了變量的內(nèi)存分配、存儲(chǔ)范圍和操作方式,而變量則是存儲(chǔ)數(shù)據(jù)的容器。本篇文章將從基本數(shù)據(jù)類(lèi)型和變量?jī)蓚€(gè)方面,帶
    的頭像 發(fā)表于 07-26 17:53 ?2234次閱讀
    技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:基本<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>和變量

    大數(shù)據(jù)采集系統(tǒng)分為幾類(lèi)

    大數(shù)據(jù)采集系統(tǒng)是大數(shù)據(jù)生態(tài)系統(tǒng)中的重要組成部分,它負(fù)責(zé)從各種數(shù)據(jù)源收集、整合和存儲(chǔ)數(shù)據(jù)。根據(jù)不同的數(shù)據(jù)源、采集方法和應(yīng)
    的頭像 發(fā)表于 07-01 15:44 ?1645次閱讀

    工業(yè)物聯(lián)網(wǎng)平臺(tái)的應(yīng)用場(chǎng)景哪些

    數(shù)據(jù),實(shí)現(xiàn)設(shè)備聯(lián)網(wǎng)與數(shù)據(jù)共享,從而為各種工業(yè)場(chǎng)景提供可靠應(yīng)用。對(duì)此,數(shù)之能提供高效可靠的工業(yè)物聯(lián)網(wǎng)平臺(tái),助力企業(yè)的數(shù)字化轉(zhuǎn)型。 應(yīng)用場(chǎng)景 1、實(shí)時(shí)監(jiān)測(cè) 通過(guò)接入PLC、儀器儀表、工業(yè)機(jī)
    的頭像 發(fā)表于 06-13 10:51 ?428次閱讀
    工業(yè)物聯(lián)網(wǎng)平臺(tái)的應(yīng)<b class='flag-5'>用場(chǎng)景</b><b class='flag-5'>有</b>哪些

    STM32待機(jī)模式適合用于那些應(yīng)用場(chǎng)景?

    對(duì)于查看STM32低功耗模式,共有三種,其中最省電的為待機(jī)模式,但是待機(jī)模式喚醒后相當(dāng)于軟件復(fù)位了,ram及寄存器中的值都復(fù)位了,僅僅是備份域的寄存器除外,因此個(gè)疑問(wèn),待機(jī)模式適合用于那些應(yīng)用場(chǎng)景
    發(fā)表于 05-07 07:46

    GeminiDB 新特性:讓 Redis 廣告頻控愛(ài)不釋手的 exHASH

    exHash 類(lèi)型是一種支持 Field 過(guò)期的新型數(shù)據(jù)類(lèi)型,它在原先的 Hash 類(lèi)型基礎(chǔ)上進(jìn)行了擴(kuò)展:在支持 Hash 類(lèi)型的通用功能以外,exHash
    的頭像 發(fā)表于 04-08 18:26 ?1068次閱讀
    GeminiDB 新特性:讓 <b class='flag-5'>Redis</b> 廣告頻控愛(ài)不釋手的 exHASH

    C語(yǔ)言數(shù)據(jù)類(lèi)型哪些

    在 C 語(yǔ)言中,數(shù)據(jù)類(lèi)型指的是用于聲明不同類(lèi)型的變量或函數(shù)的一個(gè)廣泛的系統(tǒng)。變量的類(lèi)型決定了變量存儲(chǔ)占用的空間,以及如何解釋存儲(chǔ)的位模式。
    發(fā)表于 03-20 10:56 ?499次閱讀
    C語(yǔ)言<b class='flag-5'>數(shù)據(jù)類(lèi)型</b><b class='flag-5'>有</b>哪些

    NanoEdge AI的技術(shù)原理、應(yīng)用場(chǎng)景及優(yōu)勢(shì)

    能耗并提高數(shù)據(jù)安全性。本文將對(duì) NanoEdge AI 的技術(shù)原理、應(yīng)用場(chǎng)景以及優(yōu)勢(shì)進(jìn)行綜述。 1、技術(shù)原理 NanoEdge AI 的核心技術(shù)包括邊緣計(jì)算、神經(jīng)網(wǎng)絡(luò)壓縮和低功耗硬件設(shè)計(jì)。邊緣計(jì)算
    發(fā)表于 03-12 08:09

    AG32VF-MIPI應(yīng)用場(chǎng)景

    的基礎(chǔ)上,集成了MIPI接口協(xié)議,提供了豐富的功能和特性,能夠滿(mǎn)足不同應(yīng)用場(chǎng)景的需求,為用戶(hù)提供更加全面、便捷、高效的數(shù)據(jù)傳輸方案。 基本參數(shù): MIPI up to 1.5Gbps LVDS up
    發(fā)表于 01-22 08:56