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

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

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

Redis的各項功能解決了哪些問題

電子工程師 ? 來源:fqj ? 2019-05-22 16:45 ? 次閱讀

先看一下Redis是一個什么東西。官方簡介解釋到:Redis是一個基于BSD開源的項目,是一個把結(jié)構(gòu)化的數(shù)據(jù)放在內(nèi)存中的一個存儲系統(tǒng),你可以把它作為數(shù)據(jù)庫,緩存和消息中間件來使用。同時支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglogs和geospatial indexes等數(shù)據(jù)類型。它還內(nèi)建了復(fù)制,lua腳本,LRU,事務(wù)等功能,通過redis sentinel實現(xiàn)高可用,通過redis cluster實現(xiàn)了自動分片。以及事務(wù),發(fā)布/訂閱,自動故障轉(zhuǎn)移等等。

綜上所述,Redis提供了豐富的功能,初次見到可能會感覺眼花繚亂,這些功能都是干嘛用的?都解決了什么問題?什么情況下才會用到相應(yīng)的功能?那么下面從零開始,一步一步的演進(jìn)來粗略的解釋下。

1 從零開始

最初的需求非常簡單,我們有一個提供熱點新聞列表的api,api的消費者抱怨說每次請求都要2秒左右才能返回結(jié)果。

隨后我們就著手于如何提升一下api消費者感知的性能,很快最簡單粗暴的第一個方案就出來了:為API的響應(yīng)加上基于HTTP的緩存控制cache-control:max-age=600,即讓消費者可以緩存這個響應(yīng)十分鐘。如果api消費者如果有效的利用了響應(yīng)中的緩存控制信息,則可以有效的改善其感知的性能(10分鐘以內(nèi))。但是還有2個弊端:第一個是在緩存生效的10分鐘內(nèi),api消費者可能會得到舊的數(shù)據(jù);第二個是如果api的客戶端無視緩存直接訪問API依然是需要2秒,治標(biāo)不治本吶。

2 基于本機內(nèi)存的緩存

為了解決調(diào)用API依然需要2秒的問題,經(jīng)過排查,其主要原因在于使用SQL獲取熱點新聞的過程中消耗了將近2秒的時間,于是乎,我們又想到了一個簡單粗暴的解決方案,即把SQL查詢的結(jié)果直接緩存在當(dāng)前api服務(wù)器的內(nèi)存中(設(shè)置緩存有效時間為1分鐘)。后續(xù)1分鐘內(nèi)的請求直接讀緩存,不再花費2秒去執(zhí)行SQL了。假如這個api每秒接收到的請求時100個,那么一分鐘就是6000個,也就是只有前2秒擁擠過來的請求會耗時2秒,后續(xù)的58秒中的所有請求都可以做到即使響應(yīng),而無需再等2秒的時間。

其他API的小伙伴發(fā)現(xiàn)這是個好辦法,于是很快我們就發(fā)現(xiàn)API服務(wù)器的內(nèi)存要爆滿了。。。

3 服務(wù)端的Redis

在API服務(wù)器的內(nèi)存都被緩存塞滿的時候,我們發(fā)現(xiàn)不得不另想解決方案了。最直接的想法就是我們把這些緩存都丟到一個專門的服務(wù)器上吧,把它的內(nèi)存配置的大大的。然后我們就盯上了redis。。。至于如何配置部署redis這里不解釋了,redis官方有詳細(xì)的介紹。隨后我們就用上了一臺單獨的服務(wù)器作為Redis的服務(wù)器,API服務(wù)器的內(nèi)存壓力得以解決。

3.1 持久化(Persistence)

單臺的Redis服務(wù)器一個月總有那么幾天心情不好,心情不好就罷工了,導(dǎo)致所有的緩存都丟失了(redis的數(shù)據(jù)是存儲在內(nèi)存的嘛)。雖然可以把Redis服務(wù)器重新上線,但是由于內(nèi)存的數(shù)據(jù)丟失,造成了緩存雪崩,API服務(wù)器和數(shù)據(jù)庫的壓力還是一下子就上來了。所以這個時候Redis的持久化功能就派上用場了,可以緩解一下緩存雪崩帶來的影響。redis的持久化指的是redis會把內(nèi)存的中的數(shù)據(jù)寫入到硬盤中,在redis重新啟動的時候加載這些數(shù)據(jù),從而最大限度的降低緩存丟失帶來的影響。

3.2 哨兵(Sentinel)和復(fù)制(Replication)

