佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Redis不僅僅是緩存,還是……

Redis不僅僅是緩存,還是……

熱門(mén)標(biāo)簽:百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化 Linux服務(wù)器 AI電銷(xiāo) 地方門(mén)戶網(wǎng)站 鐵路電話系統(tǒng) 呼叫中心市場(chǎng)需求 服務(wù)外包

你需要一個(gè)經(jīng)典數(shù)據(jù)庫(kù)嗎?

一段時(shí)間以來(lái),巨大數(shù)量的數(shù)據(jù)處理迫使所有的應(yīng)用程序在數(shù)據(jù)庫(kù)層前添加緩存策略。即使經(jīng)典數(shù)據(jù)庫(kù)進(jìn)行了大量的下劃線優(yōu)化,仍然不能提供足夠的速度和可用性。主要原因在于數(shù)據(jù)存儲(chǔ)越遠(yuǎn),獲取數(shù)據(jù)就越困難。另一個(gè)原因是因?yàn)閿?shù)據(jù)庫(kù)中的數(shù)據(jù)通常保存在磁盤(pán)中,而不是在內(nèi)存。經(jīng)典數(shù)據(jù)庫(kù)卻是在內(nèi)存上嵌入了緩存來(lái)優(yōu)化,但是擁有一個(gè)專(zhuān)用的獨(dú)立緩存也是一種很常用的策略。

在解決訪問(wèn)數(shù)據(jù)庫(kù)的性能問(wèn)題,通常的解決方案是緩存。緩存并不新鮮,緩存實(shí)際上是把經(jīng)常訪問(wèn)的少量數(shù)據(jù)保存在離你更近的地方。我們?cè)谔幚砥魃嫌芯彺?,?shù)據(jù)庫(kù)中也有緩存,你甚至可以在自己的應(yīng)用中編寫(xiě)緩存。

但隨著事情的發(fā)展,現(xiàn)在我們有來(lái)高可用的分布式內(nèi)存緩存,可以被不同的實(shí)例同時(shí)使用。

緩存——Redis

也許最流行的分布式內(nèi)存數(shù)據(jù)存儲(chǔ)是Redis,它不是緩存,但被當(dāng)作緩存使用。 引用官方的描述如下:

Redis是一個(gè)開(kāi)源的(BSD協(xié)議),內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),它可以用作數(shù)據(jù)庫(kù),緩存,消息代理。它支持的數(shù)據(jù)結(jié)構(gòu)包括字符串,哈希,列表,集合,有序集合,位圖,超級(jí)日志,具有半徑查詢和流的地理空間索引和流,Redis具有內(nèi)置復(fù)制,Lua腳本,LRU驅(qū)逐,事務(wù)和不同級(jí)別的磁盤(pán)持久化,并通過(guò)Redis哨兵和Redis集群自動(dòng)分區(qū)。

Redis速度很快,它被認(rèn)為是目前最快的數(shù)據(jù)存儲(chǔ)之一。它對(duì)CPU緩存進(jìn)行了優(yōu)化,并且沒(méi)有上下文切換。從一開(kāi)始它就被設(shè)計(jì)成了內(nèi)存數(shù)據(jù)庫(kù),這不僅意味著將數(shù)據(jù)從磁盤(pán)移動(dòng)到內(nèi)存,它從一開(kāi)始就針對(duì)性的優(yōu)化了。

由于Redis速度非???,可以存儲(chǔ)各種數(shù)據(jù)結(jié)構(gòu),因此它是分布式緩存的一個(gè)很好的備選。

因?yàn)樽鳛榫彺?,Redis獲得了非常高的人氣。有一些緩存加載器庫(kù)在使用Redis作為應(yīng)用程序和數(shù)據(jù)庫(kù)之間的緩存層。以Redisson地圖加載器為例:

因此,使用分布式緩存可以極大的提高性能。但是代碼和架構(gòu)變得更復(fù)雜了。數(shù)據(jù)被復(fù)制到數(shù)據(jù)庫(kù)和緩存中,我們必須保持它們的數(shù)據(jù)同步。代碼應(yīng)該管理整個(gè)緩存策略,控制緩存失效,重新填充緩存,都是為了保持?jǐn)?shù)據(jù)的一致性。我們實(shí)現(xiàn)了更高的性能和可伸縮性,但引入了高風(fēng)險(xiǎn)的復(fù)雜性。

數(shù)據(jù)是重復(fù)的

你可能會(huì)問(wèn)為什么要在兩個(gè)地方都保存數(shù)據(jù)?不能只保存Redis中的數(shù)據(jù)嗎?如果這樣做我們可以減少代碼的復(fù)雜性。但首先讓我們看看經(jīng)典數(shù)據(jù)庫(kù)的一下特點(diǎn)和優(yōu)勢(shì),看看我們是否可以直接使用Redis實(shí)現(xiàn)這些。

關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)

