4.18---緩存相關問題(操作原子性,擊穿,穿透,雪崩,redis優勢)

為什么要用redis做一層緩存,相比直接查mysql有什么優勢?

首先介紹Mysql自帶緩存機制的問題:

MySQL 的緩存機制存在一些限制和問題,它自身帶的緩存功能Query Cache只能緩存完全相同的查詢語句,對于稍有不同的查詢語句,即使查詢的是相同的數據,也無法命中緩存。而且數據庫中數據發生變化時,也不會自動更新;此外Query Cache 的緩存命中率也會受到并發訪問的影響,當多個并發查詢同時訪問同一個數據時,可能會導致緩存的命中率下降。

然后介紹相比起MySQL ,redis緩存的一些優勢:

1.數據類型豐富

Redis 支持多種數據類型,包括字符串、哈希、列表、集合和有序集合等。多種數據類型可以保證它能實現更多功能(例如排序)

2.可以內存管理

Redis 將所有數據存儲在內存中,因此讀寫速度非常快。同時,Redis 也提供了一些內存管理的功能,例如可以設置數據的過期時間,當數據過期時會自動從內存中刪除。避免浪費內存資源。

3.支持高并發

Redis 是單線程的,通過使用事件驅動的方式處理客戶端請求。單線程模型,可以避免了多線程之間的競爭,省去了多線程切換帶來的時間和性能上的開銷,也不會導致死鎖

4.支持持久化

??Redis 提供了兩種持久化方式,分別是 RDB(Redis Database)和 AOF(Append Only File)。RDB 是將內存中的數據定期保存到磁盤上,而 AOF 則是將每個寫操作追加到文件中。這兩種方式可以保證數據的持久化,即使 Redis 重啟或崩潰,也可以通過加載持久化文件來恢復數據。

如何保證緩存與數據庫的操作的同時成功或失敗?

1.雙寫模式(Cache-Aside Pattern)

先更新數據庫,再刪除緩存

如果緩存刪除失敗,可以通過重試機制或異步隊列處理

2. 事務消息

使用支持事務的消息隊列(如RocketMQ)將緩存操作作為事務的一部分只有數據庫操作成功后,才會提交緩存操作

3. 數據庫binlog監聽

使用Canal、Debezium等工具監聽數據庫binlog將變更事件同步到緩存確保最終一致性

?

緩存穿透、緩存擊穿、緩存雪崩,什么是緩存xx?如何解決這個問題?這幾個解決方案各自的優勢和缺點分別是什么?

緩存穿透

介紹:

指客戶端請求的數據在緩存和數據庫中都不存在,緩存永遠不會生效,請求都會打到數據庫。

解決方案:

方案

介紹

優點

缺點

緩存空對象

對查詢結果為null的key也進行緩存

實現簡單

可能緩存大量無效數據

布隆過濾器

底層是一個二進制數組,進行哈希映射。(數據key先訪問布隆濾波器,不存在直接返回,存在進入redis)

空間效率高

存在誤判的情況。(哈希沖突)

存在數據更新問題。(數據庫更新要同步更新布隆過濾器)

數據校驗

加強用戶id校驗;做好數據的基礎格式校驗

輕量級

防御范圍有限

熱點參數限流

能力有限

緩存雪崩

介紹:

同一時段大量的緩存key同時失效或者Redis服務宕機,導致大量請求到達數據庫,帶來巨大壓力。

解決方案:

方案

介紹

優點

缺點

錯開過期時間

給不同的Key的TTL(過期時間)添加隨機值

簡單

無法應對宕機

多級緩存

本地緩存+分布式緩存

可靠性高

成本高

熔斷降級

緩存不可用時啟用降級策略

保護系統

影響用戶體驗(因為一直返回默認信息)

集群部署

Redis集群保證高可用

緩存擊穿

介紹:

熱點Key問題的特殊情況,一個被高并發訪問并且緩存重建業務較復雜的key突然失效了(過期時間),無數請求都無法從緩存中獲取數值轉而都開始訪問數據庫

