在指定的時間間隔內將內存中的數據集快照寫入磁盤,也就是行話講的Snapshot快照,它恢復時是將快照文件直接讀到內存裏web
Redis會單首創建(fork)一個子進程來進行持久化,會先將數據寫入到
一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。
整個過程當中,主進程是不進行任何IO操做的,這就確保了極高的性能
若是須要進行大規模數據的恢復,且對於數據恢復的完整性不是很是敏感,那RDB方
式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的數據可能丟失。redis
就是 複製一個與當前進程同樣的進程。新進程的全部數據都和原進程同樣,可是是一個全新的進程,並做爲原進程的子進程數據庫
配置文件中默認的快照配置緩存
命令save或者是bgsave安全
執行flushall命令,也會產生dump.rdb文件,可是裏面是空的服務器
以日誌的形式來記錄每一個寫操做,將Redis執行過的全部寫指令記錄下來(讀操做不記錄),app
只許追加文件但不能夠改寫文件,redis啓動之初會讀取該文件從新構建數據,換言之,redis異步
重啓的話就根據日誌文件的內容將寫指令從前到後執行一次以完成數據的恢復工做svg
是什麼性能
AOF採用文件追加方式,文件會愈來愈大爲避免出現此種狀況,新增了重寫機制,
當AOF文件的大小超過所設定的閾值時,Redis就會啓動AOF文件的內容壓縮,
只保留能夠恢復數據的最小指令集.可使用命令bgrewriteaof
重寫原理
AOF文件持續增加而過大時,會fork出一條新進程來將文件重寫(也是先寫臨時文件最後再rename),
遍歷新進程的內存中數據,每條記錄有一條的Set語句。重寫aof文件的操做,並無讀取舊的aof文件,
而是將整個內存中的數據庫內容用命令的方式重寫了一個新的aof文件,這點和快照有點相似
觸發機制
Redis會記錄上次重寫時的AOF大小,默認配置是當AOF文件大小是上次rewrite後大小的一倍且文件大於64M時觸發
RDB持久化方式可以在指定的時間間隔能對你的數據進行快照存儲
AOF持久化方式記錄每次對服務器寫的操做,當服務器重啓的時候會從新執行這些
命令來恢復原始的數據,AOF命令以redis協議追加保存每次寫的操做到文件末尾.
Redis還能對AOF文件進行後臺重寫,使得AOF文件的體積不至於過大
只作緩存:若是你只但願你的數據在服務器運行的時候存在,你也能夠不使用任何持久化方式.
在這種狀況下,當redis重啓的時候會優先載入AOF文件來恢復原始的數據,
由於在一般狀況下AOF文件保存的數據集要比RDB文件保存的數據集要完整.
RDB的數據不實時,同時使用二者時服務器重啓也只會找AOF文件。那要不要只使用AOF呢?
做者建議不要,由於RDB更適合用於備份數據庫(AOF在不斷變化很差備份),
快速重啓,並且不會有AOF可能潛在的bug,留着做爲一個萬一的手段。
具體的性能 、安全 、效率 根據實際狀況,來本身調整
能夠一次執行多個命令,本質是一組命令的集合。一個事務中的
全部命令都會序列化,按順序地串行化執行而不會被其它命令插入,不準加塞
一個隊列中,一次性、順序性、排他性的執行一系列命令
MULTI set id l2 get id incr tl incr tl get tl EXEC
MULTI set name z3 set age 28 incr tl discard
MULTI set name z3 get name incr tl get tl set email EXEC
一個事務都不執行
MULTI set age 11 incr tl set email abc@11.com incr email EXEC
只運行能執行的事務
原理
悲觀鎖/樂觀鎖/CAS(Check And Set)
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖 樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量, 樂觀鎖策略:提交版本必須大於記錄當前版本才能執行更新 CAS
例如 信用卡可用餘額和欠額
watch 相似 樂觀鎖,
watch 能夠監控 多個keys,
在exec 執行失敗 ,同時返回Nullmulti-bulk應答以通知調用者事務執行失敗