在分布式和微服務(wù)等架構(gòu)遍地開花的實(shí)踐中,Redis始終作為分布式緩存的首選,可謂經(jīng)久不衰、獨(dú)樹一幟。Redis基于內(nèi)存運(yùn)行并支持持久化的NoSQL數(shù)據(jù)庫,是當(dāng)前最熱門的NoSql數(shù)據(jù)庫之一,也被人們稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器。
而為何要使用Redis呢?Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。Redis支持master-slave(主-從)模式應(yīng)用。Redis支持?jǐn)?shù)據(jù)持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。Redis單個(gè)value的最大限制是1GB,memcached只能保存1MB的數(shù)據(jù)。基于種種原因,Redis成為我們緩存架構(gòu)的首選,而我在開啟碼農(nóng)生涯時(shí),就接觸到Redis,只是當(dāng)時(shí)的使用比較簡單。
最開始時(shí),因互聯(lián)網(wǎng)化團(tuán)隊(duì)初建,各種所需要的中間件都需要自己搭建,包含Redis,而我們使用Docker搭建Redis集群,采用主從的Redis架構(gòu),再使用Sentinel(哨兵)模式來監(jiān)控該Redis集群,使用也是通過Sentinel來使用。通過Spring或SpringBoot的哨兵連接方式連接Redis,注冊(cè)成Bean,然后使用序列化的Key-Value結(jié)構(gòu)來緩存所需要的數(shù)據(jù)。而因領(lǐng)導(dǎo)的風(fēng)格原因,我們也僅僅被允許采用Key-Value的基礎(chǔ)功能來進(jìn)行Redis操作。至于其中的原因,也沒有深究。
而隨后,跳槽到現(xiàn)公司,其將Redis作為基礎(chǔ)服務(wù)進(jìn)行封裝,而業(yè)務(wù)團(tuán)隊(duì)僅通過加密串即可進(jìn)行直接連接,其背后的可高用、主從分片、災(zāi)備等均由基礎(chǔ)架構(gòu)團(tuán)隊(duì)負(fù)責(zé)?;A(chǔ)架構(gòu)團(tuán)隊(duì)提供的操作方式,就不僅僅限于使用Key-Value的get、set、delete等方法,而幾乎完全提供了Redis的所有命令,包含inc、sadd等計(jì)數(shù)、集合操作。當(dāng)然,有了這些,對(duì)程序員的要求更高,要在合適的場景中選擇恰當(dāng)?shù)拿钸M(jìn)行操作,也不是一件容易的事。
或許,使用Redis有這樣那樣的原因,但在我看來,最重要的就兩條:其一,它能提高用戶的訪問速度,大量的降低系統(tǒng)響應(yīng)的TP99;其二,它是主流,大家都在用,而且經(jīng)過了時(shí)間的檢驗(yàn),抗住了一個(gè)又一個(gè)電商大促的業(yè)務(wù)場景。