正文 Redis數據庫特性分析(2 / 2)

Redis保證當上述比率達到一定值時,會執行rehash操作,即對哈希表進行擴容或縮減。當擴容時,是以空間換取時間,當縮減時是以時間換空間。由此可以看出Redis對時間和空間的高效利用率。當然,rehash操作一般是漸進方式執行的。因為其中涉及到對整個哈希表的遷移,如果數據量很大,那麼勢必會影響係統的性能。

Redis使用了兩種漸進式的rehash方式:

(1)每次執行一次添加、查找、刪除操作,rehash都會被執行一次;

(2)當Redis的服務器常規任務執行時,rehash會被執行。在規定的時間內,盡可能地對數據庫字典中那些需要rehash的字典進行rehash,從而加速數據庫字典的rehash進程。

3 Redis的持久化方式:RDB與AOF

在運行情況下,Redis以數據結構的形式將數據維持在內存中,為了讓這些數據在Redis重啟之後仍然可用,Redis分別提供了RDB和AOF兩種持久化模式。

RDB將數據庫的快照以二進製的方式保存到磁盤中。在Redis運行時,RDB程序將當前內存中的數據庫快照保存到磁盤文件中,在Redis重啟動時,RDB程序可以通過載入RDB文件來還原數據庫的狀態。

AOF則以協議文本的方式,將所有對數據庫進行過寫入的命令(及其參數)記錄到AOF文件,以此達到記錄數據庫狀態的目的。AOF更像是曆史記錄,記錄所有運行過的命令。但是AOF文件就會隨著時間持續增長,進而占據整個磁盤。為此,Redis設計了AOF重寫機製,通過開啟新線程,掃描數據庫數據,將其轉化為Redis命令,存入臨時的AOF文件。當掃描完後,用臨時文件代替AOF文件。這樣一來,AOF文件中記錄的命令就是最簡潔的,因而不會占據很多空間。

4 Redis事務

4.1 一致性

Redis的一致性問題可以分為兩部分來討論:入隊錯誤、執行錯誤。

在命令入隊的過程中,如果客戶端向服務器發送了錯誤的命令,Redis會拒絕執行事務,並返回失敗信息。如果命令在事務執行的過程中發生錯誤,那麼Redis隻會將錯誤包含在事務的結果中,這不會引起事務中斷或整個失敗,不會影響已執行事務命令的結果,也不會影響後麵要執行的事務命令,所以它對事務的一致性也沒有影響。

4.2 隔離性

Redis是單進程程序,並且它保證在執行事務時,不會對事務進行中斷,事務可以運行直到執行完所有事務隊列中的命令為止。因此,Redis的事務是總是帶有隔離性的。

4.3 原子性

在上述一致性的介紹中,可以看出在事務隊列中,即使有命令執行錯誤,該事務也會執行完,符合原子性的要求。

4.4 持久性

因為事務不過是用隊列包裹起了一組Redis命令,並沒有提供任何額外的持久性功能,所以事務的持久性由Redis所使用的持久化模式決定:

在單純的內存模式下,事務肯定是不持久的;

在RDB模式下,服務器可能在事務執行之後、RDB文件更新之前的這段時間失敗,所以RDB模式下的Redis事務也是不持久的;

在AOF的“總是SYNC”模式下,事務的每條命令在執行成功之後,都會立即調用 fsync 或 fdatasync 將事務數據寫入到AOF文件。但是,這種保存是由後台線程進行的,主線程不會阻塞直到保存成功,所以從命令執行成功到數據保存到硬盤之間,還是有一段非常小的間隔,所以這種模式下的事務也是不持久的;

其他AOF模式也和“總是 SYNC”模式類似,所以它們都是不持久的;

綜上所述,Redis事務滿足原子性、一致性、隔離性,不滿足持久性。

5 結 語

本文詳細介紹了Redis數據庫數據結構、事務、持久化等特性,為讀者深入理解Redis提供了幫助。

參考文獻

[1] 李子驊.Redis入門指南[M].北京:人民郵電出版社,2013.

[2] 黃健宏.Redis設計與實現[M].北京:機械工業出版社,2014.

[3] 皮雄軍.NoSQL數據庫技術實戰[M].北京:清華大學出版社,2015.

[4] Shashank Tiwari.深入NoSQL[M].北京:人民郵電出版社, 2012.

[5] 徐小威.非關係型數據庫數據恢複技術研究[D].杭州,杭州電子科技大學,2014.