亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Redis數(shù)據(jù)庫原理深入刨析

 更新時間:2022年11月22日 11:02:59   作者:zkyangll  
在之前的文章我們介紹過,Redis服務器在啟動之初,會初始化RedisServer的實例,在這個實例中存在很多重要的屬性結構,同理本篇博客中介紹的數(shù)據(jù)庫實現(xiàn)原理也會和其中的某些屬性相關,我們繼續(xù)看一下吧

1.服務器和客戶端實現(xiàn)的數(shù)據(jù)庫

 Redis服務器在啟動時,會根據(jù)redis.conf文件的中databases xx這個配置決定創(chuàng)建多少個數(shù)據(jù)庫(默認配置是16),啟動后默認使用的0號數(shù)據(jù)庫,當然可以使用select dbnum這個命令來切換。需要注意的是在redis集群模式下,只有0號數(shù)據(jù)庫可以用,是無法切換到其他庫的。

 Redis服務器會將所有的數(shù)據(jù)庫都保存在服務器狀態(tài)的redisServer的db數(shù)組中,數(shù)組的每一項都代表了一個數(shù)據(jù)庫,用redisDb結構來表示,首先看一下redisServer.db的源碼:

struct redisServer {
	...
	// 代表數(shù)據(jù)庫的數(shù)組
    redisDb *db;
    // 這個記錄的配置文件中數(shù)據(jù)庫的數(shù)量
	int dbnum;  
    ...
}

 我們通過客戶端向Redis寫入的任何數(shù)據(jù)都會記錄到這個db數(shù)組中,根據(jù)前面描述,我們知道可以通過select命令切換到另一個目標數(shù)據(jù)庫,但是客戶端是怎么記錄的它當前操作的哪個數(shù)據(jù)庫呢?我們繼續(xù)看一下源碼:

typedef struct client {
    ...
    // 指針指向當前客戶端正在操作的數(shù)據(jù)庫
    redisDb *db;            /* Pointer to currently SELECTed DB. */
	...
} client;

 看,在client客戶端狀態(tài)中,有一個db指針,指向了server.db數(shù)組中的某一項,代表了當前客戶端正在操作的數(shù)據(jù)庫。所以通過切換client.db的指針,調整客戶端操作的數(shù)據(jù)庫,這就是select命令的實現(xiàn)原理。

2.數(shù)據(jù)庫字典的實現(xiàn)

 Redis是支持key-value鍵值對存儲的,這其實是通過dict結構來實現(xiàn)的,在前面講到的內容中,服務器和客戶端都指向了一個redisDb的結構,在這個db結構中,就包含存儲了鍵值對的字典結構,首先看一下源碼:

typedef struct redisDb {
	...
	// 這個存放的就是鍵值對
    dict *dict;                 /* The keyspace for this DB */
    // 這個存放的是鍵值對的過期時間,下面一節(jié)會說到
    dict *expires;              /* Timeout of keys with a timeout set */
    ...
} redisDb;

 dict這個指針就指向了存儲鍵值對的字典結構,key是字符串robj類型,value可以是任何的robj類型。當我們分別新增、刪除、更新或者查詢的時候,其實就是根據(jù)輸入的key在這個字典上做curd的操作。我們在Redis寫入兩個鍵值對,圖示如下:

 除了對數(shù)據(jù)庫鍵值對的curd操作,基于整個數(shù)據(jù)操作的一些命令也是在這個dict上面實現(xiàn)的,比如清空所有鍵值對的flushdb,或者exists、del、dbsize命令等等。在執(zhí)行命令前后,redis還會執(zhí)行一些其他操作,比如檢查是否超出最大內存,更新lru時間,記錄慢查詢日志,或者向monitor客戶端發(fā)送命令等等,這就是redis數(shù)據(jù)字典的實現(xiàn)原理。

3.鍵值對的生命周期管理

 這里說的生命周期,其實就是指鍵值對的過期時間。通常我們使用expire key這個命令設置鍵的過期時間,但其實Redis是有四個命令支持設置過期時間的:

  • expire key seconds 將key的生命周期設置為second秒;
  • pexpire key milliseconds 將key的生命周期設置為milliseconds毫秒;
  • expireat key timestamp 將key的過期時間設置在timestamp這個秒的時間戳過期;
  • pexpireat key timestamp 將key的過期時間設置在timestamp這個毫秒的時間戳過期;

 值得說明的是,雖然有這么多命令支持設置過期時間,但是最終經過轉換都是指向pexpireat這一個命令來實現(xiàn)?,F(xiàn)在的問題是,這么多鍵值對的過期時間,在redis服務端是怎么保存和維護的呢?

 前面在看redisDb源碼的時候,有一個expires屬性,我們再把源碼拿過來看一下:

typedef struct redisDb {
	...
    // 這個存放的是鍵的過期時間
    dict *expires;              /* Timeout of keys with a timeout set */
    ...
} redisDb;

 這就很清晰了,通過expires這個指針,指向了一個dict結構,字典中記錄的就是所有鍵值對的過期時間。其中,key是鍵值對的鍵,value是long類型的毫秒精度的unix時間戳,即過期的時間點。值得注意的是,保存鍵值對的dict字典和保存過期時間的expires字典,key指針都指向相同的一個鍵字符串對象,所以在內存空間上是不會存在浪費的。

 除此之外,跟過期時間操作相關的兩個命令,當然也是基于expires這個字典來實現(xiàn)的:

  • ttl 返回鍵值對的剩余時間
  • persist刪除鍵值對的過期時間

