Redis進階(一)

来源:https://www.cnblogs.com/zz01/archive/2022/08/07/16558850.html
-Advertisement-
Play Games

通過簡單的KV資料庫理解Redis 分為訪問模塊,操作模塊,索引模塊,存儲模塊 底層數據結構 除了String類型,其他類型都是一個鍵對應一個集合,鍵值對的存儲結構採用哈希表 哈希表由多個哈希桶組成,桶中存儲entry元素,存儲key和value的地址 但是當hash衝突元素過多會導致查詢效率變慢, ...


 

通過簡單的KV資料庫理解Redis

分為訪問模塊,操作模塊,索引模塊,存儲模塊

 

底層數據結構

 

 

除了String類型,其他類型都是一個鍵對應一個集合,鍵值對的存儲結構採用哈希表

哈希表由多個哈希桶組成,桶中存儲entry元素,存儲key和value的地址

但是當hash衝突元素過多會導致查詢效率變慢,所以引入rehash操作

 

採用兩個全局hash表,但是從一個哈希表複製到另一個哈希表肯定會造成線程阻塞,所以使用漸進式哈希 :分攤到多次拷貝

接受第一次請求就拷貝第一個索引的entry元素,下一次再拷貝第二個,以此類推

 

對於集合類型的底層數據結構:雙向鏈表,壓縮列表,哈希表,跳錶,整數數組

壓縮列表:

跳錶:

增加多級索引,通過索引位置的跳轉,快速找到元素 (時間複雜度為logn)

 

不同操作所對應的時間複雜度也不同

對於單個元素的操作一般為O(1)

範圍操作一般為O(n),一般使用scan來代替

統計操作,因為底層的數據結構中有元素個數的統計,所以時間複雜度為O(1)

 

為什麼快

單線程(多路復用)不會阻塞在一個客戶端的請求連接上,因為在請求過程中有可能會因為監聽到有連接請求但是遲遲沒有建立起連接或者建立起連接數據一直沒有到達都會發生阻塞,所以採用多路復用非阻塞結構,允許在內核中存在多個監聽套接字和已連接套接字,採用**事件回調機制**,當有事件到來,進入一個隊列,redis處理隊列中的請求,針對每個事件都有相應的回調函數

在記憶體中操作數據

高效的底層數據結構

 

 

持久手段

AOF(記錄操作命令,所以恢復時還要執行,速度慢)

mysql資料庫是寫前日誌,redis是寫後日誌,所以不會阻塞當前的寫操作

但是有兩個風險:1.redis宕機,有丟失一段時間內數據的可能 2.因為在主線程中進行aof操作,有可能會阻塞下一個操作

但是隨著時間的推移,aof文件越來越大怎麼辦,數據恢復效率肯定會降低?

引入aof重寫

多變一,把多條對同一個鍵的舊操作合併成最新的一條操作

但是aof重寫會阻塞主線程嗎?

不會的,和aof追加寫入不一樣,採用的不是主線程,是由主線程fork出的子線程bgrewriteaof線程重寫,子線程里也有父線程的記憶體的最新數據(共用頁表)

在重寫過程中,客戶端的操作也會由主線程寫入當前aof的緩衝區和重寫aof的緩衝區,保證宕機也是數據齊全的,重寫之後數據也是最新的

 

 

RDB(記憶體快照)

把某一時刻的狀態記錄到磁碟上

