Redis組件介紹(五)

来源:https://www.cnblogs.com/cjybigdatablog/p/18393328
-Advertisement-
Play Games

寫在前面 今天繼續學習redis後面的知識。 Redis 哨兵機制 哨兵 Sentinel 機制 Sentinel(哨兵)是 Redis 的高可用性解決方案。由一個或多個 Sentinel 實例組成的 Sentinel 系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器。當被監視的主服 ...


寫在前面

今天繼續學習redis後面的知識。

Redis 哨兵機制

哨兵 Sentinel 機制

Sentinel(哨兵)是 Redis 的高可用性解決方案。由一個或多個 Sentinel 實例組成的 Sentinel 系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器。當被監視的主伺服器進入下線狀態時,Sentinel 會自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器。簡單來說,哨兵就是帶有自動故障轉移功能的主從架構。

無法解決:

  1. 單節點併發壓力問題
  2. 單節點記憶體和磁碟物理上限

哨兵架構原理

Redis 集群

集群

Redis 從 3.0 開始支持 Cluster 模式。Redis 集群支持節點的自動發現、支持從主節點的選舉和容錯、支持線上分片(sharding)等特性。
PING PONG 協議(心跳機制)

集群搭建

創建集群

  1. 準備環境安裝 Ruby 以及 Redis 集群依賴

    yum install -y ruby rubygems
    # https://rubygems.org/gems/redis/versions
    gem install redis-xxx.gem
    
  2. 在一臺機器創建 7 個目錄

    # 創建目錄並複製配置文件
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7000/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7001/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7002/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7003/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7004/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7005/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7007/
    
  3. 修改不同目錄配置文件

    # 編輯配置文件(例如 ./7000/redis.conf)
    port 7000                           # 修改埠
    # bind 127.0.0.1 -::1              # 開啟遠程連接
    protected-mode no
    daemonize yes                       # 開啟後臺運行
    dbfilename dump-7000.rdb            # 每台機器的文件不能一樣
    cluster-enabled yes                 # 開啟集群模式
    cluster-config-file nodes-7000.conf # 集群節點配置文件
    cluster-node-timeout 5000           # 集群節點超時時間
    appendonly yes                      # 開啟 AOF 持久化
    appendfilename "appendonly-7000.aof" # 修改 AOF 文件名
    appenddirname "appendonlydir-7000"
    
  4. 指定不同目錄配置文件啟動七個節點

    redis-server 7000/redis.conf
    redis-server 7001/redis.conf
    redis-server 7002/redis.conf
    redis-server 7003/redis.conf
    redis-server 7004/redis.conf
    redis-server 7005/redis.conf
    redis-server 7006/redis.conf
    
  5. 複製集群操作腳本到 bin 目錄中

    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/src/redis-trib.rb /usr/local/soft/redis/bin/
    

    對於 Redis 7.0.0 之後的版本,使用以下命令:

    redis-cli --cluster create 192.168.40.110:7000 192.168.40.110:7001 192.168.40.110:7002 192.168.40.110:7003 192.168.40.110:7004 192.168.40.110:7005 --cluster-replicas 1
    

  1. 查看集群狀態

    # 查看集群狀態
    redis-cli --cluster check 192.168.40.110:7000
    

集群節點狀態說明

  • 主節點

    • 主節點存在 hash slots,且主節點的 hash slots 沒有交叉
    • 主節點不能刪除
    • 一個主節點可以有多個從節點
    • 主節點宕機時多個副本之間自動選舉主節點
  • 從節點

    • 從節點沒有 hash slots
    • 從節點可以刪除
    • 從節點不負責數據的寫,只負責數據的同步

使用集群

  1. 添加節點(預設為從)

    # 添加主節點
    redis-cli --cluster add-node 192.168.40.110:7006 192.168.40.110:7000 --cluster-slave
    

    註意:1. 該節點必須以集群模式啟動 2. 預設情況下該節點是以 master 節點形式添加

  2. 刪除副本節點

    # 刪除節點
    redis-trib.rb del-node 192.168.40.110:7002 0ca3f102ecf0c888fc7a7ce43a13e9be9f6d3dd1
    

    註意: 1. 被刪除的節點必須是從節點或沒有被分配 hash slots 的節點

Redis 面試題與理解

穿透(要查詢的數據根本不存在)

穿透指用戶查詢數據時,如果數據既不存在於資料庫中,也不存在於緩存中,那麼每次請求都會直接訪問資料庫,從而繞過緩存,導致資料庫負載增加。

穿透解決方案

  1. 對空值進行緩存
    類似於上面的例子,雖然資料庫中沒有 id=-1234 的用戶數據,但可以在 Redis 中緩存一個空值(key=-1234,value=null),以避免頻繁查詢資料庫。

  2. 實時監控
    對 Redis 進行實時監控,發現命中率下降時進行排查,結合運維人員分析訪問對象和數據,設置黑名單限制服務。

  3. 使用布隆過濾器
    使用 BitMap 作為布隆過濾器,將所有可訪問的資源通過簡單的映射關係放入布隆過濾器中,當請求到來時,先進行布隆過濾器判斷,如果有則放行,否則攔截。

  4. 介面校驗
    對無效請求(例如 id=-1234)進行攔截,防止其到達 Redis 或資料庫。

