19 redis緩存數據同步問題

1、緩存穿透

指緩存和數據庫中都沒有的數據,而用戶不斷發起請求。由于緩存不命中,并且出于容錯考慮,如果從存儲層查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到存儲層去查詢,緩存就沒有意義了。

在流量大時,可能DB就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。

解決方案

  1. 從緩存取不到的數據,在數據庫中也沒有取到,這時也可以將key-value對寫為key-null,緩存有效時間可以設置短點,如30秒。
  2. 布隆過濾器。bloomfilter就類似于一個hash set,用于快速判某個元素是否存在于集合中,其典型的應用場景就是快速判斷一個key是否存在于某容器,不存在就直接返回。
2、緩存擊穿

主要針對的是熱點key
緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由于并發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力。
解決方案

  1. 設置熱點數據永遠不過期。
  2. 接口限流與熔斷,降級。重要的接口一定要做好限流策略,防止用戶惡意刷接口,同時要降級準備,當接口中的某些 服務 不可用時候,進行熔斷,失敗快速返回機制。
  3. 加互斥鎖。
3、緩存雪崩

緩存中數據大批量過期,而查詢數據量巨大,引起數據庫壓力過大甚至down機。
緩存擊穿指并發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
解決方案

  1. 緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
  2. 如果緩存數據庫是分布式部署,將熱點數據均勻分布在不同的緩存數據庫中。
  3. 設置熱點數據永遠不過期。
4、緩存污染

緩存污染問題說的是緩存中一些只會被訪問一次或者幾次的的數據,被訪問完后,再也不會被訪問到,但這部分數據依然留存在緩存中,消耗緩存空間。

緩存污染會隨著數據的持續增加而逐漸顯露,隨著服務的不斷運行,緩存中會存在大量的永遠不會再次被訪問的數據。緩存空間是有限的,如果緩存空間滿了,再往緩存里寫數據時就會有額外開銷,影響Redis性能。

一般性建議緩存容量設置為總數據量的 15%30%,兼顧訪問性能和內存空間開銷。

5、緩存淘汰策略

主要分成三大類

  1. 不淘汰:noeviction (v4.0后默認的)
  2. 設置了過期時間的數據:
    隨機:volatile-random
    ttl:volatile-ttl
    lru:volatile-lru
    lfu:volatile-lfu
  3. 全部淘汰:
    隨機:allkeys-random
    lru:allkeys-lru
    lfu:allkeys-lfu
5.1、緩存淘汰策略詳解
  1. noeviction: 該策略是Redis的默認策略,一旦緩存被寫滿了,再有寫請求來時,Redis 不再提供服務,而是直接返回錯誤。這種策略不會淘汰數據,所以無法解決緩存污染問題。一般生產環境不建議使用。
  2. volatile-random: 在設置了過期時間的鍵值對中,進行隨機刪除。因為是隨機刪除,無法把不再訪問的數據篩選出來,所以可能依然會存在緩存污染現象,無法解決緩存污染問題。
  3. volatile-ttl: 參考的指標比隨機刪除時多進行一步過期時間的排序。Redis在篩選需刪除的數據時,越早過期的數據越優先被選擇。
  4. volatile-lru: 按照最近最少使用的原則來篩選數據。這種模式下會使用 LRU 算法篩選設置了過期時間的鍵值對。
  5. volatile-lfu: 使用 LFU 算法選擇設置了過期時間的鍵值對.
    LFU 算法:LFU 緩存策略是在 LRU 策略基礎上,為每個數據增加了一個計數器,來統計這個數據的訪問次數。當使用 LFU 策略篩選淘汰數據時,首先會根據數據的訪問次數進行篩選,把訪問次數最低的數據淘汰出緩存。如果兩個數據的訪問次數相同,LFU 策略再比較這兩個數據的訪問時效性,把距離上一次訪問時間更久的數據淘汰出緩存。
6、數據庫和緩存一致性問題

加入redis換粗后的一般的業務場景如下:
在這里插入圖片描述
讀取緩存步驟一般沒有什么問題,但是一旦涉及到數據更新:數據庫和緩存更新,就容易出現緩存(Redis)和數據庫(MySQL)間的數據一致性問題。

不管是先寫MySQL數據庫,再刪除Redis緩存;還是先刪除緩存,再寫庫,都有可能出現數據不一致的情況。

總結:

讀的時候,先讀緩存,緩存沒有的話,就讀數據庫,然后取出數據后放入緩存,同時返回響應。
更新的時候,先更新數據庫,然后再刪除緩存。

6.1、緩存一致性的解決方案

在更新數據庫成功后,刪除緩存key不一定生效的,解決方案是什么?

方案1:隊列 + 重試機制
在這里插入圖片描述
流程如下所示:

1.更新數據庫數據;
2.緩存因為種種問題刪除失敗
3.將需要刪除的key發送至消息隊列
4.自己消費消息,獲得需要刪除的key
5.繼續重試刪除操作,直到成功

該方案有一個缺點,對業務線代碼造成大量的侵入。于是有了方案2

方案2:異步更新緩存(基于訂閱binlog的同步機制)
在這里插入圖片描述
整體思路:MySQL binlog增量訂閱消費+消息隊列+增量數據更新到redis

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

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

相關文章

掌控安全 -- header注入

http header注入 該注入是指利用后端驗證客戶端口信息(比如常用的cookie驗證)或者通過http header中獲取客戶端的一些信息(比如useragent用戶代理等其他http header字段信息),因為這些信息是會重新返回拼接到后臺中的&…

JAVA定時任務技術總結

在日常的項目開發中,多多少少都會涉及到一些定時任務的需求。例如每分鐘掃描超時支付的訂單,每小時清理一次數據庫歷史數據,每天統計前一天的數據并生成報表,定時去掃描某個表的異常信息(最終一致性的方案也可能涉及&a…

java面試題-描述下Object中常用的方法

遠離八股文,面試大白話,通俗且易懂 看完后試著用自己的話復述出來。有問題請指出,有需要幫助理解的或者遇到的真實面試題不知道怎么總結的也請評論中寫出來,大家一起解決。 java面試題匯總-目錄-持續更新中 這個沒辦法&#xff0c…

31、卷積 - 參數 dilation 以及空洞卷積

在卷積算法中,還有一個不常見的參數叫做dilation(中文:膨脹)。 很多同學可能沒聽說過這個參數,下面看看這個參數有什么作用,用來控制什么的。 我們還是放這個經典的卷積運算圖,圖中是看不出 dilation 這個參數的存在的。 如果再換一張圖呢,發現兩圖的區別了嗎? 沒錯…

怎么去評估數據資產?一個典型的政務數據資產評估案例

據中國資產評估協會《數據資產評估指導意見》,數據資產評估主要是三個方法:市場法、成本法和收益法。之前小億和大家分享了數據資產評估方法以及價值發揮的路徑,今天結合一個案例來具體講解一下怎么去評估數據資產。 這個案例是一個典型的一個…

tmux常見會話管理命令

tmux常見會話管理命令 新建會話 tmux new -s <session-name> 查看會話 會話內外都可以用tmux ls或者tmux list-session 分離會話 如果命令行可以輸入命令&#xff0c;則可以選擇輸入命令tmux detach 如果命令行沒法輸入命令&#xff0c;可以按下commandb以后按d …

SAM+使用SAM應用數據集完成分割

什么是SAM&#xff1f; SAM(Segment Anything Model&#xff09;是由 Meta 的研究人員團隊創建和訓練的深度學習模型。在 Segment everything 研究論文中&#xff0c;SAM 被稱為“基礎模型”。 基礎模型是在大量數據上訓練的機器學習模型&#xff08;通常通過自監督或半監督學習…

CV計算機視覺每日開源代碼Paper with code速覽-2023.12.6

點擊計算機視覺&#xff0c;關注更多CV干貨 論文已打包&#xff0c;點擊進入—>下載界面 點擊加入—>CV計算機視覺交流群 1.【基礎網絡架構&#xff1a;Transformer】Rejuvenating image-GPT as Strong Visual Representation Learners 論文地址&#xff1a;https://a…

云原生Kubernetes系列 | Docker/Kubernetes的卷管理

云原生Kubernetes系列 | Docker/Kubernetes的卷管理 1. Docker卷管理2. Kubernetes卷管理2.1. 本地存儲2.1.1. emptyDir2.1.2. hostPath2.2. 網絡存儲2.2.1. 使用NFS2.2.2. 使用ISCSI2.3. 持久化存儲2.3.1. PV和PVC2.3.2. 訪問模式2.3.3. 回收策略1. Docker卷管理

從零開始搭建企業管理系統(六):RBAC 權限管理設計

RBAC 權限管理設計 前言權限分類功能權限設計什么是 RBACRBAC 組成RBAC 模型分類基本模型RBAC0角色分層模型RBAC1角色限制模型RBAC2統一模型RBAC3 RBAC0 權限設計用戶管理角色管理權限管理關聯表 總結 前言 作為一個后臺管理系統&#xff0c;權限管理是一個繞不開的話題&#…

視頻剪輯:視頻創意制作,背景圖片融合視頻制作畫中畫效果

隨著社交媒體的興起&#xff0c;視頻制作不再僅僅是專業人士的專利。每個人都可以通過一些技巧&#xff0c;創作出獨特而富有吸引力的視頻內容。視頻剪輯是一種非常重要的技術&#xff0c;它能讓視頻從平淡無奇變為生動有趣。背景圖片融合視頻制作畫中畫效果&#xff0c;也能增…

vm的centos本地配置yum

vm的centos本地配置yum 關于上篇文章vmware安裝centos7總結 出現關于配置yum源wget找不到命令&#xff0c;但是沒安裝yum就沒法下載wget&#xff0c;也就沒法使用wget 所以我們本地配置yum源&#xff0c;不用wget那個命令了 &#x1f4d5;步驟&#xff1a; cd /etc/yum.repo…

springboot利用easyexcel在瀏覽器中下載excel

前言 項目中操作excel是一種很常用的功能&#xff0c;比如下載一份excel的報價單。這篇文章會介紹一款excel的處理工具以及導出遇到的三個常見異常(重要)。 之前遇到一個這樣的需求&#xff1a;后臺管理頁面&#xff0c;點擊下載按鈕&#xff0c;下載一份excel格式的報價清單…

《人工智能導論》知識思維導圖梳理【1~5章節】

文章目錄 說明第一章 緒論人工只能概述 第二章 知識表示和知識圖譜一階謂詞邏輯和知識表示法產生式表示和框架表示法 第三章 確定性推理方法推理的基本概念自然演繹推理歸結演繹推理謂詞公式化子句集魯賓孫歸結原理歸結反演歸結反演求解問題 第四章 不確定性推理方法似然推理可…

npm run build時提示vue/types/jsx.d.ts中的錯誤

解決方法一&#xff1a; 可能是因為vue版本過高引起的 我直接將package.json中vue以及vue-template-compiler的版本的前面^去掉&#xff0c;安裝指定的版本 注意&#xff1a;vue和vue-template-compiler需要版本一致 參考鏈接&#xff1a;鏈接 解決方法二&#xff1a; 如果如…

線上問題得解決

問題&#xff1a; 最近碰到一個比較棘手但是比較低級的問題&#xff0c;一直沒有找到原因&#xff0c;苦找了兩天才發現問題。場景就是訂單做了某一個操作之后&#xff08;比如揀貨完成&#xff09;然后到下一步&#xff08;下道口&#xff09;。 但是線上幾萬筆訂單 &#xf…

QT使用SQLite 超詳細(增刪改查、包括對大量數據快速存儲和更新)

QTSQLite 在QT中使用sqlite數據庫&#xff0c;有多種使用方法&#xff0c;在這里我只提供幾種簡單&#xff0c;代碼簡短的方法&#xff0c;包括一些特殊字符處理。在這里也給大家說明一下&#xff0c;如果你每次要存儲的數據量很大&#xff0c;建議使用事務&#xff08;代碼中…

canvas 有趣的彈簧效果

先上效果 兩個小球之間有一根彈簧&#xff0c;這里有一條線表示&#xff0c;其中左球固定&#xff0c;在點擊開始后&#xff0c;右球開始做自由落體 思路 先做受力分析 經過受力分析可以發現&#xff0c;整個系統一共有三個力在起作用&#xff0c;我們分別把他們求出來并合成…

控制臺打印如來佛圖像

代碼 System.out.println(" _ooOoo_ \n"" o8888888o \n"" 88 \".\" 88 …

python——第十七天

方法重寫(overwrite) 、方法覆蓋(override )&#xff1a;在繼承的基礎上&#xff0c;子類繼承了父類的方法&#xff0c;如果不能滿足自己使用&#xff0c;我們就可以重寫或覆蓋該方法 函數重載(overload)&#xff1a; 在強數據類型的編程語言中(如Java、C、C等等): 函數名稱…