傳統(tǒng)來(lái)說(shuō),緩存是不會(huì)長(zhǎng)期保存數(shù)據(jù)的。我們將數(shù)據(jù)保存在緩存中只是為了快速的訪問(wèn),但是為了長(zhǎng)時(shí)間的持久性,我們通常使用一個(gè)中央數(shù)據(jù)庫(kù)。

除了數(shù)據(jù)的持久性以外,關(guān)系型數(shù)據(jù)庫(kù)提供了數(shù)據(jù)一致性等其他特點(diǎn)。使用關(guān)系型數(shù)據(jù)庫(kù),你可以定義數(shù)據(jù)間的關(guān)系,約束,復(fù)雜查詢,構(gòu)建它是為了保證多個(gè)相關(guān)表間的一致性。

它有一些重要的優(yōu)勢(shì),即使NoSQL數(shù)據(jù)庫(kù)很流行,關(guān)系型數(shù)據(jù)庫(kù)也不會(huì)很快消失。

但是使用Redis作為緩存和關(guān)系型數(shù)據(jù)庫(kù)搭配使用,增加了一層復(fù)雜性,因?yàn)槟惚仨毻ㄟ^(guò)代碼保持兩者的數(shù)據(jù)同步。

考慮到你的緩存策略,你不得不構(gòu)建一些復(fù)雜的代碼在Redis和數(shù)據(jù)庫(kù)間進(jìn)行數(shù)據(jù)發(fā)送。不要誤解我的意思,有時(shí)候你必須這么做。就像之前提到的,關(guān)系型數(shù)據(jù)庫(kù)有它的優(yōu)點(diǎn),我們不能把它扔掉。

但是我們必須每次都這么做嗎?如果不同數(shù)據(jù)間不需要非常復(fù)雜的關(guān)系,而只存儲(chǔ)一個(gè)鍵映射就足夠了呢?我們是不是可以不用關(guān)系型數(shù)據(jù)庫(kù)了?

Redis作為中央數(shù)據(jù)存儲(chǔ)

如前所述,關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)是一致性和持久性。如果我們不需要數(shù)據(jù)之間的關(guān)系映射,那么它將只保留持久性。有很多NoSQL數(shù)據(jù)庫(kù)提供鍵映射存儲(chǔ),但我們可以直接使用Redis。

Redis持久化

Redis有兩種持久化模型:RDB和AOF。

RDB在指定的時(shí)間間隔保存數(shù)據(jù)快照。它們非常適合快速恢復(fù)備份。RDB最大化了Redis的性能,因?yàn)楦高M(jìn)程所做的唯一工作就是fork創(chuàng)建快照的子進(jìn)程。

但是由于RDB在一定時(shí)間間隔執(zhí)行計(jì)劃,如果你無(wú)法承受丟失一些數(shù)據(jù),那么這就不是一個(gè)好的選擇。fork是一個(gè)高成本的操作,不能在每次數(shù)據(jù)變化都進(jìn)行fork,因此可能會(huì)出現(xiàn)最近的數(shù)據(jù)沒(méi)有被保存在快照中的情況。

AOF是一個(gè)不同的持久化模型。它是由一個(gè)只能追加的文件組成,只在其中添加所有數(shù)據(jù)。它更持久,因?yàn)閒sync策略通常比整個(gè)RDB更有計(jì)劃性。由于該文件僅用于追加,因此數(shù)據(jù)是不可更改的。即使在最后一條數(shù)據(jù)沒(méi)有完全寫(xiě)完而出現(xiàn)斷電,也可以很容易的重新斷電前的構(gòu)建狀態(tài)。

但是它也有缺點(diǎn)。第一個(gè)是AOF文件通常比RDB更大。另外,如果fsync策略被調(diào)度的太頻繁,舉個(gè)例子,在每次寫(xiě)命令之后,那么性能會(huì)大打折扣。在默認(rèn)情況下,fsync每秒運(yùn)行一次。

你應(yīng)該使用哪個(gè)?

如果你想要一個(gè)類(lèi)似Postgres提供的安全級(jí)別,你將不得不兩種情況都使用。使用RDB可以讓你在重啟后更快的恢復(fù)備份;使用AOF可以避免數(shù)據(jù)丟失。但是如果你能承受一些數(shù)據(jù)損失,那可以只使用RDB。記住,Redis會(huì)把它們合并成一個(gè)單一的持久化模型。

其他優(yōu)勢(shì)

未來(lái)是屬于字節(jié)尋址的

由于磁盤(pán)旋轉(zhuǎn)在很長(zhǎng)一段時(shí)間都是持久化單元,所以當(dāng)前的大多數(shù)數(shù)據(jù)庫(kù)仍然在適應(yīng)磁盤(pán)的旋轉(zhuǎn)方面進(jìn)行優(yōu)化。比如數(shù)據(jù)定位,以減少磁盤(pán)旋轉(zhuǎn)滯后,甚至選擇了專(zhuān)門(mén)的格式,將索引放在了盤(pán)片的特定部分。但是這些優(yōu)化對(duì)于當(dāng)前的技術(shù),比如SSD,是沒(méi)有意義的。Redis存儲(chǔ)數(shù)據(jù)是為字節(jié)尋址優(yōu)化的。未來(lái)是屬于字節(jié)尋址的,而Redis已經(jīng)在那里了。

