Redis的基礎,經典,高級問題解答篇

目錄

一,基礎

二,經典

緩存雪崩:

1. Redis事務的原子性

2. 與MySQL事務的區別

1. 主從復制原理

2. 哨兵模式故障轉移流程

3. 客戶端感知故障轉移

三,高級


  • 一,基礎

  1. Redis的5種基礎數據類型及使用場景?Zset底層實現原理?

    1. String(字符串)

      • 場景:緩存簡單鍵值對(如用戶會話信息、計數器)、分布式鎖(如SETNX)、二進制數據存儲(如圖片Base64)。

      • 特點:支持原子操作(如INCRDECR),最大存儲512MB。

    2. List(列表)

      • 場景:消息隊列(LPUSH/RPOP實現生產者-消費者)、最新消息排行(如微博時間線)、阻塞式任務調度。

      • 特點:雙向鏈表,支持按索引操作(但時間復雜度高)。

    3. Hash(哈希表)

      • 場景:存儲對象(如用戶信息字段:HSET user:1 name "Alice")、聚合數據(如購物車商品信息)。

      • 特點:支持單字段讀寫,內存優化(底層為ziplist或hashtable)。

    4. Set(集合)

      • 場景:去重數據(如用戶標簽)、共同好友(SINTER求交集)、隨機抽獎(SRANDMEMBER)。

      • 特點:無序、自動去重,支持集合運算(并/交/差)。

    5. Zset(有序集合)

      • 場景:排行榜(按分數排序)、延遲隊列(以時間戳為score)、帶權重的任務調度。

      • 特點:元素唯一但score可重復,支持范圍查詢(ZRANGEBYSCORE)。

    6. Zset的底層由?跳躍表(Skip List)?和?字典(Dict)?組成,或在小數據量時使用?listpack(替代舊版的ziplist)

      • 跳躍表

        • 多層鏈表結構,高層鏈表作為“快速通道”,支持O(log N)的查詢、插入、刪除。

        • 每個節點包含scorevalue,按score排序,支持高效范圍操作(如ZRANGE)。

      • 字典

        • 維護value -> score的映射,實現O(1)的單元素查詢。

      • 內存優化

        • 元素數≤zset-max-listpack-entries且元素大小≤zset-max-listpack-value時,使用listpack存儲。

  2. Redis持久化機制RDB和AOF的區別?如何選擇?

    1. 特性RDBAOF
      原理定時生成全量數據快照(二進制文件)記錄所有寫命令(追加日志文件)
      文件體積小(壓縮二進制)大(文本命令,需重寫優化)
      恢復速度快(直接加載內存)慢(重放命令)
      數據安全可能丟失最后一次快照后的數據可配置fsync策略(無/秒級/每次寫)
      資源消耗高(fork子進程內存開銷)低(追加日志,重寫時才有fork開銷)
    2. 選擇策略

      1. 高數據安全:選擇AOF(appendfsync everysec),容忍秒級丟失。

      2. 快速恢復/備份:選擇RDB(如每日備份)。

      3. 混合模式:Redis 4.0+支持RDB+AOF,AOF記錄增量,RDB做全量備份。

  3. 如何用Redis實現分布式鎖?需要注意哪些問題?

    1. 實現步驟

    2. // 加鎖:SET key unique_value NX PX 30000
      String result = jedis.set("lock_key", "client1", "NX", "PX", 30000);
      if ("OK".equals(result)) {// 執行業務邏輯
      } // 解鎖:Lua腳本保證原子性
      String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +"   return redis.call('del', KEYS[1]) " +"else " +"   return 0 " +"end";
      Object unlockResult = jedis.eval(script, Collections.singletonList("lock_key"), Collections.singletonList("client1"));

      注意事項

      1. 鎖過期時間:需預估業務耗時,建議設置自動續期(如Redisson的看門狗)。

      2. 唯一標識:value使用唯一值(如UUID+線程ID),避免誤刪其他客戶端的鎖。

      3. 優化方案

      4. 使用Redisson庫,內置看門狗、可重入鎖、紅鎖(RedLock)實現。

      5. 對鎖操作添加重試機制(如指數退避)。

      6. 原子性操作:加鎖(SET NX PX)和釋放鎖(Lua腳本)必須原子化。

      7. 集群問題

        • 主從異步復制:主節點宕機可能導致鎖丟失,可考慮RedLock算法(需部署多實例)。

        • RedLock爭議:依賴系統時鐘一致性,需權衡CAP。

  • 二,經典

  1. 什么是緩存穿透/雪崩/擊穿?分別給出解決方案
    1. 緩存穿透:
      1. 問題:大量請求查詢數據庫中不存在的數據(如非法ID),繞過緩存直接壓垮數據庫。
        解決方案:? ? ? ??

        1. 布隆過濾器(Bloom Filter):在緩存層前加布隆過濾器,預存所有合法鍵的哈希值,攔截非法請求。

          • 特點:存在一定誤判率(可能將非法請求誤判為合法),需權衡內存占用。

        2. 緩存空值:對查詢結果為null的鍵,緩存空值并設置短過期時間(如30秒)。

          • 注意:需定期清理無效空值,避免內存浪費。

    2. 緩存雪崩:
      1. 問題:大量緩存同時過期或緩存服務宕機,導致請求全部涌向數據庫。
        解決方案

        1. 隨機過期時間:為緩存設置基礎過期時間 + 隨機偏移值(如?TTL = 24h + random(0, 1h))。

        2. 永不過期 + 異步更新

          • 緩存不設過期時間,通過后臺線程定期更新。

          • 結合雙緩存策略:主緩存永不過期,備份緩存設置過期時間作為兜底。

        3. 熔斷降級:使用Hystrix等工具,在數據庫壓力過大時直接返回默認值或限流。

    3. 緩存擊穿:
      1. 問題熱點數據過期時,高并發請求瞬間擊穿緩存,直接訪問數據庫。
        解決方案

      2. 互斥鎖(Mutex Lock)

        • 當緩存失效時,通過分布式鎖(如Redis的SETNX)控制只有一個線程重建緩存,其他線程等待。

        • 示例代碼:

        • public String getData(String key) {String value = redis.get(key);if (value == null) {if (redis.setnx("lock_" + key, "1", 10)) { // 獲取鎖value = db.query(key);redis.setex(key, 3600, value);redis.del("lock_" + key); // 釋放鎖} else {Thread.sleep(100); // 等待后重試return getData(key);}}return value;
          }
        • 邏輯過期:緩存永不過期,但存儲的數據中增加邏輯過期時間字段,由業務代碼判斷是否需要異步更新。

  2. Redis事務的原子性如何理解?與MySQL事務的區別?
    1. 1. Redis事務的原子性
      • 實現方式:通過MULTI(開啟事務)、EXEC(提交事務)、DISCARD(取消事務)命令實現。

      • 原子性含義

        • 命令隊列的原子執行:事務中的命令會被序列化并按順序執行,不會被其他客戶端命令打斷。

        • 不支持回滾:若事務中某條命令執行失敗(如語法錯誤),其他命令仍會繼續執行,無回滾機制。

        • 示例:

        • MULTI
          SET key1 "A"  # 入隊
          INCR key2     # 入隊(若key2非數值類型,執行時報錯)
          EXEC          # 提交事務,第二條命令執行失敗,但第一條仍生效
      • 2. 與MySQL事務的區別
        特性RedisMySQL
        原子性僅保證命令隊列的批量執行,無回滾支持ACID,失敗時自動回滾
        隔離性無隔離級別,事務執行期間可能被其他客戶端修改數據支持多隔離級別(如讀已提交、可重復讀)
        持久性依賴持久化機制(RDB/AOF)依賴Redo Log和Binlog保證持久性
        使用場景簡單批量操作(如批量SET)復雜業務邏輯(如轉賬、訂單處理)
  3. Redis主從復制原理?哨兵模式如何實現故障轉移?
    1. 1. 主從復制原理
    2. 核心流程

      1. 全量同步(首次連接)

        • 從節點發送PSYNC ? -1命令請求同步。

        • 主節點執行BGSAVE生成RDB文件并發送給從節點,同時緩存期間的寫命令到復制緩沖區。

        • 從節點加載RDB后,主節點發送緩沖區中的寫命令使其追上最新狀態。

      2. 增量同步(斷線重連)

        • 從節點發送PSYNC <runid> <offset>,主節點根據offset從復制緩沖區發送增量數據。

        • 若復制緩沖區數據丟失(如緩沖區溢出),觸發全量同步。

    3. 關鍵配置

      • repl-backlog-size:調整復制緩沖區大小,避免頻繁全量同步。

    4. 2. 哨兵模式故障轉移流程

      哨兵(Sentinel)是Redis的高可用解決方案,負責監控、通知和自動故障轉移:

    5. 監控

      • 每個哨兵節點定期向主節點、從節點和其他哨兵發送PING命令檢測存活狀態。

    6. 主觀下線(SDOWN)

      • 若哨兵在down-after-milliseconds時間內未收到主節點的有效響應,標記其為主觀下線。

    7. 客觀下線(ODOWN)

      • 當超過半數哨兵認為主節點主觀下線,則標記為客觀下線。

    8. 選舉Leader哨兵

      • 通過Raft算法選舉一個Leader哨兵來執行故障轉移。

    9. 故障轉移

      • Leader哨兵從從節點列表中選出一個新的主節點(基于優先級、復制偏移量等)。

      • 向其他從節點發送SLAVEOF命令,使其復制新主節點。

      • 更新客戶端配置,通知其連接新主節點。

    10. 3. 客戶端感知故障轉移
    11. 客戶端通過訂閱哨兵的+switch-master事件獲取新主節點地址,或通過哨兵API動態查詢。

  • 三,高級

  1. Redis Cluster集群模式的數據分片原理?如何實現動態擴容?
    1. 數據分片原理
      Redis Cluster采用哈希槽(Hash Slot)機制進行數據分片,共有16384個槽位。每個鍵通過CRC16(key)計算哈希值,再對16384取模確定所屬槽位。集群中的每個節點負責一部分槽,數據分布由槽分配決定。客戶端請求時,若連接節點不負責該槽,會返回MOVED重定向錯誤,引導客戶端訪問正確節點。節點間通過Gossip協議交換集群狀態,維護槽分配信息的一致性。

      動態擴容實現

    2. 添加新節點:使用CLUSTER MEET將新節點加入集群。

    3. 遷移槽數據

      • 使用redis-cli --cluster reshard觸發槽重新分片。

      • 源節點將槽內鍵逐個遷移到目標節點,期間對正在遷移的鍵的請求,源節點返回ASK重定向,客戶端需重試到目標節點。

    4. 更新槽分配:遷移完成后,槽歸屬信息通過Gossip協議同步到整個集群。

    5. 副本擴展:新增副本節點通過CLUSTER REPLICATE同步主節點數據。

  2. Redis內存淘汰策略有哪些?如何設計大Key熱Key的解決方案?
    1. 內存淘汰策略(通過maxmemory-policy配置)

    2. noeviction:拒絕寫入新數據(默認)。

    3. volatile-ttl:淘汰過期時間最近的鍵。

    4. LRU/LFU策略

      • allkeys-lru/volatile-lru:基于最近最少使用。

      • allkeys-lfu/volatile-lfu:基于訪問頻率(4.0+)。

    5. 隨機淘汰allkeys-random/volatile-random

    6. 大Key解決方案

    7. 拆分:如將大Hash拆分為多個小Hash,通過鍵名后綴分片。

    8. 異步刪除:使用UNLINK代替DEL,非阻塞釋放內存。

    9. 壓縮:對Value進行壓縮(如GZIP),但會增加CPU開銷。

    10. 監控:通過redis-cli --bigkeys定期掃描大Key。

    11. 熱Key解決方案

    12. 多級緩存:本地緩存(如Guava)減少Redis訪問。

    13. 讀寫分離:通過副本節點分散讀壓力。

    14. 分片打散:使用Hash Tag(如{user1000}.profile)強制熱Key分布到同一節點,并增加副本。

    15. Proxy支持:如Twemproxy或Codis自動分散請求。

  3. Redis多線程模型演進(從單線程到IO多線程)?管道技術原理?
    1. 多線程演進

    2. 單線程模型(6.0前):單線程處理所有網絡I/O、命令解析和執行,避免鎖競爭,但無法利用多核CPU。

    3. I/O多線程(6.0+)

      • 多線程網絡I/O:主線程負責接收連接,I/O線程處理讀寫(配置io-threads啟用)。

      • 單線程命令執行:命令執行仍為單線程,保證原子性。

    4. 性能提升:高并發場景下,網絡I/O瓶頸緩解,吞吐量顯著提升。

    5. 管道技術(Pipeline)原理

    6. 批量發送:客戶端將多個命令打包發送,減少網絡往返次數(RTT)。

    7. 服務端順序執行:服務器按順序依次執行命令,全部完成后一次性返回結果。

    8. 優勢:適用于批量操作(如批量寫入),提升吞吐量。

    9. 注意點:不保證原子性,且返回結果需客戶端按序解析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74745.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74745.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74745.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【藍橋杯】好數

好數 問題描述代碼解釋代碼 好數 問題描述 一個整數如果按從低位到高位的順序&#xff0c;奇數位 (個位、百位、萬位 ? ) 上的數字是奇數&#xff0c;偶數位 (十位、千位、十萬位 ? ) 上的數字是偶數&#xff0c;我們就稱之為 “好數”。 給定一個正整數 N&#xff0c;請計算…

利用 Patroni + etcd + HAProxy 搭建高可用 PostgreSQL 集群

在生產環境中&#xff0c;數據庫的高可用性是系統穩定運行的關鍵。本文將詳細講解如何利用 Docker 部署一個由 etcd、Patroni 和 HAProxy 組成的 PostgreSQL 高可用集群&#xff0c;實現自動故障轉移和負載均衡。 架構概述 本架構主要包括三部分&#xff1a; etcd 集群 etcd …

bash 和 pip 是兩種完全不同用途的命令,分別用于[系統終端操作]和[Python 包管理]

bash 和 pip 是兩種完全不同用途的命令&#xff0c;分別用于 系統終端操作 和 Python 包管理。以下是它們的核心區別、用法及常見場景對比&#xff1a; 1. 本質區別 特性bashpip類型Shell 命令解釋器&#xff08;一種腳本語言&#xff09;Python 包管理工具作用執行系統命令、…

分布式系統的CAP理論、事務和鎖實現

分布式系統核心概念 1. CAP理論 CAP理論指出&#xff0c;分布式系統最多同時滿足以下三項中的兩項&#xff1a; 一致性&#xff08;CC&#xff09;&#xff1a;所有節點訪問同一份最新數據。可用性&#xff08;AA&#xff09;&#xff1a;每個請求都能在合理時間內獲得非錯誤…

鴻蒙UI開發

鴻蒙UI開發 本文旨在分享一些鴻蒙UI布局開發上的一些建議&#xff0c;特別是對屏幕寬高比發生變化時的應對思路和好的實踐。 折疊屏適配 一般情況&#xff08;自適應布局/響應式布局&#xff09; 1.自適應布局 1.1自適應拉伸 左右組件定寬 TypeScript //左右定寬 Row() { …

FreeRTOS 五種內存管理算法深度對比分析

FreeRTOS 提供了五種動態內存管理算法&#xff08;heap_1 至 heap_5&#xff09;&#xff0c;針對不同應用場景在實時性、內存效率、碎片控制等方面進行了差異化設計。以下從實現原理、性能指標及適用場景進行全面對比&#xff1a; 一、Heap_1&#xff1a;靜態分配優先 ?核心…

基于EFISH-SBC-RK3576的無人機智能飛控與數據存儲方案

一、方案背景 民用無人機在電力巡檢、農業植保、應急救援等領域快速普及&#xff0c;但傳統方案面臨?多協議設備兼容性差?、?野外環境數據易丟失?、?復雜電磁干擾?三大痛點。 電魚智能推出?EFISH-SBC-RK3576?&#xff0c;可集成雙冗余總線接口與工業級加固存儲&#x…

怎樣進行服務器的日常安全監控和審計?

服務器的日常安全監控和審計是保障服務器安全運行的重要措施&#xff0c;以下是一些常見的方法和工具&#xff1a; 系統日志監控 啟用日志功能&#xff1a;確保服務器操作系統、應用程序和數據庫等都啟用了詳細的日志記錄功能。例如&#xff0c;Linux 系統中的 syslog&#x…

數據庫----單表、多表

數據庫 create database 數據庫名稱;---創建數據庫create database 數據庫名稱 default charsetutf8mb4;---創建數據庫&#xff0c;同時指定編碼show databases;---查看當前數據庫管理下存在多少數據庫show databases like "db_%";---查詢以db_開頭的數據庫select d…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加行拖拽排序功能示例6,TableView16_06 分頁表格拖拽排序

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

遺傳算法優化支持向量機分類是一種將遺傳算法與支持向量機相結合的方法

遺傳算法優化支持向量機分類是一種將遺傳算法與支持向量機相結合的方法&#xff0c;旨在提高支持向量機的分類性能。以下是其相關內容的詳細介紹&#xff1a; 支持向量機&#xff08;SVM&#xff09; 原理&#xff1a;SVM是一種基于統計學習理論的機器學習方法&#xff0c;其…

Python中的Requests庫

什么是Python中的Requests模塊&#xff1f; requests模塊是Python中廣泛使用的庫&#xff0c;用于簡化HTTP請求的發送和響應處理。無論是調用API、下載文件、處理復雜會話管理&#xff0c;requests都能提供很好的解決方案。 一、基礎使用方法 1.GET請求 GET請求用于獲取服務…

復習MySQL20250327

第一章 基本操作 一、管理數據庫 難點&#xff1a;創建數據庫 輸入cmd的MySQL安裝路徑C:\Program Files\MySQL\MySQL Server 8.0\bin 1.查看所有數據庫 show databases; 2.創建數據庫 create database hsusers default charset utf8 collate utf8_general_ci;create data…

谷歌推出Gemini實時AI視頻功能,開啟智能交互新體驗

3月24日&#xff0c;谷歌發言人亞歷克斯約瑟夫向媒體證實&#xff0c;谷歌已開始向 Gemini Live 推出新的人工智能功能。這些功能使 Gemini 能夠“看到”用戶的屏幕內容&#xff0c;或通過智能手機攝像頭獲取畫面&#xff0c;并實時回答與之相關的問題。這一創新標志著人工智能…

Windows 新型零日漏洞:遠程攻擊可竊取 NTLM 憑證,非官方補丁已上線

近日&#xff0c;安全研究人員披露了一個新型 Windows 零日漏洞&#xff0c;影響從Windows 7和Server 2008 R2到最新Windows 11 v24H2及Server 2025的所有Windows操作系統版本。攻擊者只需誘使用戶在Windows資源管理器中查看惡意文件&#xff0c;即可利用該零日漏洞竊取NTLM&am…

一款超級好用且開源免費的數據可視化工具——Superset

認識Superset 數字經濟、數字化轉型、大數據等等依舊是如今火熱的領域&#xff0c;數據工作有一個重要的環節就是數據可視化。 看得見的數據才更有價值&#xff01; 現如今依舊有多數企業號稱有多少多少數據&#xff0c;然而如果這些數據只是呆在冷冰冰的數據庫或文件內則毫無…

作業14 (2023-05-22_const修飾指針)

第1題/共5題【單選題】 C程序常見的錯誤分類不包含:( ) A.編譯錯誤 B.鏈接錯誤 C.棧溢出 D.運行時錯誤 回答正確 答案解析: 棧溢出是運行時錯誤的一種,因此C程序不會將棧溢出錯誤單獨列出來,棧溢出包含在運行時錯誤中。 因此:選擇C 第2題/共5題【單選題】 以下關于…

《Tr0ll2 靶機滲透實戰:弱口令+SUID+兩種緩沖區溢出+ 提權完整+fcrackzip暴力破解+shellshock漏洞+臟牛三種root提權復盤》

Tr0ll2 1、主機發現 arp-scan -l 2、端口掃描 nmap -sS -sV 192.168.66.181 nmap -sS -A -T4 -p- 192.168.66.181 nmap --scriptvuln 192.168.66.181PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.4 (…

redis常用部署架構之redis分片集群。

redis 3.x版本后開始支持 作用&#xff1a; 1.提升數據讀寫速度 2..提升可用性 分片集群就是將業務服務器產生的數據儲存在不同的機器上。 redis分片集群的架構 如上圖所示&#xff0c;會將數據分散存儲到不同的服務器上&#xff0c;相比于之前來說&#xff0c;redis要處…

分布式數據庫介紹

分布式數據庫介紹 一、定義與核心概念 分布式數據庫是一種在物理上分散存儲、邏輯上統一管理的數據管理系統&#xff0c;其核心特征包括數據分布性、邏輯關聯性、場地透明性和可擴展性。根據最新定義&#xff0c;分布式數據庫需具備分布式事務處理能力、平滑擴展能力&#xf…