Redis數(shù)據(jù)庫(kù)存儲(chǔ)鍵值對(duì)的底層原理分析
前言
Redis可以簡(jiǎn)單理解為是一個(gè)存儲(chǔ)鍵值對(duì)的內(nèi)存結(jié)構(gòu)
下面我們來(lái)看一下Redis使用什么數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)鍵值對(duì)的叭
Redis鍵值對(duì)的存儲(chǔ)原理
Redis存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)是哈希表
存儲(chǔ)鍵值對(duì)的運(yùn)行機(jī)制
因?yàn)镽edis的數(shù)據(jù)存儲(chǔ)類型是多種多樣的,所以管理鍵值對(duì)的哈希表只是存儲(chǔ)這個(gè)數(shù)據(jù)的地址
我下面解釋運(yùn)行存儲(chǔ)鍵值對(duì)運(yùn)行機(jī)制的時(shí)候的術(shù)語(yǔ)解釋
- 存儲(chǔ)地址: 哈希表存儲(chǔ)的 數(shù)據(jù)地址 位置
- 數(shù)據(jù)地址: 數(shù)據(jù)本身的 地址 位置
使用哈希表尋找鍵值對(duì)
1、使用key通過(guò)哈希函數(shù)計(jì)算出哈希表中的存儲(chǔ)地址
2、通過(guò)存儲(chǔ)地址找到哈希表中存放的數(shù)據(jù)地址
3、通過(guò)數(shù)據(jù)地址找到數(shù)據(jù)并進(jìn)行讀取
使用哈希表存儲(chǔ)鍵值對(duì)
1、使用key通過(guò)哈希函數(shù)計(jì)算出哈希表中的存儲(chǔ)地址
2、通過(guò)存儲(chǔ)地址找到數(shù)據(jù)應(yīng)該存放的位置,把數(shù)據(jù)地址存放在里面
使用哈希表存儲(chǔ)鍵值對(duì)弊端
當(dāng)存儲(chǔ)數(shù)據(jù)過(guò)多的時(shí)候,此時(shí)出現(xiàn)哈希沖突,會(huì)在每一個(gè)哈希桶中形成沖突鏈表,從而出現(xiàn)尋找存儲(chǔ)地址效率變慢
對(duì)弊端的優(yōu)化
redis同時(shí)維護(hù)數(shù)組相同的兩個(gè)哈希表
當(dāng)沖突鏈表過(guò)多的時(shí)候,會(huì)進(jìn)行數(shù)據(jù)遷移
把備用的哈希表數(shù)組長(zhǎng)度增大到滿足當(dāng)前數(shù)據(jù)規(guī)模的大小
把數(shù)據(jù)遷移到新的滿足當(dāng)前數(shù)據(jù)規(guī)格大小的哈希表中
一次性遷移會(huì)對(duì)redis造成短時(shí)間的阻塞,影響業(yè)務(wù),所以采用漸進(jìn)式的遷移哈希表
漸進(jìn)式遷移哈希表
下面說(shuō)的哈希表的桶可以理解為沖突鏈表
每次有請(qǐng)求發(fā)生過(guò)來(lái)的時(shí)候,在處理請(qǐng)求的同時(shí)順帶對(duì)這個(gè)舊哈希表進(jìn)行從左到右的桶遷移
每次請(qǐng)求遷移一個(gè)桶
遷移期間查詢數(shù)據(jù)兩個(gè)哈希表都進(jìn)行查詢,存儲(chǔ)數(shù)據(jù)存儲(chǔ)到新的哈希表中
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
爬蟲(chóng)技術(shù)之分布式爬蟲(chóng)架構(gòu)的講解
今天小編就為大家分享一篇關(guān)于爬蟲(chóng)技術(shù)之分布式爬蟲(chóng)架構(gòu)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
Redis 8種基本數(shù)據(jù)類型及常用命令和數(shù)據(jù)類型的應(yīng)用場(chǎng)景小結(jié)
Redis是一種基于內(nèi)存操作的數(shù)據(jù)庫(kù),其中多虧于高效的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了Redis 8種基本數(shù)據(jù)類型及常用命令和數(shù)據(jù)類型的應(yīng)用場(chǎng)景小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
解讀Redis秒殺優(yōu)化方案(阻塞隊(duì)列+基于Stream流的消息隊(duì)列)
該文章介紹了使用Redis的阻塞隊(duì)列和Stream流的消息隊(duì)列來(lái)優(yōu)化秒殺系統(tǒng)的方案,通過(guò)將秒殺流程拆分為兩條流水線,使用Redis緩存緩解數(shù)據(jù)庫(kù)壓力,并結(jié)合Lua腳本進(jìn)行原子性判斷,使用阻塞隊(duì)列和消息隊(duì)列異步處理訂單,有效提高了系統(tǒng)的并發(fā)處理能力和可用性2025-02-02
Redis進(jìn)行驗(yàn)證碼登錄的項(xiàng)目實(shí)踐
本文主要介紹了Redis進(jìn)行驗(yàn)證碼登錄的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解
這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

