溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解Redis的使用場(chǎng)景

發(fā)布時(shí)間:2021-10-14 09:34:58 來(lái)源:億速云 閱讀:162 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“如何理解Redis的使用場(chǎng)景”,在日常操作中,相信很多人在如何理解Redis的使用場(chǎng)景問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何理解Redis的使用場(chǎng)景”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

什么是Redis

Redis是一款內(nèi)存高速緩存數(shù)據(jù)庫(kù)。Redis全稱為:Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)服務(wù)),使用C語(yǔ)言編寫,Redis是一個(gè)key-value存儲(chǔ)系統(tǒng)(鍵值存儲(chǔ)系統(tǒng)),支持豐富的數(shù)據(jù)類型,如:String、list、set、zset、hash。

Redis是一種支持key-value等多種數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)系統(tǒng)。可用于緩存,事件發(fā)布或訂閱,高速隊(duì)列等場(chǎng)景。支持網(wǎng)絡(luò),提供字符串,哈希,列表,隊(duì)列,集合結(jié)構(gòu)直接存取,基于內(nèi)存,可持久化。

官方資料

Redis官網(wǎng):http://redis.io/

Redis官方文檔:http://redis.io/documentation

Redis教程:http://www.w3cschool.cn/redis/redis-intro.html

Redis下載:http://redis.io/download

為什么要使用Redis

一個(gè)產(chǎn)品的使用場(chǎng)景肯定是需要根據(jù)產(chǎn)品的特性,先列舉一下Redis的特點(diǎn):

  • 讀寫性能優(yōu)異

    • Redis能讀的速度是110000次/s,寫的速度是81000次/s (測(cè)試條件見下一節(jié))。

  • 數(shù)據(jù)類型豐富

    • Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。

  • 原子性

    • Redis的所有操作都是原子性的,同時(shí)Redis還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行。

  • 豐富的特性

    • Redis支持 publish/subscribe, 通知, key 過期等特性。

  • 持久化

    • Redis支持RDB, AOF等持久化方式

  • 發(fā)布訂閱

    • Redis支持發(fā)布/訂閱模式

  • 分布式

    • Redis Cluster

(PS: 具體再結(jié)合下面的使用場(chǎng)景理解下)

下面是官方的bench-mark根據(jù)如下條件獲得的性能測(cè)試(讀的速度是110000次/s,寫的速度是81000次/s

  • 測(cè)試完成了50個(gè)并發(fā)執(zhí)行100000個(gè)請(qǐng)求。

  • 設(shè)置和獲取的值是一個(gè)256字節(jié)字符串。

  • Linux box是運(yùn)行Linux 2.6,這是X3320 Xeon 2.5 ghz。

  • 文本執(zhí)行使用loopback接口(127.0.0.1)。

Redis的使用場(chǎng)景

redis應(yīng)用場(chǎng)景總結(jié)redis平時(shí)我們用到的地方蠻多的,下面就了解的應(yīng)用場(chǎng)景做個(gè)總結(jié):

熱點(diǎn)數(shù)據(jù)的緩存

緩存是Redis最常見的應(yīng)用場(chǎng)景,之所有這么使用,主要是因?yàn)镽edis讀寫性能優(yōu)異。而且逐漸有取代memcached,成為首選服務(wù)端緩存的組件。而且,Redis內(nèi)部是支持事務(wù)的,在使用時(shí)候能有效保證數(shù)據(jù)的一致性。

作為緩存使用時(shí),一般有兩種方式保存數(shù)據(jù):

  • 讀取前,先去讀Redis,如果沒有數(shù)據(jù),讀取數(shù)據(jù)庫(kù),將數(shù)據(jù)拉入Redis。

  • 插入數(shù)據(jù)時(shí),同時(shí)寫入Redis。

方案一:實(shí)施起來(lái)簡(jiǎn)單,但是有兩個(gè)需要注意的地方:

  • 避免緩存擊穿。(數(shù)據(jù)庫(kù)沒有就需要命中的數(shù)據(jù),導(dǎo)致Redis一直沒有數(shù)據(jù),而一直命中數(shù)據(jù)庫(kù)。)

  • 數(shù)據(jù)的實(shí)時(shí)性相對(duì)會(huì)差一點(diǎn)。

方案二:數(shù)據(jù)實(shí)時(shí)性強(qiáng),但是開發(fā)時(shí)不便于統(tǒng)一處理。

當(dāng)然,兩種方式根據(jù)實(shí)際情況來(lái)適用。如:方案一適用于對(duì)于數(shù)據(jù)實(shí)時(shí)性要求不是特別高的場(chǎng)景。方案二適用于字典表、數(shù)據(jù)量不大的數(shù)據(jù)存儲(chǔ)。

