《Redis設計與實現》- 資料庫

来源:https://www.cnblogs.com/lanqiu5ge/archive/2018/08/09/9448185.html
-Advertisement-
Play Games

1. 伺服器中資料庫結構 Redis 伺服器將所有資料庫都保存在伺服器狀態 redisServer 結構的 db 數組中,由 redisDb 結構代表一個資料庫 Redis 伺服器預設會創建16個資料庫,預設情況下,Redis客戶端的目標資料庫是0號資料庫。 2. 切換資料庫 SELECT 命令用來 ...


1. 伺服器中資料庫結構

Redis 伺服器將所有資料庫都保存在伺服器狀態 redisServer 結構的 db 數組中,由 redisDb 結構代表一個資料庫

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

Redis 伺服器預設會創建16個資料庫,預設情況下,Redis客戶端的目標資料庫是0號資料庫。

2. 切換資料庫

SELECT 命令用來切換資料庫

    redis> SELECT 2
    OK
    redis[2]>            //切換到了2號資料庫

註意:
在執行Redis命令,特別是像FLUSHDB這樣的危險命令之前,最好先執行一個SELECT命令,顯示的切換到指定的資料庫,然後在執行別的命名。

3. 資料庫鍵空間

Redis是一個鍵值對資料庫伺服器,伺服器中的每個資料庫都由一個redisDb結構表示。其中,redisDb結構的dict字典保存了資料庫中所有鍵值對,我們將這個字典稱為鍵空間。

    typedef struct redisDb {
        // ...
        // 資料庫鍵空間,保存著資料庫中所有的鍵值對
        dict *dict;
    } redisDb;
  • 鍵空間的鍵也就是資料庫的鍵,每個鍵都是一個字元串對象
  • 鍵空間的值也就是資料庫的值,每個值可以是字元串對象、列表對象、哈希表對象、集合對象和有序集合對象中的任意一種Redis對象。

4. 鍵過期

4.0 保存過期時間

reidsDb結構的expires字典保存了資料庫中所有鍵的過期時間,我們稱這個字典為過期字典:

  • 過期字典的鍵是一個指針,這個指針指向鍵空間中的某個鍵對象(也即某個資料庫鍵,不用再次創建相同的鍵對象,節省記憶體)
  • 過期字典的值是一個 long long 類型的整數,這個整數保存了鍵所指向的資料庫鍵的過期時間——一個毫秒精度的UNIX時間戳。
    typedef struct redisDb {
        // ...
        // 過期字典,保存著鍵的過期時間
        dict *expires;
        // ...
    } redisDb; 

4.1 設置鍵過期命令

Redis有四個不同的命令用於設置鍵的生存時間或者過期時間

  • EXPIRE <key> <ttl> 命令用於將鍵key的生存時間設置為ttl秒
  • PEXPIRE <key> <ttl> 命令用於將鍵key的生存時間設置為ttl毫秒
  • EXPIREAT <key> <timestamp> 命令用於將鍵key的過期時間設置為timestamp所指定的秒數時間戳
  • PEXPIREAT <key> <timestamp> 命令用於將鍵key的過期時間設置為timestamp所指定的毫秒數時間戳

EXPIRE、PEXPIRE、EXPIREAT 三個命令都是調用PEXPIREAT命令來實現的。

4.2 移除鍵過期命令

  • PERSIST <key>命令用於移除鍵key的過期時間
    redis>EXPIRE msg 1000   // 設置鍵msg1000秒後過期
    1
    redis>TTL msg
    996
    redis>PERSIST msg 
    1
    redis>TTL msg
    -1      // 返回值為-1,說明msg沒有設定過期時間

4.3 計算並返回剩餘生存時間

  • TTL命令以秒為單位返回鍵的剩餘生存時間
  • PTTL命令以毫秒為單位返回鍵的剩餘生存時間

4.4 過期鍵的刪除策略

4.4.1三種不同的刪除策略:

  • 定時刪除:在設置鍵過期時間的同時創建一個定時器,讓定時器在鍵的過期時間來臨時,立即執行鍵的刪除操作
  • 惰性刪除:獲取鍵時,執行刪除操作
  • 定期刪除:每隔一段時間,程式就對資料庫進行一次檢查,刪除裡邊的過期鍵

