- 重學(xué)Java設(shè)計(jì)模式
- 付政委(小付哥)
- 1135字
- 2021-05-19 18:09:57
5.3 緩存集群升級(jí)場(chǎng)景
很多初創(chuàng)團(tuán)隊(duì)的蠻荒期,并沒(méi)有完整的底層服務(wù)。
團(tuán)隊(duì)在初建時(shí)業(yè)務(wù)體量不大,在預(yù)估的系統(tǒng)服務(wù) QPS 較低、系統(tǒng)壓力較小、并發(fā)訪(fǎng)問(wèn)量少、近一年沒(méi)有大動(dòng)作等條件下,結(jié)合快速起步、時(shí)間緊迫、成本投入的因素,并不會(huì)投入特別多的研發(fā)資源構(gòu)建出非常完善的系統(tǒng)架構(gòu)。如圖5-3所示,就像對(duì)Redis的使用,可能最開(kāi)始只需要一個(gè)單機(jī)就可以滿(mǎn)足現(xiàn)狀。但隨著業(yè)務(wù)超預(yù)期的快速發(fā)展,系統(tǒng)的負(fù)載能力也要隨之跟上,原有的單機(jī)Redis已經(jīng)無(wú)法滿(mǎn)足系統(tǒng)的需要。這時(shí)就需要建設(shè)或者更換更為健壯的Redis集群服務(wù),在這個(gè)升級(jí)的過(guò)程中是不能停系統(tǒng)的,并且需要平滑過(guò)渡。

圖5-3
隨著系統(tǒng)的升級(jí),可以預(yù)見(jiàn)的問(wèn)題有如下幾種:
·很多服務(wù)用到了Redis,需要一起升級(jí)到集群。
·需要兼容集群A和集群B,便于后續(xù)的災(zāi)備,并及時(shí)切換集群。
·兩套集群提供的接口和方法各有差異,需要進(jìn)行適配。
·不能影響目前正常運(yùn)行的系統(tǒng)。
雖然升級(jí)是必須要做的,但怎樣執(zhí)行卻顯得非常重要。
5.3.1 場(chǎng)景模擬工程

在以上的場(chǎng)景模擬工程中,包括了如下信息。
·在業(yè)務(wù)初期,單機(jī)Redis服務(wù)工具類(lèi)RedisUtils主要負(fù)責(zé)的是提供早期 Redis的使用。
·在業(yè)務(wù)初期,單機(jī) Redis 服務(wù)功能類(lèi) CacheService 接口以及它對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)CacheServiceImpl。
·隨著后續(xù)業(yè)務(wù)的發(fā)展,新增加兩套R(shí)edis集群EGM、IIR,作為互備使用。
接下來(lái)分別介紹三個(gè)Redis服務(wù)提供的緩存功能,以及初期的使用方法。同時(shí)需要注意這三套R(shí)edis服務(wù)在使用上會(huì)有一些不同,包括:接口的名稱(chēng)、入?yún)⒌男畔ⅲ@些也是在使用設(shè)計(jì)模式時(shí)需要優(yōu)化處理的要點(diǎn)。
5.3.2 Redis單機(jī)服務(wù)RedisUtils


首先需要注意一點(diǎn),我們是使用Map模擬Redis的相關(guān)功能,這樣比較方便測(cè)試。這里把關(guān)注點(diǎn)放在架構(gòu)設(shè)計(jì)上。
5.3.3 Redis集群服務(wù)EGM

這里模擬第一個(gè)Redis集群服務(wù),需要注意觀察這里的方法名稱(chēng)及入?yún)⑿畔ⅲc使用單體Redis服務(wù)時(shí)是不同的。有點(diǎn)像A用mac系統(tǒng),B用Windows系統(tǒng),雖然可以做一樣的事,但操作方法不同。
5.3.4 Redis集群服務(wù)IIR

這是另一套R(shí)edis集群服務(wù),有時(shí)在企業(yè)開(kāi)發(fā)中可能有兩套服務(wù)做互相備份。這里也是為了模擬,所以添加兩套實(shí)現(xiàn)同樣功能的不同服務(wù),主要體現(xiàn)抽象工廠(chǎng)模式在這里發(fā)揮的作用。
綜上可以看到,目前的系統(tǒng)中已經(jīng)在大量地使用Redis服務(wù),但是因?yàn)橄到y(tǒng)不能滿(mǎn)足業(yè)務(wù)的快速發(fā)展,因此需要遷移到集群服務(wù)中。而這時(shí)有兩套集群服務(wù)需要兼容使用,又要滿(mǎn)足所有的業(yè)務(wù)系統(tǒng)改造且不能影響線(xiàn)上使用。
5.3.5 模擬早期單體Redis使用
接下來(lái)介紹在模擬的案例中,對(duì)單體Redis服務(wù)的使用方式。后續(xù)會(huì)通過(guò)兩種方式將這部分代碼擴(kuò)展為使用Redis集群服務(wù)。
1.定義Redis使用接口

2.實(shí)現(xiàn)Redis使用接口

目前,Redis使用的代碼比較簡(jiǎn)單,在一些體量不大的業(yè)務(wù)場(chǎng)景中不會(huì)有什么問(wèn)題。但如果體量增加,改造升級(jí)的過(guò)程就會(huì)比較麻煩。因?yàn)榇藭r(shí)所有的業(yè)務(wù)系統(tǒng)都有同樣的使用方式,所以如果每一個(gè)系統(tǒng)都需要通過(guò)硬編碼的方式進(jìn)行改造就不那么容易了。此時(shí),可以先思考怎樣從單體Redis的使用升級(jí)到 Redis 集群的使用。
- Visual C++程序設(shè)計(jì)教程
- Google Flutter Mobile Development Quick Start Guide
- Java應(yīng)用與實(shí)戰(zhàn)
- Java系統(tǒng)分析與架構(gòu)設(shè)計(jì)
- Learn to Create WordPress Themes by Building 5 Projects
- WSO2 Developer’s Guide
- 劍指MySQL:架構(gòu)、調(diào)優(yōu)與運(yùn)維
- PLC應(yīng)用技術(shù)(三菱FX2N系列)
- Visual Foxpro 9.0數(shù)據(jù)庫(kù)程序設(shè)計(jì)教程
- Spring Boot+MVC實(shí)戰(zhàn)指南
- Qlik Sense? Cookbook
- C語(yǔ)言程序設(shè)計(jì)
- C語(yǔ)言程序設(shè)計(jì)
- 創(chuàng)新工場(chǎng)講AI課:從知識(shí)到實(shí)踐
- Java面向?qū)ο蟪绦蛟O(shè)計(jì)教程