使用Redis的四個常見問題及其解決方案

Redis

緩存穿透

  • 定義:redis查詢一個不存在的數據,導致每次都查詢數據庫

  • 解決方案:

    1. 如果查詢的數據為空,在redis對應的key緩存空數據,并設置短TTL。

      因為緩存穿透通常是因為被惡意用不存在的查詢參數進行壓測攻擊,所以采取這種方式會導致大量的無用空間被占用,所以不推薦。

    2. 布隆過濾器,因為哈希沖突,所以可能誤判(計算出的下標位置會出現重復,導致不存在的元素被錯誤地判定為存在),實現框架:RedissonGuava

      1. bitmap(位圖):一個以bit為單位的數組,只存儲二進制01

      2. 原理:對于一個給定的 key,通過多個不同的 hash 函數 計算得到多個 hash 值,每個 hash 值對 m(bitmap 的大小) 進行 取模運算,得到對應的 bitmap 下標位置,并將這些位置的 bit 值設置為 1。讀取時,只需要判斷其對應的多個下標位置的元素值是否都為1即可

      3. 如何控制誤判率?調整參數:bitmap數組長度m、哈希函數個數k、元素數量n

      4. 支持刪除操作嗎?不支持,除非使用計數型布隆過濾器(整數數組,存計數值,即添加操作+1,刪除操作-1,如果所有計數值都大于0時,元素才可能存在)

      5. 布隆過濾器相比使用 set 的優點?

        • 空間占用: 布隆過濾器相比 set 可以顯著節省空間,因為它不存儲完整的元素,而是通過哈希映射到bit位

          查詢速度: 布隆過濾器通過少量哈希計算(O(k))就能快速判斷元素是否存在,在元素數量非常多時,可能比set數據更快,因為set可能需要遍歷鏈表/紅黑樹

        • bitmap都是01數據,適合集合運算(交、并、補)

緩存擊穿

  • 定義:給一個key設置過期時間,當key過期時,恰好對這個key有大量并發請求,在重建緩存這段時間可能導致數據庫壓力過大

  • 如何檢測?監控 Redis 的 keyspace_hits(命中緩存次數)keyspace_misses(未命中緩存次數),計算命中率

  • 解決方案:

    1. 互斥鎖(保證強一致性):在Redis查詢緩存未命中時,添加互斥鎖,然后查詢數據庫并重建緩存,再釋放鎖
    2. 邏輯過期+互斥鎖(高效):對熱點key不設置過期時間,而是給對應的數據添加一個過期時間的字段。過程:
      1. 在查詢緩存時發現邏輯時間已經過期,此時添加互斥鎖
      2. 開啟新子線程:查詢數據庫并重建緩存,釋放互斥鎖
      3. 主線程和其他發起請求的線程不需要等待該子線程(trylock),而是直接返回過期數據

緩存雪崩

  • 定義:在同一時段大量的緩存key同時失效或者Redis服務宕機,導致數據庫壓力過大
  • 解決方案:
    1. key失效:給不同key的TTL的原值加上隨機值
    2. 服務宕機Redis集群
    3. 通用:降級限流(nginx或spring cloud gateway),多級緩存

雙寫一致性

  • 定義:數據庫中的數據需要與Redis中的數據保持一致

  • 問題:

    1. 先刪除緩存再操作數據庫:在刪除完緩存操作數據庫這段期間,另一個線程重建完緩存
    2. 先操作數據庫再刪除緩存:在查詢完數據庫重建緩存這段期間,另一個線程修改了數據庫并刪除緩存。
  • 高一致性實現方案:

    1. 延遲雙刪:刪除緩存,修改數據庫,延遲一會再刪除緩存,延遲的原因是等待數據庫master同步到slave 。該方法的問題是延遲時間很難確定

    2. 讀數據時添加共享鎖:其他線程可共享讀操作

      寫數據時添加排他鎖:阻塞其他線程讀寫操作

  • 弱一致性實現方案:

    1. MQ:修改數據庫時,發布消息到mq中,由消費者來刪除緩存只能保證redis操作的可靠性
    2. Canal:監聽mysqlbinlog(日志文件),把更新后的日志同步到redis里面

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

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