4.4.2 三種刪除策略比較

  • 定時刪除:對記憶體友好,通過定時器保證過期鍵儘快刪除並釋放記憶體;對CPU不友好,當過期鍵比較多時,占用大量CPU時間,影響redis伺服器的響應時間和吞吐量
  • 惰性刪除:對CPU友好,程式只會在取出鍵時才會進行過期檢查;對記憶體不友好,如果有大量過期鍵且這些過期鍵有不會用到的話,記憶體永遠得不到釋放,造成記憶體浪費,可以看做一種記憶體泄漏。
  • 定期刪除:是定時刪除和惰性刪除的一種折中,不過必鬚根據實際情況,合理設置刪除操作的執行時長和執行頻率

4.4.3 Redis選用的刪除策略

Redis伺服器使用惰性刪除和定期刪除兩種策略相結合的方式,通過這種方式來合理使用CPU和避免浪費記憶體。

4.5 AOF、RDB和複製功能對過期鍵的處理

4.5.1 生成RDB文件

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

4.5.2 載入RDB文件

  • 如果伺服器以主伺服器模式運行,那麼載入RDB文件時,會對文件中保存的鍵進行檢查,未過期的鍵不會被載入到資料庫中
  • 如果伺服器以從伺服器模式運行,那麼載入RDB文件時,不論鍵過期與否,全部載入到資料庫中

4.5.3 AOF文件寫入

當伺服器以AOF持久化模式運行時,如果資料庫中的某個鍵已經過期,但還沒有被刪除,那麼AOF文件寫入不會因為這個鍵過期受到影響。
當鍵被惰性刪除或者定期刪除後,程式會向AOF文件追加一條 DEL 命令,來顯式地記錄該鍵已經被刪除。

4.5.4 AOF 重寫

在執行 AOF 重寫時,已過期的鍵不會被保存到重寫後的AOF文件中

4.5.5 複製

當伺服器運行在複製模式下,從伺服器的過期鍵刪除動作由主伺服器控制:

  • 主伺服器在刪除一個鍵後,會顯式的向所有從伺服器發送一個 DEL 命令,告知從伺服器刪除這個過期鍵
  • 從伺服器在執行客戶端發送的讀命令時,即使碰到過期鍵也不會將過期鍵刪除,而是繼續像處理未過期的鍵一樣來處理過期鍵
  • 從伺服器接收到主伺服器發送來的DEL命令後,才會刪除過期鍵

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

-Advertisement-
Play Games
更多相關文章
  • 悲觀鎖(Pessimistic Lock) 顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。 樂觀鎖(Opt ...
  • 占座 ...
  • 一、聯結表 數據仍使用前文中的數據。 1、子查詢 作為子查詢的SELECT語句只能查詢單個列。企圖檢索多個列將返回錯誤。 2、創建鏈接 SELECT <select_list> FROM A LEFT JOIN B ON A.key = B.key UNION SELECT <select_list ...
  • MySQL的主從複製 部署環境: MySQL master 192.168.40.21 MySQL slave 192.168.40.22 思路: 當主MySQL上進行數據上的操作或者變化時,主MySQL上的二進位日誌文件(binary log)會隨之產生變化,這時從MySQL上開啟I/O線程和sq ...
  • 從這篇開始,講innodb存儲引擎中,對於幾個重要的伺服器參數配置。這些參數以innodb_xx 開頭。 1. innodb_buffer_pool_size的設置 這個參數定義了innodb存儲引擎的表數據和索引數據的最大記憶體緩衝區大小,和myisam不同,myisam的key_buffer_si ...
  • link實例之Wordcount詳細步驟 1.我的IDE是IntelliJ IDEA.在官網上https://www.jetbrains.com/idea/下載最新版2018.2的IDEA,如下圖。破解可以再http://idea.lanyus.com/上獲取破解碼進行破解,如下圖。 2.當IDE準 ...
  • 假如現在有表結構: 查詢所有類型內參最大id,可用如下sql: select max(id),type_id from msg_detail group by type_id; ...
  • SQL資料庫面試題以及答案 Student(Sno,Sname,Sage,Ssex) 學生表 Sno:學號;Sname:學生姓名;Sage:學生年齡;Ssex:學生性別Course(Cno,Cname,Tno) 課程表 Cno,課程編號;Cname:課程名字;Tno:教師編號SC(Sno,Cno,s ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...