這篇文章主要講解了“redis緩存問題怎么解決”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Redis緩存問題怎么解決”吧!
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),新密企業(yè)網(wǎng)站建設(shè),新密品牌網(wǎng)站建設(shè),網(wǎng)站定制,新密網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,新密網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
它是 Google 開源的 NOSQL 存儲(chǔ)引擎庫,是現(xiàn)代分布式存儲(chǔ)領(lǐng)域的一枚原子彈。在它的基礎(chǔ)之上,F(xiàn)acebook 開發(fā)出了另一個(gè) NOSQL 存儲(chǔ)引擎庫 RocksDB,沿用了 LevelDB 的先進(jìn)技術(shù)架構(gòu)的同時(shí)還解決了 LevelDB 的一些短板。你可以將 RocksDB 比喻成氫彈,它比 LevelDB 的威力更大一些?,F(xiàn)代開源市場(chǎng)上有很多數(shù)據(jù)庫都在使用 RocksDB 作為底層存儲(chǔ)引擎,比如大名鼎鼎的 TiDB。
但是為什么我要講 LevelDB 而不是 RocksDB 呢?其原因在于 LevelDB 技術(shù)架構(gòu)更加簡(jiǎn)單清晰易于理解。如果我們先把 LevelDB 吃透了再去啃一啃 RocksDB 就會(huì)非常好懂了,RocksDB 也只是在 LevelDB 的基礎(chǔ)上添磚加瓦進(jìn)行了一系列優(yōu)化而已。等到我們攻破了 RocksDB 這顆氫彈,TiDB 核動(dòng)力宇宙飛船已經(jīng)在前方不遠(yuǎn)處等著我們了。
當(dāng)我們將 Redis 拿來做緩存用時(shí),背后肯定還有一個(gè)持久層數(shù)據(jù)庫記錄了全量的冷熱數(shù)據(jù)。Redis 和持久層數(shù)據(jù)庫之間的數(shù)據(jù)一致性是由應(yīng)用程序自己來控制的。應(yīng)用程序會(huì)優(yōu)先去緩存中獲取數(shù)據(jù),當(dāng)緩存中沒有數(shù)據(jù)時(shí),應(yīng)用程序需要從持久層加載數(shù)據(jù),然后再放進(jìn)緩存中。當(dāng)數(shù)據(jù)更新發(fā)生時(shí),需要將緩存置為失效。
function getUser(String userId) User {
User user = redis.get(userId);
if user == null {
user = db.get(userId);
if user != null {
redis.set(userId, user);
}
}
return user;
}
function updateUser(String userId, User user) {
db.update(userId, user);
redis.expire(userId);
}
有過這方面開發(fā)經(jīng)驗(yàn)的朋友們就知道寫這樣的代碼還是挺繁瑣的,所有的涉及到緩存的業(yè)務(wù)代碼都需要加上這一部分邏輯。
嚴(yán)格來說我們還需要仔細(xì)考慮緩存一致性問題,比如在 updateUser 方法中,數(shù)據(jù)庫正確執(zhí)行了更新,但是緩存 redis 因?yàn)榫W(wǎng)絡(luò)抖動(dòng)等原因置為失效沒有成功,那么緩存中的數(shù)據(jù)就成了過期數(shù)據(jù)。如果你將設(shè)置緩存和更新持久存的先后順序反過來,也還是會(huì)有其它問題,這個(gè)讀者可以自行思考一下。
LevelDB 將 Redis 緩存和持久層合二為一,一次性幫你搞定緩存和持久層。有了 LevelDB,你的代碼可以簡(jiǎn)化成下面這樣
function getUser(String userId) User {
return leveldb.get(userId);
}
function updateUser(String userId, User user) {
leveldb.set(userId, user);
}
而且你再也不用當(dāng)心緩存一致性問題了,LevelDB 的數(shù)據(jù)更新要么成功要么不成功,不存在中間薛定諤狀態(tài)。LevelDB 的內(nèi)部已經(jīng)內(nèi)置了內(nèi)存緩存和持久層的磁盤文件,用戶完全不用操心內(nèi)部是數(shù)據(jù)如何保持一致的。
前面我們說道它是一個(gè) NOSQL 存儲(chǔ)引擎,它和 Redis 不是一個(gè)概念。Redis 是一個(gè)完備的數(shù)據(jù)庫,而 LevelDB 它只是一個(gè)引擎。如果將數(shù)據(jù)庫必須成一輛高級(jí)跑車,那么存儲(chǔ)引擎就是它的發(fā)動(dòng)機(jī),是核心是心臟。有了這個(gè)發(fā)動(dòng)機(jī),我們?cè)俳o它包裝上一系列的配件和裝飾,就可以成為數(shù)據(jù)庫。不過也不要小瞧了配件和裝飾,做到極致那也是非常困難,將 LevelDB 包裝成一個(gè)簡(jiǎn)單易用的數(shù)據(jù)庫需要加上太多太多精致的配件。LevelDB 和 RocksDB 出來這么多年,能夠在它的基礎(chǔ)上做出非常一個(gè)完備的生產(chǎn)級(jí)數(shù)據(jù)庫寥寥無幾。
在使用 LevelDB 時(shí),我們還可以將它看成一個(gè) Key/Value 內(nèi)存數(shù)據(jù)庫。它提供了基礎(chǔ)的 Get/Set API,我們?cè)诖a里可以通過這個(gè) API 來讀寫數(shù)據(jù)。你還可以將它看成一個(gè)無限大小的高級(jí) HashMap,我們可以往里面塞入無限條 Key/Value 數(shù)據(jù),只要磁盤可以裝下。
正是因?yàn)樗荒芩阕饕粋€(gè)內(nèi)存數(shù)據(jù)庫,它里面裝的數(shù)據(jù)無法跨進(jìn)程跨機(jī)器共享。在分布式領(lǐng)域,LevelDB 要如何大顯身手呢?
這就需要靠包裝技術(shù)了,在 LevelDB 內(nèi)存數(shù)據(jù)庫的基礎(chǔ)上包裝一層網(wǎng)絡(luò) API。當(dāng)不同機(jī)器上不同的進(jìn)程要來訪問它時(shí),都統(tǒng)一走網(wǎng)絡(luò) API 接口。這樣就形成了一個(gè)簡(jiǎn)易的數(shù)據(jù)庫。如果在網(wǎng)絡(luò)層我們使用 Redis 協(xié)議來包裝,那么使用 Redis 的客戶端就可以讀寫這個(gè)數(shù)據(jù)庫了。
如果要考慮數(shù)據(jù)庫的高可用性,我們?cè)谏厦孢@個(gè)單機(jī)數(shù)據(jù)庫的基礎(chǔ)上再加上主從復(fù)制功能就可以變身成為一個(gè)主從結(jié)構(gòu)的分布式 NOSQL 數(shù)據(jù)庫。在主從數(shù)據(jù)庫前面加一層轉(zhuǎn)發(fā)代理(負(fù)載均衡器如 LVS、F5 等),就可以實(shí)現(xiàn)主從的實(shí)時(shí)切換。
如果你需要的數(shù)據(jù)容量特別大以至于單個(gè)機(jī)器的硬盤都容不下,這時(shí)候就需要數(shù)據(jù)分片機(jī)制將整個(gè)數(shù)據(jù)庫的數(shù)據(jù)分散到多臺(tái)機(jī)器上,每臺(tái)機(jī)器只負(fù)責(zé)一部分?jǐn)?shù)據(jù)的讀寫工作。數(shù)據(jù)分片的方案非常多,可以像 Codis 那樣通過轉(zhuǎn)發(fā)代理來分片,也可以像 Redis-Cluster 那樣使用客戶端轉(zhuǎn)發(fā)機(jī)制來分片,還可以使用 TiDB 的 Raft 分布式一致性算法來分組管理分片。最簡(jiǎn)單最易于理解的還是要數(shù) Codis 的轉(zhuǎn)發(fā)代理分片。
當(dāng)數(shù)據(jù)量繼續(xù)增長(zhǎng)需要新增節(jié)點(diǎn)時(shí),就必須將老節(jié)點(diǎn)上的數(shù)據(jù)部分遷移到新節(jié)點(diǎn)上,管理數(shù)據(jù)的均衡和遷移的又是一個(gè)新的高級(jí)配件 —— 數(shù)據(jù)均衡器。
感謝各位的閱讀,以上就是“Redis緩存問題怎么解決”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Redis緩存問題怎么解決這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前文章:Redis緩存問題怎么解決
鏈接分享:http://chinadenli.net/article28/gijocp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、企業(yè)建站、虛擬主機(jī)、服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)