Redis之單機資料庫的實現

來源:互聯網
上載者:User

Redis之單機資料庫的實現

原理

Redis伺服器將所有資料庫儲存在伺服器狀態redis.h/redisServer結構的db數組中,db數組的每個項都是一個RedisDb結構,每個redisDb結構代表一個資料庫。初始化伺服器時,程式會根據伺服器狀態的dbnum屬性來決定應該建立多少個資料庫,dbnum屬性的值由伺服器配置的database選項決定,預設情況下,該選項的值為16,所以Redis伺服器預設會建立16個資料庫。

切換資料庫

預設情況下,Redis用戶端的目標資料庫為0號資料庫,但用戶端可以通過執行SELECT命令來切換目標資料庫。

鍵空間

每個資料庫都由一個redis.h/redisDb結構表示,redisDb結構的dict字典儲存了資料庫中的所有索引值對,將這個字典稱為鍵空間。當使用Redis命令對資料庫進行讀寫時,伺服器不僅會對鍵空間執行指定的讀寫操作,還會執行一些額外的維護操作。比如讀取一個鍵之後,伺服器會更新鍵的最後一次使用時間,這個值可以用於計算鍵的閑置時間,使用OBJECT idletime命令可以查看鍵key的閑置時間。

設定鍵的存留時間或到期時間 EXPIRE/PEXPIRE key time

Redis的到期鍵刪除策略:惰性刪除和定期刪除。

惰性刪除:所有讀寫資料庫的命令——調用expireIfNeeded函數——判斷輸入鍵是否已經到期——是,刪除鍵

定期刪除:周期性調用activeExpireCycle函數,函數每次運行時,都從一定數量的資料庫中取出一定數量的隨機鍵進行檢查,並刪除其中的到期鍵。全域變數current_db會記錄當前的進度,下次開始時調用上一次進度進行處理。

資料庫通知

資料庫通知是Redis2.8版本新增加的功能,可以讓用戶端通過訂閱給定的頻道或者模式,來獲知資料庫中鍵的變化,以及資料庫中命令的執行情況。

例如:SUBSCRIBE_keyspace@0_ _:message

RDB持久化

因為Redis是記憶體資料庫,它將自己的資料庫狀態儲存在記憶體裡面,Redis提供了RDB持久化功能,這個功能可以將Redis

在記憶體中的資料庫狀態儲存到磁碟裡面,避免資料意外丟失。RDB持久化既可以手動執行,也可以根據伺服器配置選項定期執行,該功能可以講某個時間點上的資料庫狀態儲存到一個RDB檔案中。RDB持久化功能所產生的RDB檔案是一個經過壓縮的二進位檔案,通過該檔案可以還原產生RDB檔案時的資料庫狀態。因為RDB檔案時儲存在硬碟裡面的,所以即使Redis伺服器處理序退出,甚至運行Redis伺服器的電腦停機,只要RDB檔案仍然存在,Redis伺服器就可以用它來還原資料庫狀態。

RDB檔案的建立與載入

SAVE和BGSAVE都可以用於產生RDB檔案,SAVE命令會阻塞Redis伺服器處理序,直到RDB檔案建立完畢為止,在伺服器處理序阻塞期間,伺服器不能處理任何命令請求。

BGSAVE命令會派生出一個子進程,然後由子進程複雜建立RDB檔案,伺服器處理序繼續處理命令請求。

對於不同類型的索引值對,RDB檔案會使用不同的方式來儲存。

AOF持久化

除了RDB持久化功能外,Redis還提供了AOF持久化功能。與RDB持久化通過儲存資料庫中索引值對來記錄資料庫狀態不同,AOF持久化是通過儲存Redis伺服器所執行的寫命令來記錄資料庫狀態。

因為AOF檔案的更新頻率通常比RDB檔案的更新頻率高,故

如果伺服器開啟了AOF持久化功能,那麼伺服器就會優先使用AOF檔案來還原資料庫狀態;

只有在AOF持久化功能處於關閉狀態時,伺服器才會使用RDB檔案來還原資料庫狀態。

redis > SET msg“hello”

redis > SADDfruits “apple” “banana”

redis > RPUSHnumbers 128 122 444

RDB持久化儲存資料庫狀態的方法是將msg、fruits、numbers三個鍵的索引值對儲存到RDB檔案中,而AOF持久化儲存資料庫狀態的方法則是將伺服器執行的SET、SADD、RPUSH三個命令儲存到AOF檔案中。

為提高檔案的寫入效率,在現在作業系統中,當使用者調用write函數,將一些資料寫入到檔案的時候,作業系統通常會將寫入資料暫時儲存在一個記憶體緩衝區裡面,等到緩衝區的空間被填滿、或者超過指定時限後,才真正地將緩衝區中的資料寫入到磁碟裡面。

這種做法雖然提高了效率,但也為寫入資料帶來了安全問題,因為如果電腦停機,那麼儲存在記憶體緩衝區裡面的寫入資料將會丟失。

為此,系統提供了fsync和fdatasync兩個同步函數,它們可以強制讓作業系統立即將緩衝區中的資料寫入到硬碟裡面,從而確保寫入資料的安全性。

伺服器配置appendfsync選項的值直接決定AOF持久化功能的效率和安全性。

appendfsync的值為always時,伺服器在每個事件迴圈都要將aof_buf緩衝區中所有內容寫入到AOF檔案,並且同步AOF檔案,效率最慢,但是最安全的。即使出現故障停機,AOF持久化也只會丟失一個事件迴圈中所產生的命令資料。

everysec: 伺服器在每個事件迴圈都要將aof_buf緩衝區中所有內容寫入到AOF檔案,並且每隔一秒就要在子線程中對AOF檔案進行一次同步。效率快,就算出現故障,資料庫也只丟失一秒種的命令資料。

no: 處於no模式下的flushAppendOnlyFile調用無須執行同步操作,所以該模式下的AOF檔案寫入速度總是最快的。不過因為這種模式會在系統緩衝中積累一段時間的寫入資料,所以該模式的單次同步時間長度通常是三種中最長的。

Ubuntu 14.04下Redis安裝及簡單測試

Redis叢集明細文檔

Ubuntu 12.10下安裝Redis(圖文詳解)+ Jedis串連Redis

Redis系列-安裝部署維護篇

CentOS 6.3安裝Redis

Redis安裝部署學習筆記

Redis設定檔redis.conf 詳解

Redis 的詳細介紹:請點這裡
Redis 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.