分布式緩存redis使用及說明
1 redis單機(jī)(單節(jié)點(diǎn))部署缺點(diǎn)
(1)數(shù)據(jù)丟失問題:redis是內(nèi)存存儲(chǔ),服務(wù)重啟可能會(huì)丟失數(shù)據(jù)
(2)并發(fā)能力問題:redis單節(jié)點(diǎn)(單機(jī))部署在并發(fā)量不大的話,也是可以滿足要求的,并發(fā)量最多幾萬,無法承受更高的并發(fā)。
(3)故障恢復(fù)問題:如果redis單節(jié)點(diǎn)故障中斷,那么會(huì)影響應(yīng)用的使用。
(4)存儲(chǔ)能力問題:內(nèi)存存儲(chǔ)無法和磁盤存儲(chǔ)做比較,不能滿足海量數(shù)據(jù)的要求。
2 redis(是單線程的)集群(分布式緩存redis)
2.1 解決redis單機(jī)部署的缺點(diǎn)
(1)解決數(shù)據(jù)丟失問題:redis的持久化RDB和AOF
(2)解決并發(fā)能力問題:搭建redis主從集群,實(shí)現(xiàn)讀寫分離
(3)解決故障恢復(fù)問題:搭建redis哨兵,實(shí)現(xiàn)健康監(jiān)測(cè)和自動(dòng)恢復(fù)
(4)存儲(chǔ)能力問題:搭建redis分片集群
2.2 redis的RDB和AOF持久化
1 RDB(redis database backup)
將內(nèi)存中的數(shù)據(jù)都記錄到磁盤中,重啟后,可讀RDB(快照)文件進(jìn)行數(shù)據(jù)恢復(fù)??煺瘴募恢茫耗J(rèn)保存在redis運(yùn)行命令執(zhí)行的目錄下。
redis客戶端命令:
redis-cli
>save命令:
執(zhí)行一次RDB操作,主進(jìn)程來執(zhí)行RDB,會(huì)阻塞進(jìn)程。
>bgsave命令:
后臺(tái)啟動(dòng),(fork主進(jìn)程得到子進(jìn)程)子進(jìn)程執(zhí)行RDB,避免主進(jìn)程受影響。
特殊:如果redis是自己手動(dòng)停止的,redis停機(jī)時(shí)會(huì)執(zhí)行一次RDB
2 RDB的fork原理

Bgsave開始時(shí)會(huì)fork主進(jìn)程得到子進(jìn)程,子進(jìn)程共享主進(jìn)程的內(nèi)存數(shù)據(jù),完成fork后讀取內(nèi)存數(shù)據(jù)并寫入RDB文件。主進(jìn)程執(zhí)行fork時(shí),也是阻塞的,只能用來執(zhí)行fork。
fork就是復(fù)制頁表(linux的進(jìn)程和物理內(nèi)存(內(nèi)存條)之間映射的虛擬內(nèi)存),Linux中進(jìn)程不能直接操作物理內(nèi)存(內(nèi)存條) 需要在中間借助一個(gè)虛擬內(nèi)存來映射操作物理內(nèi)存。
fork操作的范圍:
不包括:子進(jìn)程寫新的RDB文件(替換舊的RDB文件)的過程,fork操作只會(huì)復(fù)制頁表(就是進(jìn)程和物理內(nèi)存的映射關(guān)系表) 生成1個(gè)子進(jìn)程。
思考:
- 如果在fork完一個(gè)子進(jìn)程后,子進(jìn)程生成RDB文件過程中,有請(qǐng)求來修改(寫)操作,那么會(huì)操作哪一部分?
- 當(dāng)主進(jìn)程執(zhí)行讀操作時(shí),訪問共享內(nèi)存。
- 當(dāng)主進(jìn)程執(zhí)行寫操作時(shí),則會(huì)拷貝一份數(shù)據(jù),執(zhí)行寫操作,(只能寫這個(gè)拷貝的副本數(shù)據(jù))。后續(xù)的讀請(qǐng)求就會(huì)訪問這個(gè)副本數(shù)據(jù)。
RDB的缺點(diǎn)
RDB執(zhí)行時(shí)間(間隔)長,2次RDB之間寫入數(shù)據(jù)有丟失風(fēng)險(xiǎn)。 如果執(zhí)行間隔短的話(2-3秒一次),那么太耗性能。
AOF持久化
append only file 追加文件
1 介紹
為了彌補(bǔ)RDB的缺點(diǎn),redis處理的每一個(gè)寫命令都會(huì)記錄在AOF文件中(RDB是每次都重新讀全部?jī)?nèi)存數(shù)據(jù)),可以看過是命令日志文件。
2 AOF文件體積大的處理方法(將AOF文件中的命令進(jìn)行重寫,相當(dāng)于將重復(fù)命令合成一個(gè)(多個(gè)set同一個(gè)key 可合為1個(gè)最后的key操作命令))
(1)手動(dòng)
redis-cli連接redis客戶端,執(zhí)行bgrewirterof命令,用最少的命令達(dá)到相同的效果。

(2)自動(dòng)(在配置文件中添加)
redis也會(huì)在觸發(fā)閾值時(shí)自動(dòng)重寫AOF文件,可在redis.conf文件中配置
RDB和AOF持久化的比較

