1. 什么是redis
特點(diǎn)
- 高性能
- 單線程
- 內(nèi)存
- 支持持久化
- nosql
作用
- 緩存
- 分布式鎖
- 分布式唯一鍵
- 隊(duì)列
- 會(huì)話
redis配置文件
- demonize 是否有守護(hù)進(jìn)程方式啟動(dòng)
- bind redis允許哪個(gè)ip可以連接
- protested-mode 保護(hù)模式,默認(rèn)啟動(dòng);生效條件:
①?zèng)]有配置bind
②redis沒有設(shè)置密碼
2. redis五大數(shù)據(jù)類型
2.1 string
2.1.1 通用操作
- set key value
- get key
- del key
- append key value
如果key存在湃鹊,則在value末尾添加;否則同set - strlen key
返回value長度 - mset k1 v1 k2 v2
- mget k1 k2
- setnx key value
key存在則不set,key不存在則set key value
2.1.2 value為數(shù)字類型時(shí)
- incr key
- decr key
2.2 list
有序鏈表奥吩,可以用于實(shí)現(xiàn)隊(duì)列册养,棧等數(shù)據(jù)結(jié)構(gòu)
2.3 set
無序集合傲绣,可以用作微博掠哥、微信等關(guān)注模型。通過集合的交集實(shí)現(xiàn)共同關(guān)注秃诵、通過差集實(shí)現(xiàn)推薦可能認(rèn)識(shí)的人
2.4 zset
有序集合(使用分?jǐn)?shù)排序)
微博熱搜等
2.5 hash
存儲(chǔ)對象
3. redis持久化
3.1 RDB(默認(rèn)方式)
原理
redis會(huì)fork一個(gè)與主進(jìn)程完全一致的進(jìn)程(變量续搀,環(huán)境變量,程序計(jì)數(shù)器)顷链,先將數(shù)據(jù)寫入一個(gè)臨時(shí)文件中目代,待持久化完成之后屈梁,使用該臨時(shí)文件替換原先的持久化文件。整個(gè)持久化過程榛了,不會(huì)影響到主進(jìn)程
文件配置
dir 文件目錄
dbfilename 文件名字
觸發(fā)機(jī)制
- shutdown時(shí)在讶,如果沒有aof,會(huì)觸發(fā)
- 配置文件中有配置默認(rèn)快照策略時(shí)
e.g. save 1000 1 1000秒有一次寫操作霜大,則執(zhí)行快照操作 - 手動(dòng)執(zhí)行save或bgsave時(shí)
save:已主進(jìn)程方式進(jìn)行持久化构哺,所有線程阻塞
bgsave:fork一個(gè)子進(jìn)程來負(fù)責(zé)持久化操作,阻塞只會(huì)發(fā)生在 fork子進(jìn)程的時(shí)候 -
flushall 無意義
bgsave.png
#文件目錄
dir ./
#文件名稱
dbfilename rdb.dump
# 快照策略
save 900 1
save 300 10
save 60 10000
save VS bgsave
save | bgsave | |
---|---|---|
IO類型 | 同步 | 同步 |
是否阻塞其他操作 | 是 | 否 |
優(yōu)點(diǎn) | 不消化額外內(nèi)存 | 不阻塞redis其他命令 |
缺點(diǎn) | 阻塞其他命令 | fork子進(jìn)程战坤,消息內(nèi)存 |
3.2 AOF
原理
將redis的所有寫操作命令曙强,以append的方式追加到文件中
文件配置
dir 文件目錄
appendfilename aof文件名
appendonly 是否開啟aof,默認(rèn)關(guān)閉
appendsync 默認(rèn)觸發(fā)機(jī)制
觸發(fā)機(jī)制
no:操作系統(tǒng)進(jìn)行數(shù)據(jù)數(shù)據(jù)緩存到磁盤(快途茫,持久化沒有保證)
always:同步持久化碟嘴,每次數(shù)據(jù)變更時(shí),都會(huì)持久化到磁盤(慢囊卜,安全)
eveerysec:每秒同步一次(默認(rèn)值娜扇,很快,但可能失去1s以內(nèi)的數(shù)據(jù))
aof文件重寫
1.原因:當(dāng)aof文件達(dá)到一定大小(配置項(xiàng))時(shí)栅组,redis會(huì)調(diào)用bgrewriteaof命令對aof文件進(jìn)行重寫雀瓢,減少文件大小
- 2.重寫方式:跟當(dāng)前內(nèi)存中的數(shù)據(jù)生成對應(yīng)命令,并不需要讀取老的aof文件玉掸、命令整合
2.配置項(xiàng)
- auto-aof-rewrite-percentage 100
aof文件增長率超過原始的100%時(shí)刃麸,自動(dòng)重寫aof - auto-aof-rewrite-min-size 64mb
aof文件大小大于該配置時(shí),自動(dòng)重寫aof
對于上圖有四個(gè)關(guān)鍵點(diǎn)補(bǔ)充一下:
在重寫期間司浪,由于主進(jìn)程依然在響應(yīng)命令泊业,為了保證最終備份的完整性;因此它依然會(huì)寫入舊的AOF file中断傲,如果重寫失敗脱吱,能夠保證數(shù)據(jù)不丟失智政。
為了把重寫期間響應(yīng)的寫入信息也寫入到新的文件中认罩,因此也會(huì)為子進(jìn)程保留一個(gè)buf,防止新寫的file丟失數(shù)據(jù)续捂。
重寫是直接把當(dāng)前內(nèi)存的數(shù)據(jù)生成對應(yīng)命令垦垂,并不需要讀取老的AOF文件進(jìn)行分析、命令合并牙瓢。
AOF文件直接采用的文本協(xié)議劫拗,主要是兼容性好、追加方便矾克、可讀性高可認(rèn)為修改修復(fù)页慷。
#文件目錄
dir ./ 當(dāng)前路徑
#文件名稱
appendfilename "appendonly.aof"
#aof重寫期間是否同步
no-appendfsync-on-rewrite no
# 重寫觸發(fā)配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 文件重寫策略
aof-rewrite-incremental-fsync yes
RDB vs AOF
對比項(xiàng) | RDB | AOF |
---|---|---|
啟動(dòng)優(yōu)先級(jí) | 低 | 高 |
文件大小 | 小 | 大 |
恢復(fù)速度 | 快 | 慢 |
數(shù)據(jù)安全性 | 低 | 相對高,取決于寫入策略 |
3.3 混合方式
為了既能像RDB那樣快速恢復(fù),又能像AOF那樣少丟失數(shù)據(jù)酒繁,在redis4.0之后滓彰,支持混合方式持久化,需要開啟參數(shù)
# aof-use-rdb-preamble yes
在aof重寫時(shí)州袒,不再是單純地將內(nèi)存數(shù)據(jù)按照RESP格式寫入AOF文件揭绑,而且將重寫這一刻的內(nèi)存做RDB快照,并將增量數(shù)據(jù)按照RESP格式寫到AOF文件郎哭。重寫完成之前他匪,該文件并不叫appendonly.aof,重寫完成之后覆蓋原有的aof文件
4. redis主從同步
全量復(fù)制:
- 從節(jié)點(diǎn)配置好之后會(huì)發(fā)生sync夸研,去連接主節(jié)點(diǎn)
- 主節(jié)點(diǎn)執(zhí)行bgsave邦蜜,生產(chǎn)最新的rdb快照
- 主節(jié)點(diǎn)將RDB文件發(fā)送給從節(jié)點(diǎn)
- 從節(jié)點(diǎn)把收到的數(shù)據(jù)持久化,并加載到內(nèi)存中
-
在bgsave之后產(chǎn)生的增量數(shù)據(jù)亥至,主節(jié)點(diǎn)會(huì)緩存在內(nèi)存中畦徘,并將緩存中的數(shù)據(jù)發(fā)給從節(jié)點(diǎn)
全量復(fù)制.png
如果主從直之間因?yàn)槟撤N原因斷開連接,則從節(jié)點(diǎn)會(huì)再次請求連接主節(jié)點(diǎn)抬闯,在redis2.8版本之前井辆,會(huì)再次執(zhí)行全量復(fù)制,在2.8之后溶握,會(huì)執(zhí)行部分復(fù)制
主從復(fù)制之后杯缺,兩側(cè)數(shù)據(jù)會(huì)維持一個(gè)offset偏移量,當(dāng)主從斷開之后睡榆,從節(jié)點(diǎn)會(huì)再次請求連接主節(jié)點(diǎn)萍肆,請求同步時(shí),會(huì)帶上從節(jié)點(diǎn)已有數(shù)據(jù)的offfset胀屿,如果主節(jié)點(diǎn)的緩存中有該偏移量數(shù)據(jù)塘揣,則直接將該偏移量之后的數(shù)據(jù)一次性發(fā)送給從節(jié)點(diǎn),如果沒有宿崭,則會(huì)觸發(fā)全量復(fù)制
5.redis高可用
5.1 緩存穿透
概念解釋:業(yè)務(wù)查詢時(shí)亲铡,緩存為命中,流量全部打到數(shù)據(jù)庫的情況
應(yīng)對措施:
(1)緩存空對象返回葡兑,并設(shè)置過期時(shí)間
如果每次查詢的key均不同奖蔓,且redis中都不存在,會(huì)導(dǎo)致redis中出現(xiàn)很多key(如黑客攻擊時(shí)讹堤,使用不同的key掃描)
(2)布隆過濾器
5.2 緩存擊穿
概念解釋:熱點(diǎn)key訪問時(shí)吆鹤,緩存數(shù)據(jù)并不存在,會(huì)集中訪問DB
應(yīng)對措施:緩存提前預(yù)熱洲守;訪問DB時(shí)疑务,使用分布式鎖(eg:setnx)
5.3 緩存雪崩
概念解釋:(1)redis中的key集中過期沾凄,會(huì)導(dǎo)致請求瞬間打到DB (2)redis掛了,服務(wù)請求打到DB
應(yīng)對措施:
(1)對key值設(shè)置不同的過期時(shí)間
(2)使用redis集群部署或是哨兵模式(現(xiàn)在基本都是使用集群)知允,在redis主節(jié)點(diǎn)掛了之后搭独,從節(jié)點(diǎn)會(huì)通過選取成為主節(jié)點(diǎn),繼續(xù)提供服務(wù)
6.redis開發(fā)規(guī)范建議
6.1 key設(shè)計(jì)
- key值建議加上業(yè)務(wù)特征廊镜,防止key沖突
- key不要過長牙肝,如果過長,key較多時(shí)嗤朴,內(nèi)存占用會(huì)很大
- key值不要包含特殊字符
6.2 value設(shè)計(jì)
value盡量不要過大配椭,防止出現(xiàn)bigkey
bigkey危害:
(1)導(dǎo)致redis阻塞
(2)影響網(wǎng)絡(luò)開銷,value過長雹姊,網(wǎng)卡帶寬被占滿股缸,傳輸效率低
假如一個(gè)bigkey約1M,QPS=1000吱雏,那么每秒就會(huì)產(chǎn)生1000M流量敦姻,如果使用千兆網(wǎng)卡,最大傳輸率為128M/s歧杏,相當(dāng)于每秒才能完成10個(gè)左右的請求镰惦,性能極差
(3)key盡量設(shè)置過期時(shí)間,非必要犬绒,不要常駐內(nèi)存