Redis服務(wù)器毫無征兆的罷工是個麻煩事。那么怎辦辦?答曰:備份一臺,你掛了它上。那么如何得知某一臺redis服務(wù)器掛了,如何切換,如何保證備份的機器是原始服務(wù)器的完整備份呢?這時候就需要Sentinel和Replication出場了。Sentinel可以管理多個Redis服務(wù)器,它提供了監(jiān)控,提醒以及自動的故障轉(zhuǎn)移的功能;Replication則是負(fù)責(zé)讓一個Redis服務(wù)器可以配備多個備份的服務(wù)器。Redis也是利用這兩個功能來保證Redis的高可用的。此外,Sentinel功能則是對Redis的發(fā)布和訂閱功能的一個利用。

3.3 集群(Cluster)

單臺服務(wù)器資源的總是有上限的,CPU資源和IO資源我們可以通過主從復(fù)制,進(jìn)行讀寫分離,把一部分CPU和IO的壓力轉(zhuǎn)移到從服務(wù)器上。但是內(nèi)存資源怎么辦,主從模式做到的只是相同數(shù)據(jù)的備份,并不能橫向擴充內(nèi)存;單臺機器的內(nèi)存也只能進(jìn)行加大處理,但是總有上限的。所以我們就需要一種解決方案,可以讓我們橫向擴展。最終的目的既是把每臺服務(wù)器只負(fù)責(zé)其中的一部分,讓這些所有的服務(wù)器構(gòu)成一個整體,對外界的消費者而言,這一組分布式的服務(wù)器就像是一個集中式的服務(wù)器一樣(之前在解讀REST的博客中解釋過分布式于基于網(wǎng)絡(luò)的差異:基于網(wǎng)絡(luò)應(yīng)用的架構(gòu))。

在Redis官方的分布式方案出來之前,有twemproxy和codis兩種方案,這兩個方案總體上來說都是依賴proxy來進(jìn)行分布式的,也就是說redis本身并不關(guān)心分布式的事情,而是交由twemproxy和codis來負(fù)責(zé)。而redis官方給出的cluster方案則是把分布式的這部分事情做到了每一個redis服務(wù)器中,使其不再需要其他的組件就可以獨立的完成分布式的要求。我們這里不關(guān)心這些方案的優(yōu)略,我們關(guān)注一下這里的分布式到底是要處理那些事情?也就是twemproxy和codis獨立處理的處理分布式的這部分邏輯和cluster集成到redis服務(wù)的這部分邏輯到底在解決什么問題?

如我們前面所說的,一個分布式的服務(wù)在外界看來就像是一個集中式的服務(wù)一樣。那么要做到這一點就面臨著有一個問題需要解決:既是增加或減少分布式服務(wù)中的服務(wù)器的數(shù)量,對消費這個服務(wù)的客戶端而言應(yīng)該是無感的;那么也就意味著客戶端不能穿透分布式服務(wù),把自己綁死到某一個臺的服務(wù)器上去,因為一旦如此,你就再也無法新增服務(wù)器,也無法進(jìn)行故障替換。
解決這個問題有兩個路子:
第一個路子最直接,那就是我加一個中間層來隔離這種具體的依賴,即twemproxy采用的方式,讓所有的客戶端只能通過它來消費redsi服務(wù),通過它來隔離這種依賴(但是你會發(fā)現(xiàn)twermproxy會成為一個單點),這種情況下每臺redis服務(wù)器都是獨立的,它們之間彼此不知對方的存在
第二個路子是讓redis服務(wù)器知道彼此的存在,通過重定向的機制來引導(dǎo)客戶端來完成自己所需要的操作
比如客戶端鏈接到了某一個redis服務(wù)器,說我要執(zhí)行這個操作,redis服務(wù)器發(fā)現(xiàn)自己無法完成這個操作,那么就把能完成這個操作的服務(wù)器的信息給到客戶端,讓客戶端去請求另外的一個服務(wù)器,這時候你就會發(fā)現(xiàn)每一個redis服務(wù)器都需要保持一份完整的分布式服務(wù)器信息的一份資料,不然它怎么知道讓客戶端去找其他的哪個服務(wù)器來執(zhí)行客戶端想要的操作呢。