限時(shí)業(yè)務(wù)的運(yùn)用

redis中可以使用expire命令設(shè)置一個(gè)鍵的生存時(shí)間,到時(shí)間后redis會(huì)刪除它。利用這一特性可以運(yùn)用在限時(shí)的優(yōu)惠活動(dòng)信息、手機(jī)驗(yàn)證碼等業(yè)務(wù)場(chǎng)景。

計(jì)數(shù)器相關(guān)問題

redis由于incrby命令可以實(shí)現(xiàn)原子性的遞增,所以可以運(yùn)用于高并發(fā)的秒殺活動(dòng)、分布式序列號(hào)的生成、具體業(yè)務(wù)還體現(xiàn)在比如限制一個(gè)手機(jī)號(hào)發(fā)多少條短信、一個(gè)接口一分鐘限制多少請(qǐng)求、一個(gè)接口一天限制調(diào)用多少次等等。

分布式鎖

這個(gè)主要利用redis的setnx命令進(jìn)行,setnx:"set if not exists"就是如果不存在則成功設(shè)置緩存同時(shí)返回1,否則返回0 ,這個(gè)特性在俞你奔遠(yuǎn)方的后臺(tái)中有所運(yùn)用,因?yàn)槲覀?a title="服務(wù)器" target="_blank" href="http://kemok4.com/">服務(wù)器是集群的,定時(shí)任務(wù)可能在兩臺(tái)機(jī)器上都會(huì)運(yùn)行,所以在定時(shí)任務(wù)中首先 通過setnx設(shè)置一個(gè)lock, 如果成功設(shè)置則執(zhí)行,如果沒有成功設(shè)置,則表明該定時(shí)任務(wù)已執(zhí)行。 當(dāng)然結(jié)合具體業(yè)務(wù),我們可以給這個(gè)lock加一個(gè)過期時(shí)間,比如說(shuō)30分鐘執(zhí)行一次的定時(shí)任務(wù),那么這個(gè)過期時(shí)間設(shè)置為小于30分鐘的一個(gè)時(shí)間就可以,這個(gè)與定時(shí)任務(wù)的周期以及定時(shí)任務(wù)執(zhí)行消耗時(shí)間相關(guān)。

在分布式鎖的場(chǎng)景中,主要用在比如秒殺系統(tǒng)等。

延時(shí)操作

比如在訂單生產(chǎn)后我們占用了庫(kù)存,10分鐘后去檢驗(yàn)用戶是夠真正購(gòu)買,如果沒有購(gòu)買將該單據(jù)設(shè)置無(wú)效,同時(shí)還原庫(kù)存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能,允許客戶訂閱Pub/Sub頻道,以便以某種方式接收影響Redis數(shù)據(jù)集的事件。 所以我們對(duì)于上面的需求就可以用以下解決方案,我們?cè)谟唵紊a(chǎn)時(shí),設(shè)置一個(gè)key,同時(shí)設(shè)置10分鐘后過期, 我們?cè)诤笈_(tái)實(shí)現(xiàn)一個(gè)監(jiān)聽器,監(jiān)聽key的實(shí)效,監(jiān)聽到key失效時(shí)將后續(xù)邏輯加上。

當(dāng)然我們也可以利用rabbitmq、activemq等消息中間件的延遲隊(duì)列服務(wù)實(shí)現(xiàn)該需求。

排行榜相關(guān)問題

關(guān)系型數(shù)據(jù)庫(kù)在排行榜方面查詢速度普遍偏慢,所以可以借助redis的SortedSet進(jìn)行熱點(diǎn)數(shù)據(jù)的排序。

比如點(diǎn)贊排行榜,做一個(gè)SortedSet, 然后以用戶的openid作為上面的username, 以用戶的點(diǎn)贊數(shù)作為上面的score, 然后針對(duì)每個(gè)用戶做一個(gè)hash, 通過zrangebyscore就可以按照點(diǎn)贊數(shù)獲取排行榜,然后再根據(jù)username獲取用戶的hash信息,這個(gè)當(dāng)時(shí)在實(shí)際運(yùn)用中性能體驗(yàn)也蠻不錯(cuò)的。

點(diǎn)贊、好友等相互關(guān)系的存儲(chǔ)

Redis 利用集合的一些命令,比如求交集、并集、差集等。

在微博應(yīng)用中,每個(gè)用戶關(guān)注的人存在一個(gè)集合中,就很容易實(shí)現(xiàn)求兩個(gè)人的共同好友功能。