兩個命令生成RDB:1. save,使用主線程,會阻塞主線程 2. bgsave,使用子線程,避免了阻塞問題(但是主線程只可讀,不可寫

那麼在記錄到磁碟的時間段內,怎麼保證數據不被修改?

使用bgsave+寫時複製:主線程修改處於RDB中的數據時,需要生成一個副本,子進程把副本數據寫進RDB文件

 

雖然RDB恢復速度快,但是進行持久化的時間間隔卻不好把控,所以Redis4.0推出AOF和RDB結合的方法:在兩次RDB持久化期間,期間發生的改動由AOF記錄,這樣恢複數據即快,又避免了頻繁fork子線程對主線程的阻塞。

​    

 

 

高可用

主從

主從同步過程

第一步:從庫發送同步命令,包括主庫ID和複製進度offset

第二步:主庫生成RDB文件,發送RDB文件,全量複製,發送包含兩個參數:主庫ID和複製進度offset

第三步:主庫把第二步過程中收到的命令發送到從庫

 

 

那麼當從庫增多,主庫fork子線程生產RDB的壓力必然會增大,所以採用主-從-從架構,進行從庫之間的級聯,取一些從庫幫主庫分擔壓力

 

那麼網路斷了怎麼辦?

redis2.8之前是再進行一次全量複製

之後是進行增量複製

在redis中存在一個環形緩衝區,記錄主庫寫的進度和從庫複製的進度,由兩個參數確定,master-repl-offset和slave-repl-offset

網路斷開再重連之後,從庫根據offset位置進行增量複製就好

但是如果從庫複製進度趕不上主庫寫的進度,緩衝區就會被覆蓋,就會觸發從庫的全量複製,所以一般增大緩衝區為2倍

 


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

-Advertisement-
Play Games
更多相關文章
  • 配置文件設置 set number (設置行號) set nocompatible (設置不相容vi模式,不設置會導致許多vim特性被禁用) set clipboard=unnamed (設置普通的複製粘貼的內容和vim複製的內容相互使用) 打開、編輯,查找文件 vim + 任意文件名,如vim f ...
  • “Linux,全稱GNU/Linux,是一種免費使用和自由傳播的類UNIX操作系統,其內核由林納斯·本納第克特·托瓦茲於1991年10月5日首次發佈,它主要受到Minix和Unix思想的啟發,是一個基於POSIX的多用戶、多任務、支持多線程和多CPU的操作系統。 ...
  • 想要將圖片中的文字提取出來嗎?小編今天為大家分享一款線上文字識別轉換工具—"Text Scanner"。Text Scanner for Mac是一款非常不錯的線上文字識別轉換工具,辨識速度快,操作流程也簡單直接,且會自動判斷各國語言,非常簡單! Text Scanner mac版基於AI領先的深度 ...
  • linux安裝光碟中的相關文件: [root@Centos8 cdrom]# ls BaseOS EFI images isolinux LICENSE media.repo Minimal TRANS.TBL #isolinux:存放和安裝相關的文件 [root@Centos8 isolinux] ...
  • Past for iChat 是一個Mac小應用程式,用於在macOS Big Sur、Monterey 及更高版本上打開和查看由 Apple 的 iChat 應用程式(.ichat 和 .chat 文件)創建的舊聊天日誌文件,iChat是新的和改進的消息應用程式的前身,使用非常方便。 詳情:Pas ...
  • NoSQL 1. 定義 NoSQL(Not Only SQL)即不僅僅是 SQL,泛指非關係型的資料庫 2. 為什麼使用 NoSQL? 傳統關係資料庫在應付動態網站、特別是超大規模和高併發的純動態網站已經顯得力不從心了,如商品網站中對商品數據的頻繁查詢、熱搜商品的排行統計、訂單超時問題。雖然能實現功 ...
  • 前幾天有個需求需要基於分類數據向上統計總數,一開始第一個想法是通過程式來計算,後再思考能不能通過SQL腳本直接來計算 基礎數據 | Id | ParentId | Category | Num | | | | | | | 1 | 0 | 分類1 | 0 | | 2 | 1 | 分類1-1 | 10 ...
  • 1.ETCD概述 1.1 ETCD概述 etcd是一個高可用的分散式的鍵值對存儲系統,常用做配置共用和服務發現。由CoreOS公司發起的一個開源項目,受到ZooKeeper與doozer啟發而催生的項目,名稱etcd源自兩個想法,即Linux的**/etc文件夾和d分散式系統。/etc**文件夾是用 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...