解決方案:

方案

介紹

優點

缺點

互斥鎖

線程并行訪問會崩潰的話就把訪問變成串行,tryLock+double check實現

沒有額外內存消耗

保證一致性

實現簡單

可能性能瓶頸

可能死鎖

邏輯過期

將過期時間設置到redis的value中,線程1查緩存,通過value判斷出來已過期,獲得鎖,然后開啟新線程進行緩存數據重建以及重新設置過期時間。期間有其他線程訪問緩存數據只會返回過期數據。

線程無需等待

性能較好

不保證一致性

有額外內存消耗(新線程)

實現較復雜

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

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

相關文章

健康養生指南

在快節奏的現代生活中,健康養生成為人們關注的焦點。它不僅關乎身體的強健,更是提升生活質量、預防疾病的關鍵。掌握科學的養生方法,能讓我們在歲月流轉中始終保持活力。 飲食是健康養生的基礎。遵循 “均衡膳食” 原則,每日飲食需…

#去除知乎中“鹽選”付費故事

添加油猴腳本,去除知乎中“鹽選”付費故事 // UserScript // name 鹽選內容隱藏腳本 // namespace http://tampermonkey.net/ // version 0.2 // description 自動隱藏含有“鹽選專欄”或“鹽選”文字的回答卡片 // author YourName // mat…

如何防止接口被刷

