redis系列之 資料庫

2021-10-12 03:08:44 字數 1789 閱讀 2741

當我們在redis資料庫中set乙個kv的時候,這個kv儲存在**?如果我們get的時候,又從**get出來。時間複雜度,空間複雜的等等,怎麼優化等等一系列問題。

redis伺服器將所有資料庫資訊都儲存在redis.h##redisservice結構體中。**如下:

1

struct

redisserver

列了幾個,我認為比較重要的。其中最重要的,肯定是redisdb *db;這個資料結構儲存了我們所有的資料。

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

/*

redis database representation. there are multiple databases identified

* by integers from 0 (the default database) up to the max configured

* database. the database number is the 'id' field in the structure.

*/typedef

struct

redisdb redisdb;

其中最重要的就是dict *dict;他是乙個字典,不太了解的小夥伴,可以看我前一篇的文章(對redis的字典有詳細的介紹。

這個dict儲存了我們真正的資料。

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

因為資料庫的鍵空間是乙個字典, 所以所有針對資料庫的操作 —— 比如新增乙個鍵值對到資料庫, 或者從資料庫中刪除乙個鍵值對, 又或者在資料庫中獲取某個鍵值對, 等等,實際上都是通過對鍵空間字典進行操作來實現的。那麼複雜度顯而易見基本就是o(1)級別了,這也是redis為什麼能這麼快的乙個重要原因。

對乙個資料庫鍵進行取值, 實際上就是在鍵空間中取出鍵所對應的值物件。**如下:

1/*2

* 返回字典中包含鍵 key 的節點3*

4* 找到返回節點,找不到返回 null5*

6* t = o(1)7*/

8 dictentry *dictfind(dict *d, const

void *key)938

39//

如果程式遍歷完 0 號雜湊表,仍然沒找到指定的鍵的節點

40//

那麼程式會檢查字典是否在進行 rehash ,

41//

然後才決定是直接返回 null ,還是繼續查詢 1 號雜湊表

42if (!dictisrehashing(d)) return

null;43}

4445

//進行到這裡時,說明兩個雜湊表都沒找到

46return

null;

47 }

看**其實是很簡單的。

對鍵增加,刪除,更新類似於查詢。我就不一一列出原始碼了。

當使用 redis 命令對資料庫進行讀寫時, 伺服器不僅會對鍵空間執行指定的讀寫操作, 還會執行一些額外的維護操作, 其中包括:

資料庫系列 Redis通用指令

key是乙個字串,通過key獲取redis儲存的資料 key常用操作 del key exists key type key expire key seconds 有效期控制 pexpire key milliseconds ttl key 獲取有效期 pttl key keys pattern 查...

資料庫系列 Redis刪除策略

redis中的資料,在expire中以雜湊的方式儲存在其中。其value是資料在記憶體中的位址,filed是對應的生命週期 在記憶體占用與cpu占用之間尋找一種平衡,顧此失彼都會造成整體redis效能的下降,甚至引發伺服器宕機或記憶體洩露 惰性刪除 資料到達過期時間,不做處理。等下次訪問該資料時,如...

NoSQL資料庫之 Redis

redis是基於記憶體的nosql資料庫。前身是memcached,但是memcached不支援持久化,沒有豐富的資料型別。redis存放的資料是key values鍵值對。1 解壓 tar zxvf redis 3.0.5.tar.gz 預編譯,需要gcc環境。apt get install gc...