溫馨提示×

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

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

Redis的功能有哪些

發(fā)布時(shí)間:2020-12-28 14:30:53 來源:億速云 閱讀:151 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Redis的功能有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

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

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

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

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

緩存——Redis

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

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

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

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

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

Redis的功能有哪些

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

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

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

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

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

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

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

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

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

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

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

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

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ì)劃,如果你無法承受丟失一些數(shù)據(jù),那么這就不是一個(gè)好的選擇。fork是一個(gè)高成本的操作,不能在每次數(shù)據(jù)變化都進(jìn)行fork,因此可能會(huì)出現(xiàn)最近的數(shù)據(jù)沒有被保存在快照中的情況。

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

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

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

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

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

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

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

可伸縮性和高可用性

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

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

通過復(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ì)你都是抽象的,你將擁有分片和高可用性,而不需要額外的代碼。你可以通過編碼連接到一個(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ù)器。

不是銀彈

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

關(guān)于Redis的功能有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向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