我們?yōu)槭裁词褂胷edis

思路比結(jié)論重要
緩存的本質(zhì)就是從慢的介質(zhì)->內(nèi)存;

image.png

我們可以在各層都可以看到緩存的身影;
pc/app 和ng負(fù)責(zé)均衡層都可以設(shè)計(jì)相應(yīng)的緩存邏輯,減少響應(yīng)耗時(shí);

在服務(wù)端,本質(zhì)上由于db的特性,讀寫性能始終是有瓶頸的;
因此為了提高服務(wù)端性能,把db的數(shù)據(jù)load到cache上;
其實(shí)使用hashMap本質(zhì)也可以理解為單進(jìn)程的cache,只不過功能特性很少,不如實(shí)現(xiàn)key超時(shí),清除,需要另起一個(gè)線程判斷key是不是過時(shí);
開源的單進(jìn)程jvm的有g(shù)oogle開源的guava cache,提供了很多類似redis功能的功能;
jvm進(jìn)程緩存始終會(huì)有單點(diǎn)故障;

因此我們需要使用分布式緩存來避免單點(diǎn)故障;假如公司需要自研緩存產(chǎn)品,都要解決以下問題:

1.客戶端和我交互的協(xié)議怎么設(shè)計(jì),是采用http協(xié)議還是類似于mq的協(xié)議?
2.當(dāng)大量數(shù)據(jù)存儲(chǔ)在緩存時(shí),緩存的內(nèi)存管理是什么樣的機(jī)制?
3.如何解決單點(diǎn)故障問題?怎么保證高可用?
4.如果我的數(shù)據(jù)要持久化,我的持久化的實(shí)際和數(shù)據(jù)文件格式?
5.如何水平擴(kuò)展擴(kuò)容?
6.如何監(jiān)控服務(wù)節(jié)點(diǎn)的信息?
7.需要支持哪些數(shù)據(jù)結(jié)構(gòu),來支持上層業(yè)務(wù)功能呢?

至此我們看下redis是如何涉及解決以上問題的;

1.協(xié)議
之前寫了一篇使用netty實(shí)現(xiàn)redis客戶端,redis都是基于命令的,因此使用了自定義的輕量級協(xié)議
消息看到是文本命令 set zjp 18;
如果我們要想發(fā)送給redis客戶端需要轉(zhuǎn)換成redis服務(wù)端的協(xié)議格式 每部分都是\r\n間隔
*3 \r\n (消息的組成部分 )
3\r\n(各部分消息的長度 set 長度為3) set3\r\n
zjp
$2\r\n
18
這樣的協(xié)議傳輸文本占用字節(jié)和帶寬比http的協(xié)議文本要小的多,因此傳輸效率會(huì)高的多;
可見協(xié)議也是redis高效的原因之一;

2.redis 如何管理我們的內(nèi)存?
當(dāng)應(yīng)用運(yùn)行一段時(shí)間后,我們的服務(wù)的內(nèi)存如果管理,服務(wù)器總會(huì)有最大瓶頸;jvm會(huì)有內(nèi)存gc機(jī)制,當(dāng)發(fā)送oom或者內(nèi)存不夠時(shí)會(huì)有一定的回收機(jī)制?
1 .redis會(huì)有對用的策略lru 最近最少使用,根據(jù)最近使用的key,選擇一定比列的key,選擇時(shí)間較長key;釋放內(nèi)存
2.根據(jù)使用次數(shù),根據(jù)使用次數(shù),選擇使用此時(shí)和頻率較少的key,選擇一個(gè)比列的key,刪除掉使用評率較少的key;釋放內(nèi)存

可以看到,redis會(huì)有不同的回收策略對內(nèi)存進(jìn)行釋放,如果需要二次開發(fā),可以自實(shí)現(xiàn)內(nèi)存的回收策略;

3.高可用設(shè)計(jì)
redis設(shè)計(jì)中提供了2中高可用方案
1.哨兵機(jī)制


image.png

如圖一主2從3哨兵 ,3個(gè)哨兵分別保持鏈接檢查master節(jié)點(diǎn)狀態(tài)和信息
同時(shí)通過info命令拿到當(dāng)前主節(jié)點(diǎn),當(dāng)多數(shù)哨兵認(rèn)為主節(jié)點(diǎn)掛了,通過投票機(jī)制,選舉一個(gè)哨兵執(zhí)行主從切換;
2.集群


image.png

數(shù)據(jù)通過分片存儲(chǔ),每一個(gè)分片也是一個(gè)主從架構(gòu)
主從切換類似哨兵主從切換;

4.數(shù)據(jù)持久化
redis也支持2種持久化方式
1.rdb 基于快照的持久化方式,是命令執(zhí)行的結(jié)果文件 (異步刷盤,存在數(shù)據(jù)丟失可能)寫入速度慢,數(shù)據(jù)恢復(fù)快
2.aof 日志文件 是記錄命令本身,寫入文件較快(支持同步和異步刷盤)

5.支持的數(shù)據(jù)結(jié)構(gòu)
1String
2List set sortedSet
3hash
4.bitmap(bite位,可以用于實(shí)現(xiàn)類似布隆過濾器)
5.pubsub(發(fā)布訂閱)
6.Stream(類似的消息隊(duì)列)
以上數(shù)據(jù)結(jié)構(gòu)有著豐富的使用場景,需要結(jié)合業(yè)務(wù)需求;

6、
redis 集群的節(jié)點(diǎn)的分片,支持動(dòng)態(tài)的reshard,可以為某個(gè)分片節(jié)點(diǎn)重新分片多個(gè)shot(hash槽)

7.redis
本身提供多個(gè)監(jiān)控命令,很多監(jiān)控工具也是局域redis的監(jiān)控命令
類似于 info ,moniter,hotkey...拿到集群的狀態(tài)信息;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容