1. 程式人生 > >redis(一)--認識redis

redis(一)--認識redis

target 優先級 集合 實戰 clas 突出 之前 維護 round

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在內的多家公司成功用於實戰。

redis(一)--認識redis