Redis
數(shù)據(jù)存放在內(nèi)存中,需要配置持久化將數(shù)據(jù)保存在磁盤上,redis提供兩種方式進(jìn)行持久化:
1、RDB持久化(原理是將Reids在內(nèi)存中的數(shù)據(jù)庫記錄定時dump到磁盤上的RDB持久化)
在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,實(shí)際操作過程是fork一個子進(jìn)程(fork通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進(jìn)程幾乎完全相同的進(jìn)程)先將數(shù)據(jù)集寫入臨時文件,寫入成功后,再替換之前的文件,用二進(jìn)制壓縮存儲。
2、AOF(append only file)持久化(原理是將Reids的操作日志以追加的方式寫入文件)
以日志的形式記錄服務(wù)器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文本的方式記錄,可以打開文件看到詳細(xì)的操作記錄。
數(shù)據(jù)類型
1、string? 二進(jìn)制安全的字符串? 最大512M
2、list? 按照添加順序保持順序的字符串列表
3、set? 無序的字符串集合,不存在重復(fù)元素
4、sort_set? 已排序的字符串集合
5、hash? key-value
6、bitmap?
7、hyperloglog? 基于概率的數(shù)據(jù)結(jié)構(gòu)
緩存雪崩:
在某一個時間段,緩存集中過期失效。
事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。
事中:本地 ehcache 緩存 + hystrix 限流&降級,避免 MySQL 被打死。
事后:redis 持久化,一旦重啟,自動從磁盤上加載數(shù)據(jù),快速恢復(fù)緩存數(shù)據(jù)。
緩存穿透:
是指查詢一個數(shù)據(jù)庫一定不存在的數(shù)據(jù)。
從數(shù)據(jù)庫中只要沒查到,就寫一個空值到緩存里去。
然后設(shè)置一個過期時間,下次有相同的 key 來訪問的時候,在緩存失效之前,都可以直接從緩存中取數(shù)據(jù)。
緩存擊穿:
是指一個key非常熱點(diǎn),在不停的扛著大并發(fā),大并發(fā)集中對這一個點(diǎn)進(jìn)行訪問,
當(dāng)這個key在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存,直接請求數(shù)據(jù)庫,就像在一個屏障上鑿開了一個洞。
將熱點(diǎn)數(shù)據(jù)設(shè)置為永遠(yuǎn)不過期;或者基于 redis or zookeeper 實(shí)現(xiàn)互斥鎖,
等待第一個請求構(gòu)建完緩存之后,再釋放鎖,進(jìn)而其它請求才能通過該 key 訪問數(shù)據(jù)。
服務(wù)限流其實(shí)是指當(dāng)系統(tǒng)資源不夠,不足以應(yīng)對大量請求,即系統(tǒng)資源與訪問量出現(xiàn)矛盾的時候,
為了保證有限的資源能夠正常服務(wù),因此對系統(tǒng)按照預(yù)設(shè)的規(guī)則進(jìn)行流量限制或功能限制的一種方法。
熔斷:
系統(tǒng)出現(xiàn)問題時,如果短時間內(nèi)無法修復(fù),系統(tǒng)要自動做出判斷,開啟熔斷開關(guān),拒絕流量訪問,
避免大流量對后端的過載請求。系統(tǒng)也應(yīng)該能夠動態(tài)監(jiān)測后端程序的修復(fù)情況,
當(dāng)程序已恢復(fù)穩(wěn)定時,可以關(guān)閉熔斷開關(guān),恢復(fù)正常服務(wù)。
計數(shù)器方法:系統(tǒng)維護(hù)一個計數(shù)器,來一個請求就加1,請求處理完成就減1,當(dāng)計數(shù)器大于指定的閾值(也可以動態(tài)閾值),就拒絕新的請求。
隊列方法:基于FIFO隊列,所有請求都進(jìn)入隊列,后端程序從隊列中取出待處理的請求依次處理。(可以設(shè)置多個隊列以配置不同的優(yōu)先級)
令牌桶方法:基于一個隊列,請求放到隊列里面。但除了隊列以外,還要設(shè)置一個令牌桶,另外有一個腳本以持續(xù)恒定的速度往令牌桶里面放令牌,
后端處理程序每處理一個請求就必須從桶里拿出一個令牌,如果令牌拿完了,那就不能處理請求了
服務(wù)降級:
將系統(tǒng)的所有功能服務(wù)進(jìn)行一個分級,當(dāng)系統(tǒng)出現(xiàn)問題,需要緊急限流時,
可將不是那么重要的功能進(jìn)行降級處理,停止服務(wù),這樣可以釋放出更多的資源供給核心功能的去用
Redis 主從架構(gòu)
單機(jī)的 redis,能夠承載的 QPS 大概就在上萬到幾萬不等。對于緩存來說,一般都是用來支撐讀高并發(fā)的。
因此架構(gòu)做成主從(master-slave)架構(gòu),一主多從,主負(fù)責(zé)寫,并且將數(shù)據(jù)復(fù)制到其它的 slave 節(jié)點(diǎn),從節(jié)點(diǎn)負(fù)責(zé)讀。
所有的讀請求全部走從節(jié)點(diǎn)。這樣也可以很輕松實(shí)現(xiàn)水平擴(kuò)容,支撐讀高并發(fā)。
redis replication -> 主從架構(gòu) -> 讀寫分離 -> 水平擴(kuò)容支撐讀高并發(fā):
redis 采用異步方式復(fù)制數(shù)據(jù)到 slave 節(jié)點(diǎn),一個 master node 是可以配置多個 slave node,建議必須開啟 master node 的持久化.
當(dāng)啟動一個 slave node 的時候,它會發(fā)送一個 PSYNC 命令給 master node。
redis主從復(fù)制
如果這是 slave node 初次連接到 master node,那么會觸發(fā)一次 full resynchronization 全量復(fù)制。
此時 master 會啟動一個后臺線程,開始生成一份 RDB 快照文件,
同時還會將從客戶端 client 新收到的所有寫命令緩存在內(nèi)存中。
RDB 文件生成完畢后, master 會將這個 RDB 發(fā)送給 slave,slave 會先寫入本地磁盤,
然后再從本地磁盤加載到內(nèi)存中,接著 master 會將內(nèi)存中緩存的寫命令發(fā)送到 slave,slave 也會同步這些數(shù)據(jù)。