對(duì)數(shù)據(jù)安全性比較高并且數(shù)據(jù)完整的話:推薦AOF持久化
宕機(jī)回復(fù)速度要求高的話:推薦RDB持久化
2.3 redis主從集群,實(shí)現(xiàn)讀寫分離(解決并發(fā)能力問題)
由于redis大多都是讀多寫少,所以不做成傳統(tǒng)的集群。單節(jié)點(diǎn)的redis的并發(fā)能力是有上限的,要進(jìn)一步提高redis的并發(fā)能力,需要搭建主從集群,實(shí)現(xiàn)讀寫分離。至少需要3個(gè)節(jié)點(diǎn),一主兩從,讀操作找從節(jié)點(diǎn)進(jìn)行讀取,寫操作找主節(jié)點(diǎn)進(jìn)行寫操作。
另外,主節(jié)點(diǎn)master會(huì)向兩臺(tái)slave/replica從節(jié)點(diǎn)中同步數(shù)據(jù)??梢越鉀Q高并發(fā)讀(因?yàn)橛卸鄠€(gè)slave節(jié)點(diǎn))和高可用性(主從集群的哨兵模式)的問題,但是redis主從集群解決不了高并發(fā)寫(因?yàn)橹挥幸粋€(gè)master)和存儲(chǔ)海量數(shù)據(jù)(整體的存儲(chǔ)數(shù)據(jù)量取決于一個(gè)redis節(jié)點(diǎn)的master的容量,每個(gè)節(jié)點(diǎn)數(shù)據(jù)保持和master節(jié)點(diǎn)數(shù)據(jù)一致)的問題。

搭建主從集群
1 在3臺(tái)機(jī)器上分別安裝3個(gè)redis
編輯每個(gè)redis的redis.conf文件
# redis實(shí)例的聲明ip redis-announce-ip 所在主機(jī)的ip
2 配置主從關(guān)系
前提:3個(gè)redis實(shí)例還沒有關(guān)系
(1)臨時(shí)模式(使用命令配置主從,但重啟redis后失效)
redis5.0之前可使用slaveof命令,redis5.0之后新增replicaof命令(和slaveof命令效果一致)
使用redis-cli 客戶端連接到redis服務(wù),執(zhí)行slaveof命令
slaveof 主節(jié)點(diǎn)的ip 主節(jié)點(diǎn)的端口號(hào)
效果:在哪臺(tái)redis客戶端命令/配置文件中 添加上slaveof,那么這臺(tái)redis就會(huì)成為指定的主節(jié)點(diǎn)的從節(jié)點(diǎn)。
(2)永久模式–修改配置文件
在redis.conf文件中添加一行配置:
slaveof 主節(jié)點(diǎn)的ip 主節(jié)點(diǎn)的端口號(hào)
在某一臺(tái)redis中查看節(jié)點(diǎn)信息:
info replication

主從數(shù)據(jù)同步原理
建立連接時(shí)的第一次同步 是全量同步

(1)2個(gè)重要概念
- Replication id:簡(jiǎn)稱replid,是數(shù)據(jù)集的標(biāo)記,id一致則說明是同一數(shù)據(jù)集。每一個(gè)master都有唯一的replid,slave會(huì)繼承master節(jié)點(diǎn)的replid。
- offset:偏移量,隨著記錄在repl_baklog中的數(shù)據(jù)增多而逐漸增大。
master節(jié)點(diǎn)判斷某個(gè)從節(jié)點(diǎn)是否第一次同步:
每個(gè)redis節(jié)點(diǎn)都有自己replication id,每個(gè)redis從節(jié)點(diǎn)都有自己的replication id和相對(duì)于主節(jié)點(diǎn)的偏移量offset。
連接redis
bin/redis-cli # 在bin目錄下 連接 redis-cli
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
windows下使用redis requirepass認(rèn)證不起作用的解決方法
今天小編就為大家分享一篇windows下使用redis requirepass認(rèn)證不起作用的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Redis連接失?。嚎蛻舳薎P不在白名單中的問題分析與解決方案
在現(xiàn)代分布式系統(tǒng)中,Redis作為一種高性能的內(nèi)存數(shù)據(jù)庫,被廣泛應(yīng)用于緩存、消息隊(duì)列、會(huì)話存儲(chǔ)等場(chǎng)景,然而,在實(shí)際使用過程中,我們可能會(huì)遇到各種連接問題,其中“客戶端IP不在白名單中”是一個(gè)常見的錯(cuò)誤,本文將從錯(cuò)誤分析、原因排查、解決方案等詳細(xì)探討如何解決這一問題2025-01-01
redis實(shí)現(xiàn)分布式session的解決方案
session存放在服務(wù)器,關(guān)閉瀏覽器不會(huì)失效,本文主要介紹了redis實(shí)現(xiàn)分布式session的解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)Dict的實(shí)現(xiàn)方法
這篇文章主要介紹了Redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)Dict的實(shí)現(xiàn)方法,本篇文章所述的dict在Redis中最主要的作用就是用于維護(hù)Redis數(shù)據(jù)庫中所有Key、value映射的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2022-05-05

