Redis——緩存擊穿、穿透、雪崩

1、緩存穿透:

(1)問題描述:key對應的數據并不存在,每次請求訪問key時,緩存中查找不到,請求都會直接訪問到數據庫中去,請求量超出數據庫時,便會導致數據庫崩潰。如一個用戶id不存在,數據庫與緩存都不存在該id,此時黑客便可以利用此漏洞不斷訪問該id,造成數據庫崩潰。

(2)解決方法:

①對空值緩存:如果一個查詢數據為空(不管數據是否存在),都對該空結果進行緩存,其過期時間會設置非常短。

②設置可以訪問名單:使用bitmaps類型定義一個可以訪問名單,名單id作為bitmaps的偏移量,每次訪問時與bitmaps中的id進行比較,如果訪問id不在bitmaps中,則進行攔截,不給其訪問。

③采用布隆過濾器:布隆過濾器可以判斷元素是否存在集合中,他的優點是空間效率和查詢時間都比一般算法快,缺點是有一定的誤識別率和刪除困難。

④進行實時監控:對于redis緩存中命中率急速下降時,迅速排查訪問對象和訪問數據,將其設置為黑名單。

2.緩存擊穿:

(1)問題描述:key中對應數據存在,當key中對應的數據在緩存中過期,而此時又有大量請求訪問該數據,緩存中過期了,請求會直接訪問數據庫并回設到緩存中,高并發訪問數據庫會導致數據庫崩潰。

(2)解決方案:

①預先設置熱門數據:在redis高峰訪問時期,提前設置熱門數據到緩存中,或適當延長緩存中key過期時間。

②實時調整:實時監控哪些數據熱門,實時調整key過期時間。

③對于熱點key設置永不過期。

3、緩存雪崩·:

(1)問題描述:key中對應數據存在,在某一時刻,緩存中大量key過期,而此時大量高并發請求訪問,會直接訪問后端數據庫,導致數據庫崩潰。

注意:緩存擊穿是指一個key對應緩存數據過期,緩存雪崩是大部分key對應緩存數據過期

正常訪問下如圖:

緩存失效瞬間如下圖:

(2)解決方法:

①構建多級緩存機制:nginx緩存+redis緩存+其他緩存。

②設置過期標志更新緩存:記錄緩存數據是否過期,如果過期會觸發另外一個線程去在后臺更新實時key的緩存。

③將緩存可以時間分散:如在原有緩存時間基礎上增加一個隨機值,這個值可以在1-5分鐘隨機,這樣過期時間重復率就會降低,防止大量key同時過期。

④使用鎖或隊列機制:使用鎖或隊列保證不會有大量線程一次性對數據庫進行讀寫,從而避免大量并發請求訪問數據庫,該方法不適用于高并發情況。


---------------------
作者:后端小猿
來源:CSDN
原文:https://blog.csdn.net/weixin_50616848/article/details/123939734
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

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

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

相關文章

數據庫性能系列之子查詢

前言說起數據庫,想必一些朋友會認為,數據庫不就是天天CRUD嗎?只要我掌握了這幾招,根本不在話下。是的,其實我也很贊同這個觀點,對于大多數應用程序來說,只掌握這些內容,是可以勝任日…

shell printf命令:格式化輸出語句

shell printf命令:格式化輸出語句注意:使用printf的腳本比使用echo移植性好。如同echo命令,printf命令可以輸出簡單的字符串:[rootmaster ~]#printf "Hello, Shell\n"Hello, Shellprintf不像echo那樣會自動提供一個換行…

UVa 10905 孩子們的游戲

https://vjudge.net/problem/UVA-10905 題意&#xff1a; 給定n個正整數&#xff0c;把它們連接成一個最大的整數。 思路&#xff1a; 實在是沒想到直接用string來排序了。 1 #include<iostream> 2 #include<algorithm>3 #include<string>4 using namespace …

laravel 內部驗證碼

為什么80%的碼農都做不了架構師&#xff1f;>>> 1.找到此文件composer.json 如下圖添加 "gregwar/captcha": "1.*" 行代碼 2.在命令行中執行 composer update 安裝完成后 3.找到控制器添加如下代碼 public function captcha($tmp) {//生成驗證…

k8s docker集群搭建

一、Kubernetes系列之介紹篇 1.背景介紹 云計算飛速發展 - IaaS - PaaS - SaaS Docker技術突飛猛進 - 一次構建&#xff0c;到處運行 - 容器的快速輕量 - 完整的生態環境 2.什么是kubernetes 首先&#xff0c;他是一個全新的基于容器技術的分布式架構領先方案。Kubernetes(k8…

leetcode 66 Plus One

給定一個數組&#xff0c;表示整數的各個位數&#xff0c;現要將其加上1&#xff0c;考慮進位。 vector<int> plusOne(vector<int>& digits) {int size digits.size();bool carry true;for (int i size - 1; i > 0; --i) {if (digits[i] 9 && c…

如何讓最小 API 綁定查詢字符串中的數組

前言在上次的文章中&#xff0c;我們實現了《讓 ASP.NET Core 支持綁定查詢字符串中的數組》&#xff1a;[HttpGet] public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values) {return string.Join(" ", values.Select(p…

