一、發(fā)布與訂閱
訂閱者(subscribe)-------> 發(fā)布者(publish) <----訂閱者(subscribe)
發(fā)布:
PUBLISH chan(通道)
示例:
PUBLISH foot duck
訂閱:
SUBSCRIBE chan(通道)
示例:
SUBSCRIBE foot
批量訂閱:
PSUBSCRIBE chan(通道,可以使用通配符:*)
示例:
PSUBSCRIBE foot*
雖然REDIS可以做類似MQ的事情,但是不建議使用。
二、redis的持久化處理
redis的持久化處理有以下兩種模式:
RDB
RDB:每隔一段時(shí)間,把內(nèi)存中的數(shù)據(jù)寫(xiě)入磁盤的臨時(shí)文件,作為快照,回復(fù)的時(shí)候把快照文件讀進(jìn)內(nèi)存。如果宕機(jī)重啟,那么內(nèi)存里的數(shù)據(jù)肯定會(huì)沒(méi)有的,那么再次啟動(dòng)redis后,則會(huì)恢復(fù)。默認(rèn)模式。
優(yōu)勢(shì):
- 使用快照模式,每隔一段時(shí)間全量備份。備份的文件為一個(gè)單文件。
- 容災(zāi)簡(jiǎn)單,可遠(yuǎn)程傳輸。
- 子進(jìn)程備份的時(shí)候,主進(jìn)程不會(huì)有任何io操作(不會(huì)有寫(xiě)入修改或刪除),保證備份數(shù)據(jù)的完整。
缺點(diǎn):
- 發(fā)生故障時(shí),有可能會(huì)丟失最后一次的備份數(shù)據(jù)。
- 子進(jìn)程所占用的內(nèi)存比會(huì)和父進(jìn)程一模一樣,如會(huì)造成CPU負(fù)擔(dān)。
- 由于定時(shí)全量備份是重量級(jí)操作,所以對(duì)于實(shí)時(shí)備份,就無(wú)法處理了。
在redis.conf 中的配置
<!-- 保存時(shí)間 -->
<!-- 表示15分鐘內(nèi)至少發(fā)生過(guò)1次變動(dòng),則15分鐘后會(huì)進(jìn)行一次備份 -->
save 900 1
<!-- 表示5分鐘內(nèi)至少發(fā)生過(guò)10次變動(dòng),則5分鐘后會(huì)進(jìn)行一次備份 -->
save 300 10
<!-- 表示1分鐘內(nèi)至少發(fā)生過(guò)10000次變動(dòng),則1分鐘后會(huì)進(jìn)行一次備份 -->
save 60 10000
<!-- 備份過(guò)程中出現(xiàn)錯(cuò)誤則停止備份,默認(rèn)yes,為no時(shí)可能造成數(shù)據(jù)的不一致 -->
stop-writes-on-bgsave-error yes
<!-- 是否壓縮(LZF格式),如果想要降低CPU的損耗,可以設(shè)置為no,但是此時(shí)備份的數(shù)據(jù)會(huì)比較大 -->
rdbcompression yes
<!-- 校驗(yàn)數(shù)據(jù) -->
rdbchecksum yes
<!-- 備份的文件名 -->
dbfilename dump.rdb
<!-- 備份的文件路徑 -->
dir /usr/local/redis/working
AOF
全稱: APPEND ONLY MODEL
在redis.conf 中的配置
<!-- 默認(rèn)關(guān)閉 -->
appendonly yes
<!-- 備份文件名稱 -->
appendfilename "appendonly.aof"
<!-- 策略,有以下三種 -->
<!-- 針對(duì)每一次寫(xiě)入操作都會(huì)進(jìn)行備份 -->
# appendfsync always
<!-- 每一秒鐘進(jìn)行一次備份,默認(rèn) -->
appendfsync ererysec
<!-- 關(guān)閉 -->
#appendfsync no
<!-- 當(dāng)重寫(xiě)的時(shí)候不做同步,默認(rèn)為no -->
no-appendfsync-on-rewrite no
<!-- -->
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
可以同時(shí)使用兩種模式,默認(rèn)先加載的是AOF文件,如果AOF出現(xiàn)問(wèn)題,才會(huì)去加載RDB文件,這種做法也稱為冷熱備份。
三、主從架構(gòu)
主:master,只能有一個(gè),寫(xiě)處理。
從:slave,可以多個(gè),讀處理。在slave節(jié)點(diǎn)進(jìn)行寫(xiě)操作,會(huì)報(bào)錯(cuò)誤
主從就是讀寫(xiě)分離。水平擴(kuò)展,可以通過(guò)增加服務(wù)器以提升并發(fā)量。
數(shù)據(jù)同步的過(guò)程:
slave服務(wù)器第一次啟動(dòng)時(shí),會(huì)ping一次master服務(wù)器,master服務(wù)器會(huì)把RDB文件通過(guò)硬盤復(fù)制提交給slave服務(wù)器的硬盤,以用于數(shù)據(jù)的同步。
第一次之后,每當(dāng)master服務(wù)器接收到新的寫(xiě)操作時(shí),都會(huì)提交給slave服務(wù)器,以完成數(shù)據(jù)同步。
slave服務(wù)器重啟后,會(huì)加載RDB中保存的數(shù)據(jù),同時(shí)與master服務(wù)器缺失的數(shù)據(jù),master服務(wù)器會(huì)同步給slave。
注意:必須開(kāi)通master服務(wù)器的持久化機(jī)制。否則,master服務(wù)器重啟,會(huì)刪除所有slave服務(wù)器的數(shù)據(jù)。
主從配置:
<!-- 進(jìn)入到redis-cli,查詢節(jié)點(diǎn)信息 -->
info replication
<!-- 在redis.conf中搜索REPLICATION -->
<!-- masterip:主節(jié)點(diǎn)ip masterport:主節(jié)點(diǎn)端口 -->
replicaof <masterip> <masterport>
<!-- 設(shè)置主節(jié)點(diǎn)的密碼 -->
masterauth <master-password>
<!-- 默認(rèn)配置,表示從節(jié)點(diǎn)是只讀的,不處理寫(xiě)操作 -->
replica-read-only yes
無(wú)磁盤化復(fù)制
如果磁盤是機(jī)械硬盤,那么主從磁盤復(fù)制的效率會(huì)比較低,那么此時(shí)就可以使用無(wú)磁盤華復(fù)制的方式。
目前無(wú)磁盤化復(fù)制,使用的是socket方式,但是是處于試驗(yàn)階段,不建議在生產(chǎn)環(huán)境中使用。
<!-- 在redis.conf中搜索diskless -->
<!-- 無(wú)磁盤化復(fù)制的開(kāi)關(guān),默認(rèn)關(guān)閉 -->
repl-diskless-sync no
<!-- 無(wú)磁盤化復(fù)制的等待時(shí)間,默認(rèn)5秒 -->
repl-diskless-sync-delay 5