相關文章

Java高級 | 【實驗一】Spring Boot安裝及測試 最新

隸屬文章:Java高級 | (二十二)Java常用類庫-CSDN博客 目錄 一、SpringBoot的特點 二、Spring Boot安裝及測試 (一)安裝Intellij IDEA (二)安裝MySQL (三)安裝postma…

Oracle RMAN自動恢復測試腳本

說明 此恢復測試腳本,基于rman備份腳本文章使用的fullbak.sh做的備份。 數據庫將被恢復到RESTORE_LO參數設置的位置。 在恢復完成后,執行一個測試sql,確認數據庫恢復完成,數據庫備份是好的。恢復測試數據庫的參數,比如SGA大小都…

從Java的JDK源碼中學設計模式之裝飾器模式

裝飾器模式是一種極具彈性的結構型設計模式,它允許我們通過組合的方式動態擴展對象功能而無需修改原有結構。本文將通過JDK源碼中的實際應用和通俗易懂的代碼示例,帶你深入了解這一強大模式的精髓。 裝飾器模式核心原理 裝飾器模式的核心思想&#xff…

調教 DeepSeek - 輸出精致的 HTML MARKDOWN

【序言】 不知道是不是我閑的蛋疼,對百度AI 和 DeepSeek 的回答都不太滿意。 DeepSeek 回答句子的引用鏈接,始終無法準確定位。有時鏈接只是一個域名,有時它給的鏈接是搜索串如: baidu.com/?q"搜索內容"。 百度AI 回答句子的引用…

第1章_數據分析認知_知識點筆記

來自:數據分析自學課程-戴戴戴師兄 逐字稿:【課程4.0】第1章_分析認知_知識點筆記 【課程4.0】第1章 分析認知 知識點總結 一、數據分析的本質認知 數據分析是什么? 不是酷炫看板、復雜模型或升值秘籍,而是認知世界的基礎方法。…

【從0-1的HTML】第2篇:HTML標簽

文章目錄 1.標題標簽2.段落標簽3.文本標簽brbstrongsubsup 4.超鏈接標簽5.圖片標簽6.表格標簽7.列表標簽有序列表ol無序列表ul定義列表dl 8.表單標簽9.音頻標簽10.視頻標簽11.HTML元素分類塊級元素內聯元素 12.HTML布局13.內聯框架13.內聯框架 1.標題標簽 標題標簽&#xff1a…

快速排序(Quick Sort)算法詳解(遞歸與非遞歸)

引言 在計算機科學中,排序算法是最基礎且重要的算法之一。快速排序(Quick Sort)作為一種高效的排序算法,在實際應用中被廣泛使用。平均時間復雜度為 (O(n log n)),最壞情況下為 (O(n^2))。本文將詳細介紹快速排序算法…

修改 vscode 左側導航欄的文字大小 (更新版)

新增, 個人常用 按 Ctrl Shift P 打開命令面板 輸入并選擇 : Developer: Toggle Developer Tools 打開開發者工具。 1. 起因, 目的: 問題: vscode 左側的文字太小了!!!我最火的一篇文章,寫的就是這個…

Kerberos面試內容整理-Kerberos 的配置與排障

