標籤:redis 記憶體資料庫
Redis官網對Redis的定義是:“Redis is an open source, BSD licensed, advanced key-value cache and store”,可以看出,Redis是一種鍵值系統,可以用來緩衝或儲存資料。Redis是“Remote Dictionary Server”(遠程字典服務)的縮寫,提供了字串(string),列表(list),雜湊(hash),集合(set)和有序集合(sorted set)等5種資料結構,這些資料結構使它成為一種便於使用的鍵值系統。
作為Redis提供的最簡單的資料結構,字串及其常用命令如所示:
圖1
可見,Redis字串類型實際上類似於C++中的map,一個鍵對應一個值。清單類型則是一種相對進階的資料結構,其和常用命令如所示:
圖2
列表實際上由一個雙向鏈表實現,所以在列表兩端插入或刪除資料效率極高,可以用於實作類別似於微博、人人網上的“新鮮事”功能。 Redis提供的一個更有趣的結構稱為雜湊,其和常用命令如所示:
圖3
一個雜湊實際上是一組鍵值對的集合,雜湊本身的鍵是“父鍵”,雜湊中包含的若干欄位是“子鍵”,每個“子鍵”都有相應的值。“子鍵”之間並沒有一定的聯絡,但是它們共同組成了一個完整的雜湊結構。我們可以把一個雜湊看做關聯式資料庫中的一行,雜湊的每個子鍵對應行的一個欄位。因此,當把關聯式資料庫中的資料緩衝至Redis時,使用雜湊結構可能會帶來方便。需要注意的是,雜湊結構內部的子鍵之間是沒有循序關聯性的。Redis提供的另一個無循序關聯性的結構是集合,其和常用命令如所示:
圖4
集合中的資料滿足唯一性和無序性。集合在Redis內部是用雜湊表實現的,所以插入和刪除操作的時間複雜度均為O(1)。Redis為集合提供了求交並差等運算命令,使用起來非常方便。與集合密切相關的另一個資料結構是有序集合,其和常用命令如所示:
圖5
有序集合與集合的最大差異在於有序集合中的每個資料都有一個對應的分數,集合中的元素就是按照這些分數進行排序的。從結構功能和使用方法上來看,有序集合可能是Redis提供的5種資料結構中最進階的一種。
Redis是一種記憶體資料庫,這使其在資料存取效率方面表現突出。由於記憶體中的資料時刻面臨丟失的危險,Redis提供了兩種持久化機制,及時將記憶體中的資料寫入硬碟。第一種機製為RDB,利用儲存快照的方式把記憶體資料定期寫入硬碟;第二種機製為AOF,利用寫日誌的方式,每執行一條更改Redis資料的命令,就在日誌裡附加上該命令並儲存在硬碟上。Redis預設開啟RDB模式,關閉AOF模式,這是因為AOF更加耗時。但是,如果對資料安全要求極高,無法承擔任何資料丟失的後果,AOF模式就變成了持久化的首選。
當然,即使Redis具備持久化機制,但是一旦本地硬碟損壞,資料丟失依然在所難免。所以,Redis又提供了複製功能,作用是將一個主要資料庫(master)的資料自動同步到多個從資料庫(slave),從而儘可能防止資料丟失。Redis主從機制可以簡單描述為:從資料庫啟動後,先向主要資料庫發送SYNC命令;主要資料庫接到SYNC命令後就開始儲存快照,在此期間,所有發給主要資料庫的命令都被緩衝起來;快照儲存完成後,主要資料庫把快照和緩衝的命令一起發給從資料庫;從資料庫儲存主要資料庫發來的快照檔案,並依次執行主要資料庫發來的緩衝命令。在同步過程中,從資料庫不會阻塞,它預設使用同步之前的資料繼續響應用戶端發來的命令。
事務是Redis提供的特性之一。首先利用MULTI命令通知Redis,接下來的若干命令屬於同一事務;然後輸入若干命令,這些命令都被放入命令隊列而不會被立即執行;最後,利用EXEC命令通知Redis,屬於同一事務的所有命令均已輸入完成,現在開始執行該事物。屬於同一個事務的所有有效命令或者全部被執行,或者全部不執行,且在執行過程中不會插入其他命令。管道(pipeline)是Redis提供的另一個特性。該特性使Redis能夠一次性接收多個命令,執行之後再一次性返回結果。這樣能夠減少用戶端與Redis伺服器的通訊次數,從而降低往返時延。
除事務和管道以外,Redis還提供了很多其他特性,如設定鍵的到期時間,利用BLPOP/BRPOP命令實現優先順序隊列,利用PUBLISH/SUBSCRIBE命令實現訊息訂閱和發布等,這裡不再贅述。
Redis由ANSI C寫成,能夠運行在包括Linux和OS X在內的大部分POSIX系統上,官方推薦的作業系統為Linux。Redis沒有官方的Windows版本,但是微軟移植並維護了一個能夠運行在Windows上的Redis並放在github上(https://github.com/MSOpenTech/redis)。
Redis的編程介面被稱為用戶端(clients),絕大部分主流程式設計語言都有官方推薦的用戶端。中,具有Redis官方推薦用戶端的語言標為綠色,沒有官方推薦用戶端的標為藍色:
圖6
由於Redis沒有官方推薦的C++用戶端,因此可以使用C用戶端予以代替。官方推薦的C用戶端是hiredis,可以從github上找到(https://github.com/redis/hiredis)。
作為一款功能強大,效率極高的NoSQL資料庫,Redis已被包括新浪微博,知乎,Stackoverflow,暴雪和Flickr在內的多家公司成功用於實戰。
註:圖1-5均來自《Redis in Action》,Josiah L.Carlson, Manning Publications, 2013
參考文獻:
1. 李子驊,Redis入門指南,人民郵電出版社,2013年5月第1版
2.Josiah L.Carlson, Redis in Action, Manning Publications, 2013
3. Redis官方網站http://www.redis.io
初學Redis(1)——認識Redis