上面這一大段解釋了這么多,不知有沒有發(fā)現(xiàn)不管是第一個路子還是第二個路子,都有一個共同的東西存在,那就是分布式服務(wù)中所有服務(wù)器以及其能提供的服務(wù)的信息。這些信息無論如何也是要存在的,區(qū)別在于第一個路子是把這部分信息單獨來管理,用這些信息來協(xié)調(diào)后端的多個獨立的redis服務(wù)器;第二個路子則是讓每一個redis服務(wù)器都持有這份信息,彼此知道對方的存在,來達(dá)成和第一個路子一樣的目的,優(yōu)點是不再需要一個額外的組件來處理這部分事情。

Redis Cluster的具體實現(xiàn)細(xì)節(jié)則是采用了Hash槽的概念,即預(yù)先分配出來16384個槽:在客戶端通過對Key進(jìn)行CRC16(key)% 16384運算得到對應(yīng)的槽是哪一個;在redis服務(wù)端則是每個服務(wù)器負(fù)責(zé)一部分槽,當(dāng)有新的服務(wù)器加入或者移除的時候,再來遷移這些槽以及其對應(yīng)的數(shù)據(jù),同時每個服務(wù)器都持有完整的槽和其對應(yīng)的服務(wù)器的信息,這就使得服務(wù)器端可以進(jìn)行對客戶端的請求進(jìn)行重定向處理。

4 客戶端的Redis

上面的第三小節(jié)主要介紹的是Redis服務(wù)端的演進(jìn)步驟,解釋了Redis如何從一個單機的服務(wù),進(jìn)化為一個高可用的、去中心化的、分布式的存儲系統(tǒng)。這一小節(jié)則是關(guān)注下客戶端可以消費的redis服務(wù)。

4.1 數(shù)據(jù)類型

redis支持豐富的數(shù)據(jù)類型,從最基礎(chǔ)的string到復(fù)雜的常用到的數(shù)據(jù)結(jié)構(gòu)都有支持:

string:最基本的數(shù)據(jù)類型,二進(jìn)制安全的字符串,最大512M。

list:按照添加順序保持順序的字符串列表。

set:無序的字符串集合,不存在重復(fù)的元素。

sorted set:已排序的字符串集合。

hash:key-value對的一種集合。

bitmap:更細(xì)化的一種操作,以bit為單位。

hyperloglog:基于概率的數(shù)據(jù)結(jié)構(gòu)。

這些眾多的數(shù)據(jù)類型,主要是為了支持各種場景的需要,當(dāng)然每種類型都有不同的時間復(fù)雜度。其實這些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)相當(dāng)于之前我在《解讀REST》這個系列博客基于網(wǎng)絡(luò)應(yīng)用的架構(gòu)風(fēng)格中介紹到的遠(yuǎn)程數(shù)據(jù)訪問(Remote Data Access = RDA)的具體實現(xiàn),即通過在服務(wù)器上執(zhí)行一組標(biāo)準(zhǔn)的操作命令,在服務(wù)端之間得到想要的縮小后的結(jié)果集,從而簡化客戶端的使用,也可以提高網(wǎng)絡(luò)性能。
比如如果沒有l(wèi)ist這種數(shù)據(jù)結(jié)構(gòu),你就只能把list存成一個string,客戶端拿到完整的list,操作后再完整的提交給redis,會產(chǎn)生很大的浪費。

4.2 事務(wù)

上述數(shù)據(jù)類型中,每一個數(shù)據(jù)類型都有獨立的命令來進(jìn)行操作,很多情況下我們需要一次執(zhí)行不止一個命令,而且需要其同時成功或者失敗。redis對事務(wù)的支持也是源自于這部分需求,即支持一次性按順序執(zhí)行多個命令的能力,并保證其原子性。

4.3 Lua腳本

在事務(wù)的基礎(chǔ)上,如果我們需要在服務(wù)端一次性的執(zhí)行更復(fù)雜的操作(包含一些邏輯判斷),則lua就可以排上用場了(比如在獲取某一個緩存的時候,同時延長其過期時間)。redis保證lua腳本的原子性,一定的場景下,是可以代替redis提供的事務(wù)相關(guān)的命令的。相當(dāng)于基于網(wǎng)絡(luò)應(yīng)用的架構(gòu)風(fēng)格中介紹到的遠(yuǎn)程求值(Remote Evluation = REV)的具體實現(xiàn)。

4.4 管道

因為redis的客戶端和服務(wù)器的連接時基于TCP的, 默認(rèn)每次連接都時只能執(zhí)行一個命令。管道則是允許利用一次連接來處理多條命令,從而可以節(jié)省一些tcp連接的開銷。管道和事務(wù)的差異在于管道是為了節(jié)省通信的開銷,但是并不會保證原子性。

4.5 分布式鎖