簡(jiǎn)單隊(duì)列

由于Redis有l(wèi)ist push和list pop這樣的命令,所以能夠很方便的執(zhí)行隊(duì)列操作。

參考文章

  • https://baike.baidu.com/item/Redis/6549233?fr=aladdin

  • https://zhuanlan.zhihu.com/p/29665317

  • https://www.jianshu.com/p/40dbc78711c8

知識(shí)體系

知識(shí)體系

如何理解Redis的使用場(chǎng)景

相關(guān)文章

首先,我們通過學(xué)習(xí)Redis的概念基礎(chǔ),了解它適用的場(chǎng)景。

  • Redis入門 - Redis概念和基礎(chǔ)

    • Redis是一種支持key-value等多種數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)系統(tǒng)??捎糜诰彺?,事件發(fā)布或訂閱,高速隊(duì)列等場(chǎng)景。支持網(wǎng)絡(luò),提供字符串,哈希,列表,隊(duì)列,集合結(jié)構(gòu)直接存取,基于內(nèi)存,可持久化。

其次,這些適用場(chǎng)景都是基于Redis支持的數(shù)據(jù)類型的,所以我們需要學(xué)習(xí)它支持的數(shù)據(jù)類型;同時(shí)在redis優(yōu)化中還需要對(duì)底層數(shù)據(jù)結(jié)構(gòu)了解,所以也需要了解一些底層數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)。

如何理解Redis的使用場(chǎng)景

  • Redis入門 - 數(shù)據(jù)類型:5種基礎(chǔ)數(shù)據(jù)類型詳解

    • Redis所有的key(鍵)都是字符串。我們?cè)谡劵A(chǔ)數(shù)據(jù)結(jié)構(gòu)時(shí),討論的是存儲(chǔ)值的數(shù)據(jù)類型,主要包括常見的5種數(shù)據(jù)類型,分別是:String、List、Set、Zset、Hash

  • Redis入門 - 數(shù)據(jù)類型:3種特殊類型詳解

    • Redis除了上文中5種基礎(chǔ)數(shù)據(jù)類型,還有三種特殊的數(shù)據(jù)類型,分別是 HyperLogLogs(基數(shù)統(tǒng)計(jì)), Bitmaps (位圖) 和 geospatial (地理位置)

  • Redis入門 - 數(shù)據(jù)類型:Stream詳解

    • Redis5.0 中還增加了一個(gè)數(shù)據(jù)結(jié)構(gòu)Stream,它借鑒了Kafka的設(shè)計(jì),是一個(gè)新的強(qiáng)大的支持多播的可持久化的消息隊(duì)列。

  • Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):對(duì)象機(jī)制詳解

    • 我們?cè)谇拔囊呀?jīng)闡述了Redis 5種基礎(chǔ)數(shù)據(jù)類型詳解,分別是字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset),以及5.0版本中Redis Stream結(jié)構(gòu)詳解;那么這些基礎(chǔ)類型的底層是如何實(shí)現(xiàn)的呢?Redis的每種對(duì)象其實(shí)都由對(duì)象結(jié)構(gòu)(redisObject)對(duì)應(yīng)編碼的數(shù)據(jù)結(jié)構(gòu)組合而成, 本文主要介紹對(duì)象結(jié)構(gòu)(redisObject) 部分。。

  • Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):底層數(shù)據(jù)結(jié)構(gòu)詳解

    • 前文是第一部分底層設(shè)計(jì):對(duì)象機(jī)制詳解, 本文主要介紹底層數(shù)據(jù)結(jié)構(gòu) 部分。

  • Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):redis對(duì)象與編碼(底層結(jié)構(gòu))對(duì)應(yīng)關(guān)系詳解

    • 在學(xué)習(xí)完底層數(shù)據(jù)結(jié)構(gòu)之后,我們終于可以結(jié)合前文內(nèi)容闡述redis對(duì)象及編碼之間的關(guān)系了。

