redis 是乙個鍵值對(key-value pair)資料庫伺服器, 伺服器中的每個資料庫都由乙個redis.h/redisdb
結構表示, 其中,redisdb
結構的dict
字典儲存了資料庫中的所有鍵值對, 我們將這個字典稱為鍵空間(key space):
typedef struct鍵空間和使用者所見的資料庫是直接對應的:redisdb redisdb;
舉個例子, 如果我們在空白的資料庫中執行以下命令:
redis> set message "那麼在這些命令執行之後, 資料庫的鍵空間將會是圖 image_db_example 所展示的樣子:hello world"ok
redis> rpush alphabet "a"
"b""
c"(integer)
3redis> hset book name "
redis in action
"(integer)
1redis> hset book author "
josiah l. carlson
"(integer)
1redis> hset book publisher "
manning
"(integer)
1
因為資料庫的鍵空間是乙個字典, 所以所有針對資料庫的操作 —— 比如新增乙個鍵值對到資料庫, 或者從資料庫中刪除乙個鍵值對, 又或者在資料庫中獲取某個鍵值對, 等等, 實際上都是通過對鍵空間字典進行操作來實現的, 以下幾個小節將分別介紹資料庫的新增、刪除、更新、取值等操作的實現原理。
新增乙個新鍵值對到資料庫, 實際上就是將乙個新鍵值對新增到鍵空間字典裡面, 其中鍵為字串物件, 而值則為任意一種型別的 redis 物件。
舉個例子, 如果鍵空間當前的狀態如圖 image_db_example 所示, 那麼在執行以下命令之後:
redis> set date "鍵空間將新增乙個新的鍵值對, 這個新鍵值對的鍵是乙個包含字串2013.12.1
"ok
"date"
的字串物件, 而鍵值對的值則是乙個包含字串"2013.12.1"
的字串物件, 如圖 image_db_after_add_new_key 所示。
再舉個例子, 如果我們繼續執行以下命令:
redis> hset book page 320那麼鍵空間中(integer)
1
book
鍵的值物件(乙個雜湊物件)將被更新, 新的鍵值對page
和320
會被新增到值物件裡面, 如圖 image_update_by_hset 所示。
因為資料庫的鍵空間是乙個字典, 所以所有針對資料庫的操作 —— 比如新增乙個鍵值對到資料庫, 或者從資料庫中刪除乙個鍵值對, 又或者在資料庫中獲取某個鍵值對, 等等, 實際上都是通過對鍵空間字典進行操作來實現的, 以下幾個小節將分別介紹資料庫的新增、刪除、更新、取值等操作的實現原理。
新增乙個新鍵值對到資料庫, 實際上就是將乙個新鍵值對新增到鍵空間字典裡面, 其中鍵為字串物件, 而值則為任意一種型別的 redis 物件。
舉個例子, 如果鍵空間當前的狀態如圖image_db_example 所示, 那麼在執行以下命令之後:
redis> set date "鍵空間將新增乙個新的鍵值對, 這個新鍵值對的鍵是乙個包含字串2013.12.1
"ok
"date"
的字串物件, 而鍵值對的值則是乙個包含字串"2013.12.1"
的字串物件, 如圖 image_db_after_add_new_key 所示。
刪除資料庫中的乙個鍵, 實際上就是在鍵空間裡面刪除鍵所對應的鍵值對物件。
舉個例子, 如果鍵空間當前的狀態如圖 image_db_example 所示, 那麼在執行以下命令之後:
redis>del book鍵(integer)
1
book
以及它的值將從鍵空間中被刪除, 如圖 image_db_after_del 所示。
對乙個資料庫鍵進行更新, 實際上就是對鍵空間裡面鍵所對應的值物件進行更新, 根據值物件的型別不同, 更新的具體方法也會有所不同。
舉個例子, 如果鍵空間當前的狀態如圖 image_db_example 所示, 那麼在執行以下命令之後:
redis> set message "鍵blah blah
"ok
message
的值物件將從之前包含"hello world"
字串更新為包含"blah blah"
字串, 如圖 image_db_update_cause_set 所示。
再舉個例子, 如果我們繼續執行以下命令:
redis> hset book page 320那麼鍵空間中(integer)
1
book
鍵的值物件(乙個雜湊物件)將被更新, 新的鍵值對page
和320
會被新增到值物件裡面, 如圖 image_update_by_hset 所示。
對乙個資料庫鍵進行取值, 實際上就是在鍵空間中取出鍵所對應的值物件, 根據值物件的型別不同, 具體的取值方法也會有所不同。
舉個例子, 如果鍵空間當前的狀態如圖 image_db_example 所示, 那麼當執行以下命令時:
redis>get messageget 命令將首先在鍵空間中查詢鍵"hello world
"
message
, 找到鍵之後接著取得該鍵所對應的字串物件值, 之後再返回值物件所包含的字串"helloworld"
, 取值過程如圖 image_fetch_value_via_get 所示。
再舉乙個例子, 當執行以下命令時:
redis> lrange alphabet 0 -1lrange 命令將首先在鍵空間中查詢鍵1) "a"
2) "b"
3) "
c"
alphabet
, 找到鍵之後接著取得該鍵所對應的列表物件值, 之後再返回列表物件中包含的三個字串物件的值, 取值過程如圖 image_fetch_value_via_lrange 所示。
redis 資料庫相關 鍵空間
版本 5.0 結構typedef struct redisdb redisdb 讀寫鍵空間時的維護操作 說明 對鍵空間執行指定的讀寫操作外,還會執行其他額外的維護操作 讀取鍵後,會根據鍵是否存在更新伺服器鍵空間命中 hit 或不命中 miss 次數,可以通過 info stat 命令中的 keysp...
Redis之資料庫空間模型
在關係型資料庫如mysql,資料庫資料是按照行記錄格式進行儲存的。同理,我們常說redis是乙個鍵值對 key value 構成的記憶體資料庫,具體是以什麼形式進行儲存的,下面通過原始碼一看究竟。在redis.h redisserver中記錄了乙個由redis.h redisdb結構組成的陣列,這裡...
Redis 鍵空間通知
對於每個修改資料庫的操作,鍵空間通知都會傳送兩種不同型別的事件 鍵空間通知 key space 和鍵事件通知 key event 當執行del key1命令時 redis配置 只需修改配置檔案redis.conf中的notify keyspace events引數,引數可以是以下字元的任意組合,它指...