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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...