Redis 資料庫鍵空間

2022-07-10 17:27:08 字數 3889 閱讀 5673

redis 是乙個鍵值對(key-value pair)資料庫伺服器, 伺服器中的每個資料庫都由乙個redis.h/redisdb結構表示, 其中,redisdb結構的dict字典儲存了資料庫中的所有鍵值對, 我們將這個字典稱為鍵空間(key space):  

typedef struct

redisdb redisdb;

鍵空間和使用者所見的資料庫是直接對應的:

舉個例子, 如果我們在空白的資料庫中執行以下命令:

redis> set message "

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

那麼在這些命令執行之後, 資料庫的鍵空間將會是圖 image_db_example 所展示的樣子:

因為資料庫的鍵空間是乙個字典, 所以所有針對資料庫的操作 —— 比如新增乙個鍵值對到資料庫, 或者從資料庫中刪除乙個鍵值對, 又或者在資料庫中獲取某個鍵值對, 等等, 實際上都是通過對鍵空間字典進行操作來實現的, 以下幾個小節將分別介紹資料庫的新增、刪除、更新、取值等操作的實現原理。

新增乙個新鍵值對到資料庫, 實際上就是將乙個新鍵值對新增到鍵空間字典裡面, 其中鍵為字串物件, 而值則為任意一種型別的 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鍵的值物件(乙個雜湊物件)將被更新, 新的鍵值對page320會被新增到值物件裡面, 如圖 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鍵的值物件(乙個雜湊物件)將被更新, 新的鍵值對page320會被新增到值物件裡面, 如圖 image_update_by_hset 所示。

對乙個資料庫鍵進行取值, 實際上就是在鍵空間中取出鍵所對應的值物件, 根據值物件的型別不同, 具體的取值方法也會有所不同。

舉個例子, 如果鍵空間當前的狀態如圖 image_db_example 所示, 那麼當執行以下命令時:

redis>get message

"hello world

"

get 命令將首先在鍵空間中查詢鍵message, 找到鍵之後接著取得該鍵所對應的字串物件值, 之後再返回值物件所包含的字串"helloworld", 取值過程如圖 image_fetch_value_via_get 所示。

再舉乙個例子, 當執行以下命令時:

redis> lrange alphabet 0 -1

1) "a"

2) "b"

3) "

c"

lrange 命令將首先在鍵空間中查詢鍵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引數,引數可以是以下字元的任意組合,它指...