官方推薦采用Redlock算法,即使用string類型,加鎖的時候給的一個具體的key,然后設(shè)置一個隨機的值;取消鎖的時候用使用lua腳本來先執(zhí)行獲取比較,然后再刪除key。具體的命令如下:

SET resource_name my_random_value NX PX 30000if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1])else return 0end

總結(jié)

本篇著重從抽象層面來解釋下redis的各項功能以及其存在的目的,而沒有關(guān)心其具體的細(xì)節(jié)是什么。從而可以聚焦于其解決的問題,依據(jù)抽象層面的概念可以使得我們在特定的場景下選擇更合適的方案,而非局限于其技術(shù)細(xì)節(jié)。

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

    關(guān)注

    0

    文章

    31

    瀏覽量

    10424
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    376

    瀏覽量

    10887

原文標(biāo)題:Redis 的各項功能解決了哪些問題?

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

收藏 人收藏

    評論

    相關(guān)推薦

    華為云Flexus X實例,Redis性能加速評測及對比

    隨著云計算技術(shù)的飛速發(fā)展,Redis 作為一種高性能的內(nèi)存數(shù)據(jù)庫,在各種應(yīng)用場景中發(fā)揮著越來越重要的作用。為了滿足不同用戶對 Redis 性能的高要求,華為云推出了 Flexus X 實例,并提供
    的頭像 發(fā)表于 12-29 15:47 ?169次閱讀
    華為云Flexus X實例,<b class='flag-5'>Redis</b>性能加速評測及對比

    Redis緩存與Memcached的比較

    Redis和Memcached都是廣泛使用的內(nèi)存數(shù)據(jù)存儲系統(tǒng),它們主要用于提高應(yīng)用程序的性能,通過減少對數(shù)據(jù)庫的直接訪問來加速數(shù)據(jù)檢索。以下是對Redis和Memcached的比較,涵蓋了它們的一些
    的頭像 發(fā)表于 12-18 09:33 ?164次閱讀

    MCU的主要模塊及其功能解

    MCU的主要模塊及其功能解析: 微控制器:微控制器的主要任務(wù)是控制電壓源逆變器(VSI),將來自電池的電能轉(zhuǎn)換為所需的形式。它接收駕駛員的油門指令作為主要輸入,并通過調(diào)整脈寬調(diào)制(PWM)信號
    的頭像 發(fā)表于 08-12 18:12 ?729次閱讀

    工業(yè)通信網(wǎng)關(guān)的各項功能解

    在工業(yè)自動化和智能制造的浪潮中,工業(yè)通信網(wǎng)關(guān)作為連接工業(yè)現(xiàn)場與互聯(lián)網(wǎng)的重要橋梁,發(fā)揮著至關(guān)重要的作用。它不僅實現(xiàn)不同網(wǎng)絡(luò)協(xié)議之間的轉(zhuǎn)換,還在數(shù)據(jù)采集、設(shè)備控制、網(wǎng)絡(luò)管理等方面展現(xiàn)出強大的功能。本文
    的頭像 發(fā)表于 07-15 16:27 ?345次閱讀
    工業(yè)通信網(wǎng)關(guān)的<b class='flag-5'>各項</b><b class='flag-5'>功能解</b>析

    Redis 開源協(xié)議調(diào)整,我們怎么辦?

    2 024 年 3 月 20 日, Redis 官方宣布,從 Redis 7.4 版本開始,Redis 將獲得源可用許可證 ( RSALv2 ) 和服務(wù)器端公共許可證 ( SSPLv1 ) 的雙重
    的頭像 發(fā)表于 05-09 22:59 ?446次閱讀
    <b class='flag-5'>Redis</b> 開源協(xié)議調(diào)整,我們怎么辦?

    Redis為什么這么快?

    Redis 是基于內(nèi)存的數(shù)據(jù)庫,那不可避免的就要與磁盤數(shù)據(jù)庫做對比。對于磁盤數(shù)據(jù)庫來說,是需要將數(shù)據(jù)讀取到內(nèi)存里的,這個過程會受到磁盤 I/O 的限制。而對于內(nèi)存數(shù)據(jù)庫來說,本身數(shù)據(jù)就存在于內(nèi)存里,也就沒有這方面的開銷。
    發(fā)表于 04-12 10:32 ?220次閱讀
    <b class='flag-5'>Redis</b>為什么這么快?

    Redis開源版與Redis企業(yè)版,怎么選用?

    點擊“藍(lán)字”關(guān)注我們數(shù)以千計的企業(yè)和數(shù)以百萬計的開發(fā)人員Redis開源版來構(gòu)建應(yīng)用程序。但隨著用戶數(shù)量、數(shù)據(jù)量和地區(qū)性的增加,成本、可擴展性、運營和可用性等問題也隨之而來。Redis企業(yè)版
    的頭像 發(fā)表于 04-04 08:04 ?1101次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業(yè)版,怎么選用?

    數(shù)據(jù)安全沒保障?GaussDB(for Redis) 為你保駕護航

    近日,一些用戶反饋,使用的開源 Redis 中新增幾個未知來源的 Key。通過分析發(fā)現(xiàn),用戶使用的開源 Redis 沒有設(shè)置密碼,很可能是遭到了 Redis 擴散病毒的攻擊,表面上只
    的頭像 發(fā)表于 03-28 22:09 ?685次閱讀
    數(shù)據(jù)安全沒保障?GaussDB(for <b class='flag-5'>Redis</b>) 為你保駕護航

    GaussDB(for Redis) 特性揭秘:多租戶管理

    級鑒權(quán)能力,即可約束每個賬號可訪問的數(shù)據(jù)庫(DB)范圍,避免誤操作其他租戶數(shù)據(jù)。該特性可以幫助企業(yè)在共享 Redis 實例的情況下,保護不同租戶的數(shù)據(jù)安全,為企業(yè)的開發(fā)和管理提供便利。 哪些用戶需要使用多租戶功能? 多租戶是數(shù)據(jù)庫用戶剛需的一個
    的頭像 發(fā)表于 03-28 22:06 ?755次閱讀
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:多租戶管理

    GaussDB(for Redis) 特性揭秘:大 key 治理

    (for Redis)提供完備的大 Key 解決方案,支持大 Key 在線診斷、監(jiān)控預(yù)警、承載力強等能力,讓 DBA 如虎添翼
    的頭像 發(fā)表于 03-28 22:06 ?672次閱讀
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:大 key 治理

    GaussDB(for Redis) 游戲?qū)嵺`:玩家下線行為上報

    實現(xiàn)以上功能時,感知用戶下線行為延遲較大,導(dǎo)致上報時間不準(zhǔn)確。華為云 GaussDB(for Redis)作為一款企業(yè)級游戲數(shù)據(jù)庫,具備卓越的企業(yè)級能力,能及時上報用戶下線行為,并被廣泛應(yīng)用于排行榜等多種業(yè)務(wù)場景。 基于 Redis
    的頭像 發(fā)表于 03-28 22:03 ?531次閱讀

    新版 Redis 不再“開源”,對使用者都有哪些影響?

    2024 年 3 月 20 日,Redis Labs 宣布從 Redis 7.4 開始,將原先比較寬松的 BSD 源碼使用協(xié)議修改為 RSAv2和 SSPLv1協(xié)議。該變化意味著 Redis
    的頭像 發(fā)表于 03-27 22:30 ?507次閱讀
    新版 <b class='flag-5'>Redis</b> 不再“開源”,對使用者都有哪些影響?

    Redis官方搜索引擎來了,性能炸裂!

    RediSearch 是一個 Redis 模塊,為 Redis 提供查詢、二級索引和全文搜索功能
    的頭像 發(fā)表于 02-21 10:01 ?2407次閱讀
    <b class='flag-5'>Redis</b>官方搜索引擎來了,性能炸裂!

    Redis可以實現(xiàn)消息中間件MQ的功能

    是一種通信模式:發(fā)送者(PUBLISH)發(fā)送消息,訂閱者(SUBSCRIBE)接收消息,可以實現(xiàn)進(jìn)程間的消息傳遞   Redis可以實現(xiàn)消息中間件MQ的功能,通過發(fā)布訂閱實現(xiàn)消息的引導(dǎo)和分流
    的頭像 發(fā)表于 01-25 14:48 ?962次閱讀
    <b class='flag-5'>Redis</b>可以實現(xiàn)消息中間件MQ的<b class='flag-5'>功能</b>

    Redis為LangChain定制AI代理——OpenGPTs

    于構(gòu)建定制化的人工智能代理。因為Redis具有高速和穩(wěn)定性的優(yōu)點,所以LangChain選擇Redis來作為OpenGPTs的默認(rèn)向量數(shù)據(jù)庫。文
    的頭像 發(fā)表于 01-13 08:03 ?851次閱讀
    用<b class='flag-5'>Redis</b>為LangChain定制AI代理——OpenGPTs