redis 初識

Redis是什麼?

Redis是一個以鍵值對形式存儲的NoSql數據庫,它的所有數據都存儲在內存中,並且可以將內存中的數據持久化到磁盤上。它可以用作數據庫、緩存系統和消息代理等。它支持5種數據結構String、List、Hash、Set、Sort Set。並且內置了主從複製功能、Lua腳本、事務和不同級別的持久化,另外還提供了通過Redis Sentinel實現的Redis高可用,還有Redis 集羣自動分區等實現。

它是怎麼工作的?

Redis服務器可以與多個客戶端建立網絡連接,它處理客戶端發送的命令請求,然後在數據庫中保存執行命令所產生的數據,並通過資源管理器維持着服務器自身的運行。

從啓動到接受命令,Redis服務器都做了些什麼操作?

Redis服務器從啓動到能夠接受客戶端發送的命令請求,需要一些列的初始化和設置,比如初始化服務器狀態、加載用戶配置、創建相應的數據結構和網絡連接等。

1)初始化服務器的狀態結構

主要設置服務器的運行ID、默認配置文件路徑、運行架構(是否集羣)、默認端口號、RDB和AOF的持久化條件、LRU時鐘、創建命令表等。

2)加載用戶配置

在啓動服務器時,用戶可以通過指定配置參數或配置文件來改變服務器的默認配置。

3)初始化服務器的數據結構

如創建與客戶端相關的狀態鏈表、創建包含所有數據庫的數組(默認redis服務器有16個數據庫)、與訂閱頻道相關的數據結構等,在啓動時服務器會爲這些數據結構分配相應的內存。在創建好這些數據結構外,Redis服務器還會做一些重要的設置:爲服務器設置進程信號、創建共享對象、打開監聽端口等等。

在完成以上初始化後,服務器還需要加載RDB文件或AOF文件,並根據這些文件的內容來還原服務器的數據庫狀態。

它是怎麼執行命令的?

執行命令的過程如下:

1):客戶端向服務器端發送命令請求set key value。

2):服務器接收並處理客戶端發來的命令請求,在數據庫中做相關設置操作,併產生命令回覆"OK"。

3):服務器將命令回覆發送給客戶端。

4):客戶端接收服務器返回的命令恢復,並把回覆內容打印給用戶。

對於步驟1,在客戶端將命令請求發送給服務器前,會將這個命令請求轉換成協議格式,並通過與服務器建立Socket連接,纔將轉換成協議後的命令請求發送給服務器。

對於步驟2,服務器接收到命令請求後,讀取Socket中的命令請求,並將其保存到緩衝區裏,然後服務器對緩衝區裏面的命令請求進行解析,提取出命令請求中包含的命令參數和參數個數,並保存到一個與客戶端相關的數據結構中。然後調用命令執行器,執行命令。

但是在執行命令前,還要做一些相關的準備:檢查命令是否存在命令表中,以及檢查命令的參數和參數個數是否匹配,另外還有身份驗證、內存的使用情況、客戶端使用的是否爲訂閱模式、客戶端是否使用了事務、是否啓動了監視器等等。只有在這些檢查都通過了,才能調用命令的實現函數,真正開始處理命令請求,命令實現函數負責執行命令指定的操作,併產生相應的命令回覆,這些回覆會被保存到與客戶端相關聯的緩衝區裏,然會實現函數還會爲客戶端的套接字關聯命令回覆處理器,這個處理器負責把命令回覆發送給客戶端。

執行完實現函數後,還需做一些後續工作:

a)檢查是否開啓了慢查詢日誌功能,如果是,將會爲該命令添加一條新的慢查詢日誌。

b)檢查是否開啓了AOF持久化功能,如果是,將會把該命令添加到AOF的緩衝區裏面。

c)檢查是否其它的從服務器正在複製該服務器,如果有,就會把該命令發送給所有的從服務器。

至此,服務器對該命令執行完畢,就可以繼續從緩衝區裏取出下一條命令來處理執行了。

對於步驟3:前面提到的,由命令實現函數爲客戶端的Socket關聯命令回覆處理器,當客戶端的Socket變得可寫時,命令回覆處理器將會把保存在與客戶端相關聯的緩衝區裏的命令回覆發送個客戶端。當發送完畢後,命令回覆處理會清空與客戶端關聯的緩衝區,爲處理下一個命令請求做準備。

對於步驟4,當客戶端接收到命令回覆後,會將這些回覆轉換爲可讀的格式,打印給用戶看。

那麼它是怎麼維持自身的運行的呢?

Redis服務器默認每隔100ms調用一次serverCron函數,這個函數負責管理服務器的資源,來維持服務器自身的運轉。

負責管理的資源都有:管理服務器的內存使用情況、管理客戶端的資源(連接狀態)、管理數據庫的資源(刪除過期的鍵、對數據壓縮等)、檢查AOF運行狀態以及將AOF緩衝區裏的數據寫到AOF文件中等。

和其它類型的數據庫區別?

和關係型數據庫的區別

對於關係型數據庫(oracle、mysql)通常需要寫Sql腳本來查詢多個表之間關聯的數據,數據是完全結構化存儲的,並且是存儲在磁盤上的,另外還支持事務、索引等,但在Redis中並沒有這些概念,它的數據是以鍵值對的形式存儲的,不支持關聯查詢,數據是非結構化的,並且數據是完全存儲在內存中的,它也支持事務,但事務的級別比較低,不能創建索引。但是Redis查詢速度是關係型數據庫沒法比的,因爲它的數據總是在內存中,不需要對查詢語句的解析和優化,並且Redis查詢數據不會產生不必要的臨時數據,這樣就避免了掃描過後還得要再刪除這些臨時數據,最終提高了查詢性能。

和Memcached的區別

Memcached和Redis很相似,數據都是存儲在內存中,同樣也是以鍵值對的形式存儲數據的,但它只有一種數據存儲結構(只能以字符串的形式存儲數據),而Redis除了這一種還有List、Hash、Set、SortSet四種,最大的不同是Redis可以把數據持久化到磁盤上,並支持數據的主從複製。相對Memcached,Redis能夠解決更廣泛的問題。

爲什麼要用它?

Redis作爲內存數據庫,查詢速度快、併發量高,但缺點是數據類型少、關聯查詢不方便、不能存儲海量的數據,一般用作緩存系統、消息代理等,通常作爲輔助數據庫和其他的存儲系統配合使用,到底要不要選擇用Redis,根據自己應用的需求、應用場景來抉擇。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章