可伸縮性和高可用性

Redis提供了不同的方式來(lái)實(shí)現(xiàn)伸縮性和高可用性。

你可以在不同的Redis節(jié)點(diǎn)上分割數(shù)據(jù)來(lái)實(shí)現(xiàn)水平的可擴(kuò)展性。分片將減輕單個(gè)實(shí)例的負(fù)擔(dān),你將受益于多核和計(jì)算能力。但是你應(yīng)該知道分片的局限性,因?yàn)椴荒苤С侄噫I操作和事務(wù)。

通過(guò)復(fù)制獲得高可用性。主節(jié)點(diǎn)是同步復(fù)制的,可以免受節(jié)點(diǎn)故障,數(shù)據(jù)中心故障和Redis進(jìn)程故障。如果主節(jié)點(diǎn)宕機(jī),副節(jié)點(diǎn)將會(huì)取而代之。在不同的AZ中也有一個(gè)副本,這將保護(hù)你免受災(zāi)難時(shí)間的影響,比如整個(gè)AZ失敗。

如果你打算使用Redis企業(yè)集群,所有的這些對(duì)你都是抽象的,你將擁有分片和高可用性,而不需要額外的代碼。你可以通過(guò)編碼連接到一個(gè)Redis實(shí)例。

復(fù)雜數(shù)據(jù)結(jié)構(gòu)

Redis不僅可以處理字符串,還可以處理不同的數(shù)據(jù)結(jié)構(gòu),如:二進(jìn)制安全字符串,列表,集合,排序集合,位圖,超級(jí)日志,流等等。這使得Redis不僅是一個(gè)鍵值存儲(chǔ),更是一個(gè)完整的數(shù)據(jù)結(jié)構(gòu)服務(wù)器。

不是銀彈

一切聽(tīng)起來(lái)都非常棒,但是作為一個(gè)事實(shí),沒(méi)什么東西是銀彈,Redis也不是。主要的缺點(diǎn)是所有的數(shù)據(jù)都應(yīng)該裝進(jìn)內(nèi)存中。這使Redis適合那些有足夠內(nèi)存進(jìn)行存儲(chǔ)的數(shù)據(jù)。如果沒(méi)有,那就必須將數(shù)據(jù)拆分。但是你會(huì)失去一下保證,如事務(wù),管道,或發(fā)布/訂閱。

結(jié)論

在很長(zhǎng)一段時(shí)間里,Redis被認(rèn)為只是一個(gè)緩存。一個(gè)非常好的分布式緩存,但仍然只是一個(gè)應(yīng)用程序和主數(shù)據(jù)庫(kù)之間的緩存。正如你所看到的,Redis不僅僅是一個(gè)緩存,它試圖擺脫這個(gè)誤解。Redis不是一個(gè)緩存,它是一個(gè)分布式數(shù)據(jù)存儲(chǔ)。它可以以線程安全模式以令人難以置信的速度處理不同的數(shù)據(jù)結(jié)構(gòu),并為數(shù)據(jù)持久性提供了不同的機(jī)制。

考慮到所有這些,即使Redis被非常成功地用作緩存,它還是可以做更多的事情。如果你不需要一些像關(guān)系數(shù)據(jù)和高存儲(chǔ)的SQL屬性,為什么你要在應(yīng)用程序中創(chuàng)建一個(gè)復(fù)雜的三層系統(tǒng)?Redis作為緩存和還是數(shù)據(jù)庫(kù)?在這些情況下,你可以只使用Redis作為主要的持久層。

原文鏈接:https://dzone.com/articles/redis-is-not-just-a-cache

到此這篇關(guān)于Redis不僅僅是緩存,還是……的文章就介紹到這了,更多相關(guān)Redis 緩存 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • java操作Redis緩存設(shè)置過(guò)期時(shí)間的方法
  • Redis緩存及熱點(diǎn)key問(wèn)題解決方案
  • SpringBoot2整合Redis緩存三步驟代碼詳解
  • SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析
  • spring boot注解方式使用redis緩存操作示例
  • Spring Cache手動(dòng)清理Redis緩存

標(biāo)簽:湘潭 崇左 蘭州 仙桃 湖南 銅川 衡水 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis不僅僅是緩存,還是……》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    遵化市| 什邡市| 越西县| 射洪县| 宜州市| 琼海市| 阳城县| 洪江市| 章丘市| 阳高县| 通城县| 六安市| 莆田市| 景德镇市| 遵化市| 班玛县| 和硕县| 达州市| 商南县| 龙泉市| 金阳县| 桃源县| 延安市| 宿迁市| 潢川县| 曲松县| 襄城县| 晋宁县| 仁寿县| 巴青县| 河曲县| 确山县| 夹江县| 张家港市| 全州县| 雷山县| 辛集市| 黄梅县| 宣恩县| 偏关县| 仙游县|