4.過期鍵的管理策略

 既然有過期時間,那么鍵值對過期之后,是不是立即被刪除了呢?答案肯定不是,redis通過惰性刪除和定期刪除兩種策略實現(xiàn)對過期鍵的管理:

  • 惰性刪除策略:當程序訪問到某個鍵值對的時候,會對過期時間檢查,如果過期就刪除,否則不處理。
  • 定期刪除策略:基于serverCron時間事件函數(shù),從一定數(shù)量的數(shù)據(jù)庫中取出一定數(shù)量的隨機鍵進行檢查,并刪除其中過期的鍵值對。

 使用這兩種過期鍵管理策略可以最大程度上在合理使用CPU時間和避免浪費內存空間之間取得平衡。

5.持久化對過期鍵的處理

rdb 持久化

  • save或者bgsave會檢查鍵的過期時間,已過期的鍵不會保存到的持久化的rdb文件中。
  • 服務器啟動載入rdb文件時,如果是主服務器,過期鍵會被忽略加載;如果是從服務器,不論是否過期,都會被加載。

aof 持久化

  • 寫入aof文件時,key是會寫入的,過期之后,通過追加del命令,才會顯示的刪除此過期鍵。
  • bgrewriteaof 重寫時會檢查鍵的過期時間,已過期的鍵不會寫入新的aof文件中。
  • 服務器啟動載入aof文件時,過期鍵也會被忽略,不會被加載。

6.主從復制對過期鍵的處理

 主從復制,為了保證數(shù)據(jù)的一致性,通常由主服務器執(zhí)行更新的操作,然后將命令發(fā)送給從服務器。在3.2版本之前,由于惰性刪除策略的存在,主服務器遇到對過期鍵的訪問,會刪除此鍵值對,并給客戶端返回null值,但是從服務器由于不能執(zhí)行刪除操作,即便是此鍵已過期,也會返回對應的value值,出現(xiàn)數(shù)據(jù)不一致導致的臟讀問題。

 在3.2版本之后,這個問題得到了修改,從服務器會判斷當前鍵是否過期,如果已過期并且是從服務器的話,也會返回null值。

到此這篇關于Redis數(shù)據(jù)庫原理深入刨析的文章就介紹到這了,更多相關Redis數(shù)據(jù)庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Centos7下Redis3.2.8最新版本安裝教程

    Centos7下Redis3.2.8最新版本安裝教程

    這篇文章主要為大家詳細介紹了Centos7下Redis3.2.8最新版本的安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Redis源碼解析:集群手動故障轉移、從節(jié)點遷移詳解

    Redis源碼解析:集群手動故障轉移、從節(jié)點遷移詳解

    這篇文章主要介紹了Redis源碼解析:集群手動故障轉移、從節(jié)點遷移的相關內容,涉及通過集群定時器函數(shù)clusterCron實現(xiàn)從節(jié)點遷移等知識,具有一定參考價值,需要的朋友可以了解。
    2017-10-10
  • 基于Redis實現(xiàn)搶紅包和發(fā)紅包功能

    基于Redis實現(xiàn)搶紅包和發(fā)紅包功能

    搶紅包是我們生活常用的社交功能, 這個功能最主要的特點就是用戶的并發(fā)請求高, 在系統(tǒng)設計上, 可以使用非常多的辦法來扛住用戶的高并發(fā)請求, 在本文中簡要介紹使用Redis緩存中間件來實現(xiàn)搶紅包算法,需要的朋友可以參考下
    2024-04-04
  • Spring Boot中使用Redis常用數(shù)據(jù)格式API操作技巧

    Spring Boot中使用Redis常用數(shù)據(jù)格式API操作技巧

    本文介紹了在Spring Boot中使用Redis的一些技巧和數(shù)據(jù)格式,通過配置Redis連接,可以連接到Redis數(shù)據(jù)庫,結合實例代碼介紹的非常詳細,需要的朋友參考下吧
    2024-03-03
  • 利用Redis實現(xiàn)訪問次數(shù)限流的方法詳解

    利用Redis實現(xiàn)訪問次數(shù)限流的方法詳解

    這篇文章主要給大家介紹了關于如何利用Redis實現(xiàn)訪問次數(shù)限流的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • 基于redis實現(xiàn)定時任務的方法詳解

    基于redis實現(xiàn)定時任務的方法詳解

    這篇文章主要給大家介紹了基于redis實現(xiàn)定時任務的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • redis的bigkey掃描腳本深入介紹

    redis的bigkey掃描腳本深入介紹

    這篇文章主要給大家介紹了關于redis的bigkey掃描腳本的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文)

    Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文)

    這篇文章主要介紹了Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 利用Redis實現(xiàn)防止接口重復提交功能

    利用Redis實現(xiàn)防止接口重復提交功能

    大家好,本篇文章主要講的是利用Redis實現(xiàn)防止接口重復提交功能,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Redis 實現(xiàn)分布式鎖時需要考慮的問題解決方案

    Redis 實現(xiàn)分布式鎖時需要考慮的問題解決方案

    本文詳細探討了使用Redis實現(xiàn)分布式鎖時需要考慮的問題,包括鎖的競爭、鎖的釋放、超時管理、網(wǎng)絡分區(qū)等,并提供了相應的解決方案和代碼實例,有助于開發(fā)者正確且安全地使用Redis實現(xiàn)分布式鎖
    2024-09-09

最新評論