再者,需要學(xué)習(xí)Redis支持的核心功能,包括持久化,消息,事務(wù),高可用;高可用方面包括,主從,哨兵等;高可拓展方面,比如 分片機(jī)制等。

  • Redis進(jìn)階 - 持久化:RDB和AOF機(jī)制詳解

    • 為了防止數(shù)據(jù)丟失以及服務(wù)重啟時(shí)能夠恢復(fù)數(shù)據(jù),Redis支持?jǐn)?shù)據(jù)的持久化,主要分為兩種方式,分別是RDB和AOF; 當(dāng)然實(shí)際場(chǎng)景下還會(huì)使用這兩種的混合模式。

  • Redis進(jìn)階 - 消息傳遞:發(fā)布訂閱模式詳解

    • Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息。

  • Redis進(jìn)階 - 事件:Redis事件機(jī)制詳解

    • Redis 采用事件驅(qū)動(dòng)機(jī)制來(lái)處理大量的網(wǎng)絡(luò)IO。它并沒有使用 libevent 或者 libev 這樣的成熟開源方案,而是自己實(shí)現(xiàn)一個(gè)非常簡(jiǎn)潔的事件驅(qū)動(dòng)庫(kù) ae_event。

  • Redis進(jìn)階 - 事務(wù):Redis事務(wù)詳解

    • Redis 事務(wù)的本質(zhì)是一組命令的集合。事務(wù)支持一次執(zhí)行多個(gè)命令,一個(gè)事務(wù)中所有命令都會(huì)被序列化。在事務(wù)執(zhí)行過程,會(huì)按照順序串行化執(zhí)行隊(duì)列中的命令,其他客戶端提交的命令請(qǐng)求不會(huì)插入到事務(wù)執(zhí)行命令序列中。

  • Redis進(jìn)階 - 高可用:主從復(fù)制詳解

    • 我們知道要避免單點(diǎn)故障,即保證高可用,便需要冗余(副本)方式提供集群服務(wù)。而Redis 提供了主從庫(kù)模式,以保證數(shù)據(jù)副本的一致,主從庫(kù)之間采用的是讀寫分離的方式。本文主要闡述Redis的主從復(fù)制。

  • Redis進(jìn)階 - 高可用:哨兵機(jī)制(Redis Sentinel)詳解

    • 在上文主從復(fù)制的基礎(chǔ)上,如果注節(jié)點(diǎn)出現(xiàn)故障該怎么辦呢? 在 Redis 主從集群中,哨兵機(jī)制是實(shí)現(xiàn)主從庫(kù)自動(dòng)切換的關(guān)鍵機(jī)制,它有效地解決了主從復(fù)制模式下故障轉(zhuǎn)移的問題。

  • Redis進(jìn)階 - 高可拓展:分片技術(shù)(Redis Cluster)詳解

    • 前面兩篇文章,主從復(fù)制和哨兵機(jī)制保障了高可用,就讀寫分離而言雖然slave節(jié)點(diǎn)來(lái)擴(kuò)展主從的讀并發(fā)能力,但是寫能力和存儲(chǔ)能力是無(wú)法進(jìn)行擴(kuò)展的,就只能是master節(jié)點(diǎn)能夠承載的上限。如果面對(duì)海量數(shù)據(jù)那么必然需要構(gòu)建master(主節(jié)點(diǎn)分片)之間的集群,同時(shí)必然需要吸收高可用(主從復(fù)制和哨兵機(jī)制)能力,即每個(gè)master分片節(jié)點(diǎn)還需要有slave節(jié)點(diǎn),這是分布式系統(tǒng)中典型的縱向擴(kuò)展(集群的分片技術(shù))的體現(xiàn);所以在Redis 3.0版本中對(duì)應(yīng)的設(shè)計(jì)就是Redis Cluster。

最后,就是具體的實(shí)踐以及實(shí)踐中遇到的問題和解決方法了:在不同版本中有不同特性,所以還需要了解版本;以及性能優(yōu)化,大廠實(shí)踐等。

  • Redis進(jìn)階 - 緩存問題:一致性, 穿擊, 穿透, 雪崩, 污染等

    • Redis最常用的一個(gè)場(chǎng)景就是作為緩存,本文主要探討作為緩存,在實(shí)踐中可能會(huì)有哪些問題?比如一致性, 穿擊, 穿透, 雪崩, 污染等

  • Redis進(jìn)階 - 版本特性: Redis4.0、5.0、6.0特性整理

    • 在學(xué)習(xí)Redis知識(shí)體系時(shí),我們難免會(huì)需要查看版本實(shí)現(xiàn)之間的差異,本文主要整理Redis較為新的版本的特性。

  • Redis進(jìn)階 - 運(yùn)維監(jiān)控:Redis的監(jiān)控詳解

    • Redis實(shí)戰(zhàn)中包含開發(fā),集群 和 運(yùn)維,Redis用的好不好,如何讓它更好,這是運(yùn)維要做的;本文主要在 Redis自身狀態(tài)及命令,可視化監(jiān)控工具,以及Redis監(jiān)控體系等方面幫助你構(gòu)建對(duì)redis運(yùn)維/監(jiān)控體系的認(rèn)知,它是性能優(yōu)化的前提。

到此,關(guān)于“如何理解Redis的使用場(chǎng)景”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI