Redis?鍵值對(duì)(key-value)數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法
在開始將數(shù)據(jù)結(jié)構(gòu)之前,先給介紹下 Redis 是怎樣實(shí)現(xiàn)鍵值對(duì)(key-value)數(shù)據(jù)庫(kù)的。
Redis 的鍵值對(duì)中的 key 就是字符串對(duì)象,而 value 可以是字符串對(duì)象,也可以是集合數(shù)據(jù)類型的對(duì)象,比如 List 對(duì)象,Hash 對(duì)象、Set 對(duì)象和 Zset 對(duì)象。
比如說:
> SET name "a" OK ? > HSET person name "a" age 18 ? >RPUSH stu "a" "b" (integer) 4
這些命令代表著:
- 第一條命令:name 是一個(gè)字符串鍵,因?yàn)殒I的值是一個(gè)字符串對(duì)象。
- 第二條命令:person 是一個(gè)哈希表鍵,因?yàn)殒I的值是一個(gè)包含兩個(gè)鍵值對(duì)的哈希表對(duì)象。
- 第三條命令:stu 是一個(gè)列表鍵,因?yàn)殒I的值是一個(gè)包含兩個(gè)元素的列表對(duì)象。
這些鍵值對(duì)是如何保存在 Redis 中的呢?
Redis 是使用了一個(gè)【哈希表】保存所有鍵值對(duì),哈希表的最大好處就是讓我們可以用 O(1) 的時(shí)間復(fù)雜度來快速查找鍵值對(duì)。哈希表其實(shí)就是一個(gè)數(shù)組,數(shù)組中的元素叫做哈希桶。
Redis 的哈希桶是怎么保存鍵值對(duì)數(shù)據(jù)的呢?
哈希桶存放的是指向鍵值對(duì)數(shù)據(jù)的指針(dictEntry*),這樣通過指針就能找到鍵值對(duì)數(shù)據(jù),然后因?yàn)殒I值對(duì)的值可以保存字符串對(duì)象和集合數(shù)據(jù)類型的對(duì)象,所以鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)并不是直接保存值本身,而是保存了 void * key 和 void * value 指針,分別指向了實(shí)際的鍵對(duì)象和值對(duì)象,這樣一來,即使值是集合數(shù)據(jù),也可以通過 void * value 指針找到。
這里大概說下圖中涉及到的數(shù)據(jù)結(jié)構(gòu)的名字和用途:
- redisDb 結(jié)構(gòu),表示 Redis 數(shù)據(jù)庫(kù)的結(jié)構(gòu),結(jié)構(gòu)體里存放了指向了 dict 結(jié)構(gòu)的指針;
- dict 結(jié)構(gòu),結(jié)構(gòu)體里存放了 2 個(gè)哈希表,正常情況下都是用【哈希表1】,【哈希表2】只有在 rehash 的時(shí)候才用,具體什么是 rehash,會(huì)在哈希表數(shù)據(jù)結(jié)構(gòu)中說明;
- dicttht 結(jié)構(gòu),表示哈希表的結(jié)構(gòu),結(jié)構(gòu)里存放了哈希表數(shù)組,數(shù)組中的每個(gè)元素都是指向一個(gè)哈希表節(jié)點(diǎn)結(jié)構(gòu)(dictEntry)的指針;
- dictEntry 結(jié)構(gòu),表示哈希表節(jié)點(diǎn)的結(jié)構(gòu),結(jié)構(gòu)里存放了 void * key 和 void * value 指針,key 指向的是 String 對(duì)象,而 value 則可以指向 String 對(duì)象,也可以指向集合類型的對(duì)象,比如 List 對(duì)象、Hash 對(duì)象、Set 對(duì)象和 Zset 對(duì)象。
特別說明下,void * key 和 void * value 指針指向的是 Redis 對(duì)象,Redis 中的每個(gè)對(duì)象都由 redisObject 結(jié)構(gòu)表示,如下:
對(duì)象結(jié)構(gòu)里包含的成員變量:
- type:標(biāo)識(shí)該對(duì)象是什么類型的對(duì)象(String 對(duì)象、List 對(duì)象、Hash 對(duì)象、Set 對(duì)象和 Zset 對(duì)象);
- encoding:標(biāo)識(shí)該對(duì)象使用了哪種底層的數(shù)據(jù)結(jié)構(gòu);
- ptr,指向底層數(shù)據(jù)結(jié)構(gòu)的指針。
Redis 對(duì)象和數(shù)據(jù)結(jié)構(gòu)的關(guān)系如下:
到此這篇關(guān)于Redis 鍵值對(duì)數(shù)據(jù)庫(kù)是怎么實(shí)現(xiàn)的的文章就介紹到這了,更多相關(guān)Redis 鍵值對(duì)數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis安裝啟動(dòng)及常見數(shù)據(jù)類型
這篇文章主要介紹了Redis安裝啟動(dòng)及常見數(shù)據(jù)類型,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Linux環(huán)境下升級(jí)redis的詳細(xì)步驟記錄
這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下升級(jí)redis的詳細(xì)步驟,描述了如何從舊版本升級(jí)到新版本Redis,包括備份舊數(shù)據(jù)、下載和安裝新版本、復(fù)制配置文件和數(shù)據(jù)、停止舊版本并啟動(dòng)新版本的過程,需要的朋友可以參考下2024-12-12利用redis實(shí)現(xiàn)分布式鎖,快速解決高并發(fā)時(shí)的線程安全問題
這篇文章主要介紹了利用redis實(shí)現(xiàn)分布式鎖,快速解決高并發(fā)時(shí)的線程安全問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01詳解Redis如何優(yōu)雅地實(shí)現(xiàn)接口防刷
這篇文章主要為大家詳細(xì)介紹了Redis優(yōu)雅地實(shí)現(xiàn)接口防刷的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03Redis常見數(shù)據(jù)類型List列表使用詳解
Redis的List是一種有序的字符串集合,支持兩端高效插入和刪除,適用于隊(duì)列和棧,這篇文章主要介紹了Redis常見數(shù)據(jù)類型List列表使用的相關(guān)資料,需要的朋友可以參考下2024-12-12通過prometheus監(jiān)控redis實(shí)時(shí)運(yùn)行狀態(tài)的操作方法
本文詳細(xì)介紹了如何通過Prometheus監(jiān)控Redis的運(yùn)行狀態(tài),包括安裝配置Redis、Redis Exporter以及Prometheus,配置Prometheus監(jiān)控Redis指標(biāo),以及常見的Redis指標(biāo)和告警規(guī)則,需要的朋友可以參考下2025-02-02Redis從單點(diǎn)到集群部署模式(單機(jī)模式?主從模式?哨兵模式)
這篇文章主要為大家介紹了Redis從單點(diǎn)集群部署模式(單機(jī)模式?主從模式?哨兵模式)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11