正確配置 Kerberos 對其正常工作至關重要。在Linux/Unix環境下,Kerberos配置通常通過編輯配置文件(例如 /etc/krb5.conf)完成。其中指定了Realm名稱、KDC和管理員服務器地址、默認域到Realm的映射等參數。管理員需要在KDC端初始化數據庫并創建主體(可以使用 kadmin 等工具添…

Windows + CPU也能跑時序預測:TSLib框架快速上手與踩坑避雷

在時序預測領域,選擇一個成熟的框架往往能讓我們事半功倍。最近接手了一個緊急的時序預測項目,經過一番調研后,我選擇了TSLib(Time-Series-Library)這個優秀的開源框架來快速搭建整個預測流程。 由于開發環境限制在Windows平臺且沒有GPU支持,整個部署過程還是遇到了一些…

從 0 到 1:用 Trae 插件 Builder 模式開發端午包粽子小游戲

? 前言 Trae插件獲取:https://www.trae.com.cn/plugin 在編程的世界里,效率就是生命。我們開發者常常為了一個項目的搭建,重復著創建文件夾、初始化項目配置、編寫樣板代碼等一系列繁瑣的操作,耗費了大量的時間和精力。而如今…

React-native之Flexbox

本文總結: 我們學到了 React Native 的 Flexbox 布局,它讓寫樣式變得更方便啦!😊 Flexbox 就像一個有彈性的盒子,有主軸和交叉軸(行或列)。 在 RN 里寫樣式要用 StyleSheet.create 對象,屬性名…

Leetcode 1336. 每次訪問的交易次數

1.題目基本信息 1.1.題目描述 表: Visits ---------------------- | Column Name | Type | ---------------------- | user_id | int | | visit_date | date | ---------------------- (user_id, visit_date) 是該表的主鍵(具有唯一值的列的組合) 該表的每行表示 use…

騰訊云國際版和國內版賬戶通用嗎?一樣嗎?為什么?

在當今全球化的數字化時代,云計算服務成為眾多企業和個人拓展業務、存儲數據的重要選擇。騰訊云作為國內領先的云服務提供商,其國際版和國內版備受關注。那么,騰訊云國際版和國內版賬戶是否通用?它們究竟一樣嗎?背后又…

解鎖Java多級緩存:性能飛升的秘密武器

一、引言 文末有彩蛋 在當今高并發、低延遲的應用場景中,傳統的單級緩存策略往往難以滿足性能需求。隨著系統規模擴大,數據訪問的瓶頸逐漸顯現,如何高效管理緩存成為開發者面臨的重大挑戰。多級緩存架構應運而生,通過分層緩存設…

Android Kotlin 算法詳解:鏈表相關

前言 😊 在 Android 開發中,算法與數據結構是基本功之一,而鏈表(Linked List)作為常見的數據結構,經常出現在各類面試題與實際業務場景中。本文將以 Android Kotlin 為語言,結合 LeetCode 上的…

Blinko智能筆記系統實現跨平臺同步與隱私保護的完整技術方案解析

文章目錄 前言1. Docker Compose一鍵安裝2. 簡單使用演示3. 安裝cpolar內網穿透4. 配置公網地址5. 配置固定公網地址 推薦 ? 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。 點擊跳轉到網站 前言 是否…

【小紅書】API接口,獲取筆記列表

小紅書筆記列表API接口詳解 - 深圳小于科技助力高效數據對接 深圳小于科技(官網:https://www.szlessthan.com)提供的小紅書筆記列表API接口,幫助開發者快速獲取小紅書平臺筆記數據,實現高效內容管理與分析。 接口概述…

Qwen2.5-VL 損失函數

Qwen2.5-VL 損失函數 flyfish 文章名稱鏈接深入理解交叉熵損失 CrossEntropyLoss - 概率基礎鏈接深入理解交叉熵損失 CrossEntropyLoss - 對數鏈接深入理解交叉熵損失 CrossEntropyLoss - 概率分布鏈接深入理解交叉熵損失 CrossEntropyLoss - 信息論(交叉熵&#…

LeetCode 1524. 和為奇數的子數組數目

好的!讓我們詳細解釋 LeetCode 1524. 和為奇數的子數組數目 這道題的思路和解法。 題目: https://leetcode.cn/problems/number-of-sub-arrays-with-odd-sum/description/ 題目分析 問題描述: 給定一個整數數組 arr,返回其中和…