雪崩(一批數據有,但過期時間到了)

雪崩指大量數據在同一時刻過期,導致大量請求落到資料庫,造成資料庫壓力增加,嚴重時可能導致資料庫宕機。

雪崩解決方案

  1. 使用互斥鎖(Mutex Lock)或分散式鎖
    只允許一個請求訪問後端數據源,其他請求等待並共用結果。

  2. 將失效時間分散開
    使用隨機數生成緩存的過期時間,避免集中失效。

  3. 使用多級緩存架構
    例如使用 nginx 緩存 + Redis 緩存 + 其他緩存,不同層使用不同緩存,可靠性更強。

  4. 設置緩存標記
    記錄緩存數據是否過期,過期時觸發後臺線程更新實際的 key。

  5. 設置熱點數據的永不過期或較長過期時間
    減少熱點數據失效的機會。

擊穿(針對某一個數據突然過期,直接查資料庫)

擊穿指高併發情況下,當一個 key 突然失效,大量請求直接訪問資料庫,可能導致資料庫負載過高。

擊穿解決方案

  1. 為緩存數據設置不同的過期時間
    避免集中失效,監控數據,適時調整。

  2. 引入兩級緩存架構
    使用本地緩存(如 Guava Cache)作為第一級緩存,Redis 作為第二級緩存,設置不同的過期時間。

  3. 針對熱點數據預載入
    保證緩存不會在同一時間全部失效。

總結

如果大量的請求在redis上得不到響應,那麼就會導致這些請求會直接去訪問DB,導致DB的壓力瞬間變大而卡死或者宕機。

  • 大量高併發請求打在 Redis 上
  • Redis 上的資源未能響應時,直接訪問資料庫
  • 資料庫壓力瞬間增大,可能導致資料庫宕機,引發一系列“災害”

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

-Advertisement-
Play Games
更多相關文章
  • 32位配置寄存器:GPIOx_CRL,GPIOx_CRH 32位數據寄存器:GPIOx_IDR,GPIOx_ODR 32位置位/複位寄存器:GPIOx_BSRR 16位複位寄存器:GPIOx_BRR 32位鎖定寄存器:GPIOx_LCKR GPIO 寄存器詳解 CRL 32位埠配置低寄存器(GPI ...
  • 嵌入式STM32單片機開發環境配置教學Win/Mac · 本教程支持Windows和Mac · Windows可選的開發軟體為Keil、Clion、STM32CubeMX,可自由選擇開發方式 · Mac的開發環境為(Clion+OpenOCD+STM32CubeMX),僅支持HAL庫 · 本博客同步 ...
  • Multipass 虛擬機 ssh 登錄(密碼方式) [!NOTE] 以 Ubuntu 24,04 LTS 為例 準備工作 為了演示新建一個示例虛擬機。 multipass launch --name vm01 -c 4 -m 4G -d 100G --network bridged 操作步驟 進入 ...
  • 實踐環境 CentOS-7-x86_64-DVD-2009 簡介 Firewalld是一種簡單的、有狀態的、基於區域(zone-based)的防火牆。策略和區域用於組織防火牆規則。網路在邏輯上被劃分為多個區域,它們之間的流量可以通過策略進行管理。 查看防火牆狀態 # service firewall ...
  • STM32 與 linux 雙向串口通信實驗 本文記錄STM32 與 linux 雙向串口通信,包含stm32發送、Linux阻塞式接收;Linux發送,STM32阻塞式接收;本實驗的目的在於調通數據鏈路,為之後使用奠定基礎。 實驗平臺為: STM32方面用的是STM32H723ZGT6為核心的開發 ...
  • Linux 腳本文件 shebang (!#) 行最大為何只有 128 位元組?為何最多只能指定一個參數?如何將這些參數排列在參數列表前面?本文通過閱讀 Linux 內核源碼,一一為你揭秘 ...
  • 前言 將一個處於睡眠狀態或者新創建的進程加入就緒隊列時會產生喚醒搶占檢查,被喚醒的任務一般期望能夠立刻執行,發生搶占能夠滿足被喚醒任務的實時性需求。CFS調度器的喚醒搶占能否成功會受到sysctl_sched_wakeup_granularity的影響,該參數能控制喚醒搶占發生的概率。頻繁的搶占有可 ...
  • FFmpeg是一個開源的多媒體框架,它可以處理各種音頻和視頻格式的轉換、解碼、編碼和流處理。它提供了一套豐富的庫和工具,廣泛應用於視頻點播、直播、多媒體處理、游戲開發等領域。 FFmpeg的主要組件包括: libavformat - 用於音頻和視頻的多媒體容器的多路復用和解復用。支持多種格式,如MP ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...