Redis學習筆記(七) 資料庫

来源:https://www.cnblogs.com/xtt321/archive/2020/05/16/12898645.html
-Advertisement-
Play Games

Redis 伺服器將所有的資料庫都保存在伺服器狀態redisServer結構的db數組中,db數組的每個項都是一個redisDB: struct redisServer{ //一個數組保存著伺服器中的所有資料庫 redisDb *db; //資料庫的個數 int dbnum; } dbnum:伺服器 ...


Redis 伺服器將所有的資料庫都保存在伺服器狀態redisServer結構的db數組中,db數組的每個項都是一個redisDB:

struct redisServer{
  //一個數組保存著伺服器中的所有資料庫
  redisDb *db;
  //資料庫的個數
  int dbnum;
}

dbnum:伺服器初始化時,程式根據dbnum 來決定應創建多少少資料庫,由伺服器配置的database選項決定,預設16.

在伺服器內部,客戶端狀態redisClient結構的db屬性記錄了客戶端當前目標資料庫,這個屬性指向redisDb結構的指針:

typedef struct redisClient{
  //記錄客戶端當前正在使用的資料庫
  redisDb *db;
} redisClient;

redisClient指針指向redisServer 數組的其中一個元素,而被指向的元素就是客戶端的目標資料庫。

 

 

 

 

redisBd結構的dict地點保存了資料庫中的所有鍵值對,我們將這個字典稱為鍵空間。

鍵空間的鍵也就是資料庫的鍵,每個鍵都是一個字元串對象。

鍵空間的值也是資料庫的值,每個值可以是字元串對象、列表對象、哈希表對象、集合對象和有序集合對象中的任意一種Redis對象。

 

Redis命令對資料庫進行讀寫時,伺服器不僅對鍵執行指定的讀寫操作,還會執行一些額外的維護工作:

1、讀取一個鍵後,伺服器會根據鍵是否存在來更新伺服器鍵空間命中次數或鍵空間不命中次數。

2、讀取一個鍵之後,伺服器會更新鍵的LRU(最後一次使用時間),這個值用於計算鍵的空閑時間。

3、如果伺服器在讀取一個鍵時發現該鍵已經過期,那麼伺服器會先刪除這個過期鍵,然後再執行餘下的操作。

4、如果客戶端使用Watch命令監視某個鍵,那麼伺服器再對被監視的鍵進行修改後,會將這個鍵標記為臟,從而讓事務程式註意到這個鍵已經被修改過。

5、伺服器每次修改一個鍵之後,都會對臟鍵計數器的值加一,這個計數器會觸發伺服器的持久化以及賦值操作。

6、如果伺服器開啟了資料庫通知功能,那麼在對鍵進行修改後,伺服器將按配置發送相應的資料庫通知。

 

設置過期時間

命令 EXPIRE key ttl 設置鍵生存時間為ttl秒

命令 PEXPIRE  key ttl 設置鍵生存時間為ttl毫秒

命令EXPIREAT key timestamp 命令 設置鍵key過期時間為timestamp秒數時間戳

命令 PEXPIREAT key timestamp 設置鍵key過期時間為timestamp所指定的毫秒時間戳

1、EXPIRE命令可以轉換為 PEXPIRE命令

def EXPIRE(key,ttl_in_sec);
ttl_in_ms = sec_to_ms(ttl_in_sec)
PEXPIRE(key,ttl_in_ms)

2、PEXPIRE命令轉換為PEXPIREAT命令

def PEXPIRE(key,ttl_in_ms)
now_ms = get_current_unix_timestamp_in_ms();
PEXPIREAT(key,now_ms+ttl_in_ms)

3、EXPIREAT命令轉換為PEXPIREAT命令

def EXPIREAT(key,expire_time_in_asc)
expire_time_in_ms = sec_to_ms(expire_time_in_sec)
PEXPIREAT(key,expire_time_in_ms)

redisDB 結構的expires字典保存了資料庫所在鍵的過期時間(過期字典),

1、過期字典的鍵是一個指針指向鍵空間的某個鍵對象。

2、過期字典的值是一個long類型的整數(毫秒精度的UNIX時間戳)。

 

過期刪除策略

1、定時刪除,在設置過期時間的同時,創建定時器,到期立即刪除(記憶體友好,CPU不友好)。

2、惰性刪除,下一次查詢時,查詢是否過期,過期刪除,(記憶體不友好,CPU友好)。

3、定期刪除,每隔一段時間執行一次。

Redis的刪除策略使用了 惰性刪除和定期刪除兩種。

 

在執行SAVE或者BGSAVE命令生成RDB文件時,程式會對資料庫中的鍵進行檢查,已過期的鍵不會被保存到新創建的RDB文件中,因此資料庫包含過期鍵不會對新生成的RDB文件造成影響。

 

在載入RDB文件時,如果伺服器以主伺服器模式運行,載入RDB文件時會對鍵進行檢查,未過期的鍵載入到資料庫中,過期鍵忽略。從伺服器模式運行時,文件中保存的所有鍵被載入,主從同步時,從伺服器過期鍵被清空。

 

AOF文件寫入時,如果過期鍵未清理,AOF文件不會因為過期鍵而產生影響,過期鍵被刪除後,程式會向AOF文件追加DEL命令,來顯示的記錄該鍵已被刪除。

 

AOF重寫時,程式會對資料庫中的鍵檢查,已過期的鍵不會被保存到重寫後的AOF文件中。

 

伺服器在複製模式下,伺服器的過期鍵由主伺服器控制:主伺服器在刪除過期鍵後會向從伺服器發送一條DEL命令,從服務在未收到命令前,客戶端的讀命令會像對未過期鍵處理方式一樣,直到接到DEL命令,從過期鍵才會刪除。

 


每天學一點,總會有收穫。

 

說明:尊重作者知識產權,文中內容參考《Redis設計與實現》,僅在此做學習與大家分享。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內核中常用的分配物理記憶體頁面的介面函數是alloc_pages(),用於分配一個或者多個連續的物理頁面,分配頁面個數只能是2個整數次冪。相比於多次分配離散的物理頁面,分配連續的物理頁面有利於提高系統記憶體的碎片化,記憶體碎片化是一個很讓人頭疼的問題。alloc_pages()函數有兩個,一個是分配gfp ...
  • (1)先來先服務調度演算法(FCFS)(作業、進程調度):演算法簡單,但效率較低;有利於長作業,但對短作業不利,有利於CPU繁忙型作業,不利於I/O繁忙型作業。(2)短作業優先調度演算法(SJF)(作業):運行時間短的作業優先執行,該演算法對長作業不利,易造成“饑餓”問題,即長作業由於優先順序低可能長期得不到 ...
  • 好久沒更新博客了,今年整體行業不太樂觀,在朋友的引薦下進了新的東家討口飯吃,難得清靜下來一個周末,好吧,廢話不多說了, 今天更新了windows 的docker客戶端docker-toolbox, 發現原來的docker login -u 用戶名 -p 密碼 使用不了。這次更新的應該是最新版:htt ...
  • 一.安裝部署 "1.Zabbix部署" "2.Nessus簡介與安裝" "3.Ceph安裝" "4.Graylog 安裝" "5.Centos6.10 安裝Python 2.7.16" 更新中... 二.Linux運維 更新中... ...
  • BIOS 中英文對照表 轉載於https://www.dell.com/support/article/zh-cn/sln262122/bios-%E4%B8%AD%E8%8B%B1%E6%96%87%E5%AF%B9%E7%85%A7%E8%A1%A8?lang=zh 註意:機型不同 BIOS 版 ...
  • Redis 系列: 1. "Redis系列(一)Redis入門" 2. "Redis系列(二)Redis的8種數據類型" 3. "Redis系列(三)Redis的事務和Spring Boot整合" 4. "Redis系列(四)Redis配置文件和持久化" 5. "Redis系列(五)發佈訂閱模式、主 ...
  • 假設有一個用戶表 user,數據如下: 1、查詢表中 uid 重覆的數據 SELECT id, uid, name FROM USER WHERE uid IN (SELECT uid FROM USER GROUP BY uid HAVING COUNT(uid) > 1); 2、查詢表中重覆數據 ...
  • 在SQL Server 2017的錯誤日誌中出現"Parallel redo is started for database 'xxx' with worker pool size [2]"和“Parallel redo is shutdown for database 'xxx' with wor... ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...