目錄 🛡? 一、常見的防刷策略分類 🔧 二、技術實現細節 ? 1. 基于 IP 限流 ? 2. 給接口加驗證碼 ? 3. 使用 Token 限制接口訪問權限 ? 4. 給接口加冷卻時間(驗證碼類經典) ? 5. 使用滑動窗口限流算法(更精…

github 項目遷移到 gitee

1. 查看遠程倉庫地址 git remote -v 2. 修改遠程倉庫地址 確保 origin 指向你的 Gitee 倉庫,如果不是,修改遠程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…

探索大語言模型(LLM):目標、原理、挑戰與解決方案

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言語言模型的目標語言模型的數學表示語言模型面臨的挑戰解決參數量巨大的方法1. 馬爾可夫假設2. 神經網絡語言模型3.自監督學習4. 分布式表示 腦圖總結 前言 在自…

Kubernetes》》k8s》》Namespace

Namespace 概述 Namespace(命名空間) 是 Kubernetes 中用于邏輯隔離集群資源的機制,可將同一集群劃分為多個虛擬環境,適用于多團隊、多項目或多環境(如開發、測試、生產)的場景。 核心作用: 資…

FFUF指南

ffuf 的核心功能: 目錄/文件發現: 通過暴力破解(使用字典)探測目標網站的隱藏目錄或文件,例如: ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚舉: 通過模糊測試發現目標…

Qt通過ODBC和QPSQL兩種方式連接PostgreSQL或PolarDB PostgreSQL版

一、概述 以下主要在Windows下驗證連接PolarDB PostgreSQL版(阿里云兼容 PostgreSQL的PolarDB版本)。Linux下類似,ODBC方式則需要配置odbcinst.ini和odbc.ini。 二、代碼 以下為完整代碼,包含兩種方式連接數據庫,并…

為什么浮點數會搞出Infinity和NAN兩種類型?浮點數的底層原理?IEEE 754標準揭秘?

目錄 什么是NAN? 不同編程語言的NaN 為什么浮點數會搞出Infinity和NAN兩種類型? 浮點數 小數點位置浮動的原因 浮點數和整數 浮點數指令 精確性 浮點數的類型 為什么叫浮點數? 小數點位置浮動的原因 IEEE 754起源于intel公司 IEEE 754標準 編程語言的浮點數都…

Node.js Session 原理簡單介紹 + 示例代碼

目錄 ? Session 原理簡要說明 🧩 示例項目 - 使用 Node.js Express 實現簡單 Session 登錄 📁 文件結構 🔹 server.js (JavaScript) 🔸 index.html (HTML) ?? 程序運行步驟 ? 程序運行效果 🎯 總結 在 We…

實戰交易策略 篇十六:獵豹阿杜打板交易策略

文章目錄 系列文章狙擊漲停板的十大要訣炒股大成者,必具“三商”系列文章 實戰交易策略 篇一:奧利弗瓦萊士短線交易策略 實戰交易策略 篇二:杰西利弗莫爾股票大作手操盤術策略 實戰交易策略 篇三:333交易策略 實戰交易策略 篇四:價值投資交易策略 實戰交易策略 篇五:底部…

Opentelemetry 項目解讀

Opentelemetry 解讀 1. 什么是 Opentelmetry Ot 統一了可觀測的三個重要維度:分別是 Trace,Log,Metrics。 在沒有 ot 之前,不同維度的可觀測組件都是不同的: 在 Trace 領域:skywalking 一直很受歡迎&am…

與終端同居日記:Linux指令の進階撩撥手冊

前情提要: 當你和終端的關系從「早安打卡」進階到「深夜代碼同居」,那些曾經高冷的指令開始展露致命の反差萌—— man 是那個永遠在線的鋼鐵直男說明書,只會說:"想懂我?自己看文檔!"&#xff08…

Java 開發玩轉 MCP:從 Claude 自動化到 Spring AI Alibaba 生態整合

摘要 本文以原理與示例結合的形式講解 Java 開發者如何基于 Spring AI Alibaba 框架玩轉 MCP,主要包含以下內容。 1. 一些 MCP 基礎與快速體驗(熟悉的讀者可以跳過此部分) 2. 如何將自己開發的 Spring 應用發布為 MCP Server,驗…

【面試向】欠擬合和過擬合、正則化(Regularization)

訓練集、驗證集和測試集泛化誤差過擬合(Overfitting)和 欠擬合(Underfitting)如何區分過擬合和欠擬合?欠擬合 —— 在訓練集和驗證集上都表現很差過擬合 —— 在訓練集上表現很好,但在驗證集或測試集上表現…

ClawCloud的免費空間(github用戶登錄可以獲得$5元/月的免費額度)

免費的空間 Welcome to ClawCloud Lets create your workspace 官網:ClawCloud | Cloud Infrastructure And Platform for Developers 區域選擇新加坡 然后這個頁面會變成新加坡區域,再按一次確定,就創建好了工作臺。 初始界面&#xff0…

Spring Boot + Caffeine:打造高性能緩存解決方案

1. 引言 1.1 緩存的重要性 緩存是提升系統性能的關鍵技術之一,通過將頻繁訪問的數據存儲在內存中,減少對數據庫或其他外部系統的訪問次數,從而降低延遲并提高吞吐量。 緩存的基本概念:緩存是一種臨時存儲機制,用于快速訪問常用數據。緩存在提升系統性能中的作用:減少數…

每天學一個 Linux 命令(24):chattr

??可訪問網站查看,視覺品味拉滿: http://www.616vip.cn/24/index.html 每天學一個 Linux 命令(24):chattr 命令簡介 chattr(Change Attribute)用于修改文件或目錄的底層屬性(如防刪除、防修改),這些屬性比普通權限更嚴格。常用于保護重要文件或優化文件系統行為。…

【java 13天進階Day04】常用API、正則表達式,泛型、Collection集合API

Math類的使用。 Math用于做數學運算。Math類中的方法全部是靜態方法,直接用類名調用即可。方法: public static int abs(int a) 獲取參數a的絕對值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…

如何系統地入門學習stm32?

如何系統地入門學習stm32? 作為一個在嵌入式領域摸爬滾打十余年的工程師,看到這個問題,我不禁想起自己當年啃著厚重的數據手冊,對著一塊藍色的PCB板冥思苦想的日子。STM32的學習之路,說難不算特別難,說簡單…