概述
Redis高可用高性能緩存的應用系列的第二篇,主要介紹Redis事務機制和IO多路復用、和持久化的知識點。
(相關資料圖)
Redis事務機制
Redis事務機制,和Mysql有大的不同,分為4步進行執行:
1.事務提交前,先檢查命令語法是否正確2.提交命令后,一定會被執行3.有命令報錯也會執行完4.不能回滾Redis事務和批量操作的區別:Redis在執行exec時,命令要么執行,要么都不執行,批量操作不會檢查語法。
Redis事務命令說明:
multi:告訴Redis開啟一個事務(注意只是開啟,而不是執行)exec: 告訴Redis開始執行事務discard:告訴Redis取消事務watch:監視某一個鍵值對,它的作用是在事務執行之前,如果監視的鍵值被修改,事務會被取消當執行multi命令后,表明Redis開啟一個事務,在執行后續的命令都屬于在排隊中,執行exec命令時,Redis事務的命令要么全部執行,要么全不執行。
redis-cli> set name "stark"OKredis-cli> multiOKredis-cli> set name "stark張宇"QUEUEDredis-cli> set age 33QUEUEDredis-cli> exec1) OK2) OK
如果因為執行的命令語法錯誤,整個Redis的事務會被服務駁回,全部不執行。
redis-cli> multiOKredis-cli> set name "stark張宇"QUEUEDredis-cli> lpop "changchang" "quanquan" "xiaoshenyang"QUEUEDredis-cli> exec(error) wrong number of arguments (given 3, expected 1)
如果語法沒有錯誤,在執行過程中數據有錯誤拋出,Redis也會全部執行,只要語法正確,命令都會被執行。
redis-cli> multiOKredis-cli> set name "stark張宇"QUEUEDredis-cli> lpop nameQUEUEDredis-cli> exec1) OK2) WRONGTYPE Operation against a key holding the wrong kind of value
I/O多路復用
首先要說明一點,redis采用單線程處理請求, 假設服務器是4核的CPU,只會占用一個,其他3個都不進行參與,在線程處理上是并行的。
Redis 6.0版本后對這里進行了優化,使用了I/O thread概念,Redis 6.0的主進程只做計算,不在參與讀寫操作,I/O thread 處理上都是并行的關系,充分利用了多核CPU的優勢,節省了處理時間,提升了處理請求的性能。
持久化
Redis的數據是保存在內存中的,所以當服務器重啟時會造成數據丟失,Redis提供了數據持久化方案,把數據保存到磁盤上,使用文件恢復數據,主要有3種持久化方式:
rdb : 生成某一時刻的快照,然后保存在二進制文件中aof :記錄每一條命令,追加到文件中,打開可以看到具體的操作記錄混合模式:它是上面兩種方式的結合手動觸發save ,會讓Redis處于阻塞狀態,直到rdb持久化完成,線上環境要謹慎使用bgsave ,它會fork出一個子進程,用來執行持久化,主進程繼續響應客戶端請求,它會有短暫的阻塞2.自動觸發
在m秒內,執行命令最終執行的是bgsavebgsave的執行過程:1)首先,redis主進程fork出子進程,2)子進程會共享子進程的數據,并把主進程設置成read only,然后開始執行持久化的操作,當有新命令要修改數據時,Redis采用寫實復制的方法來解決數據不一致的問題。
rdb持久化的優缺點:
優點:
容災性好,方便備份性能最大化,fork出一個子進程來操作,對主進程沒有影響數據比較多時,相對于aof啟動效率比較高缺點:
假如中間發生故障,故障期間會造成數據丟失Aof同步策略
appendfsync everysec 每秒同步一次,默認是每秒同步一次appendfsync always 每次操作后要同步一次appendfsync no 由操作系統進行調度Aof的重寫策略:因為在Redis操作的過程中有很多命令都是對同一個key進行操作,會造成大量的命令重復,造成Aof文件過大,而整理出的解決方案。
手動觸發,執行bgrewriteaof命令自動觸發auto-aof-rewrit-precentage
:當前Aof文件大小和最后一次重寫后的大小之間的比率等于或者是等于指定的增長百分比,如100是代表當前Aof文件是上次重寫的兩倍時候才重寫的。
auto-aof-rewrit-mini-size
:當Aof文件大小大于該值時候才可能重寫。
優點:數據安全,不會造成數據的丟失
缺點:比rdb重啟效率低,運行效率比rdb低