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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...