Kubernetes api-server源碼閱讀2(Debug Kubernetes篇)

云原生學習路線導航頁&#xff08;持續更新中&#xff09; 本文是 Kubernetes api-server源碼閱讀 系列第二篇&#xff0c;主要講述如何實現 kubernetes api-server 的 debug 參考b站視頻地址&#xff1a;Kubernetes源碼開發之旅二 1.本篇章任務 Go-Delve&#xff1a;go語言的…

webrtc 視頻 demo

webrtc 視頻 demo webrtc網上封裝的很多&#xff0c;demo很多都是一個頁面里實現的&#xff0c;今天實現了個完整的 &#xff0c; A 發視頻給 BA webrtc.html作為offer <!DOCTYPE html> <html id"home" lang"en"><head><meta http-e…

條件注釋判斷瀏覽器版本!--[if lt IE 9](轉載)

<!--[if !IE]><!--> 除IE外都可識別 <!--<![endif]--> <!--[if IE]> 所有的IE可識別 <![endif]--> <!--[if IE 6]> 僅IE6可識別 <![endif]--> <!--[if lt IE 6]> IE6以及IE6以下版本可識別 <![endif]--> <!--[if …

[轉]阿里開源低代碼引擎LowCodeEngine

一、什么是低代碼引擎 低代碼引擎是具備強大擴展能力的低代碼研發框架&#xff0c;使用者只需要基于低代碼引擎便可以快速定制符合自己業務需求的低代碼平臺。同時&#xff0c;低代碼引擎還在標準低代碼設計器的基礎上提供了簡單易用的定制擴展能力&#xff0c;能夠滿足業務獨特…

Beyond Istio OSS——Istio服務網格的現狀與未來

作者&#xff1a;宋凈超&#xff08;Jimmy Song&#xff09;&#xff0c;原文地址&#xff1a;https://jimmysong.io/blog/beyond-istio-oss/本文根據筆者在 GIAC 深圳 2022 年大會上的的演講《Beyond Istio OSS —— Istio 的現狀及未來》[1] 整理而成&#xff0c;演講幻燈片見…

js多維數組扁平化

數組扁平化&#xff0c;就是將多維數組碾平為一維數組&#xff0c;方便使用。 一&#xff1a;例如&#xff0c;一個二維數組 var arr [a, [b, 2], [c, 3, x]]&#xff0c;將其扁平化&#xff1a; 1. 通過 apply 借用數組的 concat 方法&#xff1a; [].concat.apply([], arr)…

第16講 用戶程序的結構與執行

轉載于:https://www.cnblogs.com/atuo/p/5609843.html

兩種方法清除Excel保護密碼

一、利用VBA腳本直接清除 打Excel&#xff0c;打開腳本編輯器&#xff08;AltF11&#xff09;或者如圖&#xff0c;右鍵sheet名稱 輸入代碼并運行&#xff0c;即可清除密碼保護&#xff1a; Sub DeletePW()ActiveSheet.Protect DrawingObjects:True, Contents:True, AllowFil…

jsonp-反向代理-CORS解決JS跨域問題的個人總結

jsonp-反向代理-CORS解決JS跨域問題的個人總結 網上說了很多很多&#xff0c;但是看完之后還是很混亂&#xff0c;所以我自己重新總結一下。解決 js 跨域問題一共有8種方法&#xff0c; jsonp&#xff08;只支持 get&#xff09;反向代理CORSdocument.domain iframe 跨域windo…

URAL 1682 Crazy Professor (并查集)

【題目鏈接】 http://acm.timus.ru/problem.aspx?space1&num1682 【題目大意】 給出k&#xff0c;從1開始不斷地加一并把這個數寫在黑板上&#xff0c;如果寫上的數字和之前的數字滿足   (ab*b)%k0或者(ba*a)%k0就在他們之間連一條線&#xff0c;如果黑板上出現環就結束…

利用Python隨機或暴力生成密碼

""" Title: python 密碼生成 Author: JackieZheng Date: 2022-04-09 12:47:33 LastEditTime: 2022-04-09 14:00:46 LastEditors: Please set LastEditors Description: FilePath: \\pythonCode\\python_pwd_generater.py """import itertools im…

EasyNetQ-用于使用 RabbitMQ 的 .NET API開源的工具庫

Part1介紹EasyNetQ 的目標是提供一個庫&#xff0c;用于在 .NET 中使用 RabbitMQ 盡可能簡單。為了做到這一點&#xff0c;它通過強制執行一些簡單的約定來以靈活性換取簡單性。這些包括&#xff1a;消息應該由 .NET 類型表示。消息應按其 .NET 類型進行路由。這意味著消息是由…

python 中 __name__ 的使用

1. 如果模塊是被導入&#xff0c;__name__的值為模塊名字2. 如果模塊是被直接執行&#xff0c;__name__的值為’__main__’Py1.py #&#xff01;/usr/bin/env python def test():print __name__ ,__name__ if __name__ __main__:test() Py2.py #&#xff01;/usr/bin/env pyt…