大家好,我是哪吒。
專欄導讀
2023年再不會Redis,就要被淘汰了
圖解Redis,談談Redis的持久化,RDB快照與AOF日志
Redis單線程還是多線程?IO多路復用原理
Redis集群的最大槽數為什么是16384個?
Redis緩存穿透、擊穿、雪崩到底是個啥?7張圖告訴你
Redis分布式鎖的實現方式
Redis分布式緩存、秒殺
一、Redis主從架構
單節(jié)點Redis的并發(fā)能力是有上限的,要進一步提高Redis的并發(fā)能力,就需要搭建主從集群,實現讀寫分離。
二、數據同步原理
master如何判斷slave是不是第一次來同步數據?這里會用到兩個很重要的概念:
1、Replication Id:簡稱replid,是數據集的標記,id一致則說明是同一數據集。每一個master都有唯一的replid,slave則會繼承master節(jié)點的replid
2、offset:偏移量,隨著記錄在repl_baklog中的數據增多而逐漸增大。slave完成同步時也會記錄當前同步的offset。如果slave的offset小于master的offset,說明slave數據落后于master,需要更新。
因此slave做數據同步,必須向master聲明自己的replication id 和offset,master才可以判斷到底需要同步哪些數據。
三、全量同步的流程
- slave節(jié)點請求增量同步;
- master節(jié)點判斷replid,發(fā)現不一致,拒絕增量同步;
- master將完整內存數據生成RDB,發(fā)送RDB到slave;
- slave清空本地數據,加載master的RDB;
- master將RDB期間的命令記錄在repl_baklog,并持續(xù)將log中的命令發(fā)送給slave;
- slave執(zhí)行接收到的命令,保持與master之間的同步;
三、可以從以下幾個方面來優(yōu)化Redis主從就集群
- 在master中配置repl-diskless-sync yes啟用無磁盤復制,避免全量同步時的磁盤IO;
- Redis單節(jié)點上的內存占用不要太大,減少RDB導致的過多磁盤IO;
- 適當提高repl_baklog的大小,發(fā)現slave宕機時盡快實現故障恢復,盡可能避免全量同步;
- 限制一個master上的slave節(jié)點數量,如果實在是太多slave,則可以采用主-從-從鏈式結構,減少master壓力
四、全量同步和增量同步區(qū)別?
全量同步:master將完整內存數據生成RDB,發(fā)送RDB到slave。后續(xù)命令則記錄在repl_baklog,逐個發(fā)送給slave;
增量同步:slave提交自己的offset到master,master獲取repl_baklog中從offset之后的命令給slave;
五、什么時候執(zhí)行全量同步?
slave節(jié)點第一次連接master節(jié)點時;
slave節(jié)點斷開時間太久,repl_baklog中的offset已經被覆蓋時;
六、什么時候執(zhí)行增量同步?
slave節(jié)點斷開又恢復,并且在repl_baklog中能找到offset時。
七、超賣問題
線程交替執(zhí)行,線程1【查詢庫存 -> 1】,
在進行庫存扣減前,
線程2執(zhí)行【查詢庫存 -> 1】,
線程2執(zhí)行【扣減庫存】,產生超賣問題?。。?/p>
??本文收錄于,Java基礎教程系列。
目前已經700+訂閱,CSDN最強Java專欄,包含全部Java基礎知識點、Java8新特性、Java集合、Java多線程、Java代碼實例,理論結合實戰(zhàn),實現Java的輕松學習。文章來源:http://www.zghlxwxcb.cn/news/detail-468877.html
??哪吒多年工作總結:Java學習路線總結,搬磚工逆襲Java架構師。文章來源地址http://www.zghlxwxcb.cn/news/detail-468877.html
到了這里,關于Redis主從架構、數據同步原理、全量同步、增量同步的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!