Redis原理之緩存

上篇文章:

Redis原理之集群https://blog.csdn.net/sniper_fandc/article/details/149141342?fromshare=blogdetail&sharetype=blogdetail&sharerId=149141342&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目錄

1 Redis作為MySQL緩存

2 緩存更新策略

2.1 定期生成

2.2 實時生成

3 緩存預熱(Cache preheating)

4 緩存穿透(Cache penetration)

5 緩存雪崩(Cache avalanche)

6 緩存擊穿(Cache breakdown)


????????由于Redis基于內存,比基于磁盤的數據庫查詢效率(讀請求)快的多,因此Redis常用于作為MySQL數據庫的緩存。而內存成本高,因此通常只往內存存儲少量的熱點數據。

1 Redis作為MySQL緩存

????????關系型數據庫比如MySQL查詢效率一般比較慢,有如下原因:

????????1.基于磁盤,磁盤IO速度慢。

????????2.如果查詢不能命中索引,就需要遍歷表,增加磁盤IO次數。

????????3.關系型數據庫會對執行的SQL進行一些解析、校驗、優化等工作,進一步增加耗時。

????????4.如果是復雜查詢,比如涉及到多表聯查,笛卡爾積的時間復雜度O(M*N),效率就更低了。

????????因此在高并發的環境下,只使用MySQL很容易宕機。為了優化系統性能,提高系統并發量,有兩種方式:1.增加MySQL集群,但是成本很高。2.使用Redis作為緩存。方式2就是業界常用的方式:

????????注意:這種方式只是加快了讀請求的查詢效率,而寫請求緩存并不能加快效率,還是需要寫到MySQL中。

2 緩存更新策略

2.1 定期生成

????????定期對訪問的數據進行頻次統計(通常基于日志分析),選取頻次最高的那部分數據作為熱點數據存入緩存中。

????????優點:實現簡單,過程可控,方便排查問題。

????????缺點:數據實時性不夠。

2.2 實時生成

????????實時生成就是當Redis查詢未命中時,服務器就會去MySQL數據庫查詢,并將查詢的數據寫入到Redis緩存中。

????????優點:數據具有實時性。

????????缺點:緩存容易很快就寫滿。

????????正因為這樣的缺點,就需要合適的內存淘汰策略來更新:

????????FIFO:先進先出,緩存時間最久的數據先淘汰。

????????LRU:淘汰最久未使用,每個數據設置最近訪問時間,優先淘汰最近訪問時間最久的數據。

????????LFU:淘汰最少使用的,每個數據設置最近一段時間訪問次數,優先淘汰訪問次數最少的數據。

????????Random:隨機淘汰。

????????而Redis內部也用到了這些策略思想,并按照key是否設置過期時間對這些策略進行了細化:

????????volatile-lru:針對設置了過期時間的key(只要設置了過期時間,即使還沒過期,如果內存滿了又有新數據寫入就會淘汰),按照LRU思想淘汰。

????????allkeys-lru:針對所有的key,按照LRU思想淘汰。

????????volatile-lfu:針對設置了過期時間的key,按照LFU思想淘汰。

????????allkeys-lfu:針對所有的key,按照LFU思想淘汰。

????????volatile-random:針對設置了過期時間的key,隨機淘汰。

????????allkeys-random:針對所有的key,隨機淘汰。

????????volatile-ttl:按照ttl(生存時間,也就是設置了過期時間的key),越早過期越優先淘汰(局限于設置了過期時間key的FIFO)。

????????noeviction:默認策略,內存滿了再寫入就報錯。

3 緩存預熱(Cache preheating)

????????當Redis剛啟動或大批key同時過期,此時Redis中沒有數據,查詢就無法命中緩存,從而去查MySQL,給數據庫帶來大量查詢壓力。

????????解決辦法:通過緩存預熱,即提前給緩存中存入一些數據(不一定完全是熱點數據),來幫助MySQL減輕大量請求的壓力。可以采用定期生成的策略來離線為Redis提前存入一些熱點數據,隨著時間推移,緩存中的數據最終變為真正的熱點數據。

4 緩存穿透(Cache penetration)

????????查詢的key在Redis和MySQL數據庫中都不存在,這樣的key不會被實時緩存到Redis中,后續如果這類key頻繁訪問,依然會對MySQL造成較大壓力。

????????問題產生原因:1.業務未進行合理的參數校驗,導致非法的key被查詢。2.數據庫部分數據被誤刪。3.黑客攻擊。

????????解決辦法:1.業務設計更規范,進行必要的參數校驗。2.針對不存在的key,可以在MySQL也未命中后,把該key存入Redis中,value設為非法值(比如””,避免頻繁訪問數據庫。3.使用布隆過濾器(hash+bitmap,能夠用較少的空間和時間判斷某個數據是否存在)存入所有的key,查詢Redis和數據庫前先查布隆過濾器是否存在該key。

5 緩存雪崩(Cache avalanche)

????????短時間內Redis上的大量的key失效,從而導致大量的查詢未命中緩存,給數據庫帶來較大壓力。

????????問題產生原因:1.Redis節點宕機。2.在短時間內設置了大量過期時間相同的key。

????????解決辦法:1.部署Redis集群保證高可用性,并進行安全監控。2.不設置過期時間或設置過期時間時附加隨機種子,保證不會同時過期。

6 緩存擊穿(Cache breakdown)

????????緩存穿透的特殊情況,緩存穿透是針對普遍的key(包括熱點和非熱點)突然同時失效的問題,而緩存擊穿是指熱點key突然過期,導致大量查詢未命中去查數據庫。

????????解決辦法:1.統計出熱點key,并設置永不過期。2.必要時進行服務降級(關掉不必要的服務),比如使用分布式鎖限制數據庫的訪問請求。

下篇文章:

Redis原理之分布式鎖https://blog.csdn.net/sniper_fandc/article/details/149142059?fromshare=blogdetail&sharetype=blogdetail&sharerId=149142059&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

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

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

相關文章

關于集合的底層數據結構

單列集合Collection分為list集合和set集合list集合分為ArrayList和LinkedListArrayList--底層數據結構是數組1.通過索引查詢快2.增刪要重構索引,增刪慢 LinkedList--底層數據結構是鏈表1.無索引查詢慢2.通過改變前節點的尾指針和后節點的前指針指向可快速增刪,增刪快set集合(…

批量插入技巧:減少事務提交次數的性能提升

一、事務提交成本分析每次事務提交觸發?磁盤I/O同步?(WAL機制)、?日志寫入?和?鎖資源釋放?操作,高頻獨立提交會產生指數級開銷?。實驗表明:MySQL提交1萬次單條插入比單次批量插入?慢20倍以上??。高頻提交還加劇鎖競爭與…

importlib.import_module() 的用法與實戰案例

🌟 一、什么是 importlib? importlib 是 Python 的一個內置標準庫,用于在程序運行時 動態導入模塊。 🔤 對比:普通 import vs importlib方式示例特點靜態導入import os編寫代碼時就確定要導入的模塊動態導入importlib.…

Oracle 12c 創建數據庫初級教程

1. 連接到Oracle sqlplus / as sysdba Oracle數據庫名稱默認為ORCL或sqlplus /ORCL as sysdba Oracle數據庫名稱默認為ORCL2. 創建表空間(數據庫) create user YOUR_USERNAME identified by "YOUR_PASSWORD"; YOUR_USERNAME為數據庫名稱和登…

zabbix服務器告警處理

zabbix服務器告警,信息為:Utilization of poller processes over 75%處理辦法為修改zabbix_server.conf配置文件,一般情況下為/etc/zabbix目錄下。根據自己輪詢器的類型修改對應的輪詢器的數量;我這里把StartPollers,S…

隨筆20250721 PostgreSQL實體類生成器

我來幫你創建一個C#程序,從PostgreSQL數據庫讀取表結構并生成對應的實體類文件。我已經創建了一個完整的PostgreSQL實體類生成器。這個程序包含以下主要功能:主要特性數據庫連接: 使用Npgsql連接PostgreSQL數據庫表結構讀取: 自動讀取所有表的結構信息類…

B樹、B-樹與B+樹

B樹、B-tree與B樹 在計算機科學,尤其是數據庫和文件系統的領域中,B樹、B-tree和B樹是理解數據如何被高效存儲和檢索的關鍵。它們之間關系緊密,但功能和應用上又存在著決定性的差異。 一、 核心概念澄清:B樹就是B-tree 首先需要明確…

視頻格式轉換工廠v3.2.5,集音視頻、圖片處理78MB

今天,我們要介紹的是一款功能強大的視頻處理軟件——視頻格式轉換工廠。這款軟件已經完美破解,無需登錄即可享受全部高級功能。它不僅支持視頻格式轉換,還涵蓋了音頻、圖片處理等多種功能,是一款真正的多媒體處理工具。 視頻格式轉…

VUE 中父級組件使用JSON.stringify 序列化子組件傳遞循環引用錯誤

背景 VUE 中父級組件使用JSON.stringify 序列化子組件傳遞的數據會報錯 runtime-core.esm-bundler.js:268 Uncaught TypeError: Converting circular structure to JSON –> starting at object with constructor ‘Object’ — property ‘config’ closes the circle 原因…

HTTP,HTTPS

在網絡工程師、開發工程師、運維工程師等崗位的面試中,??HTTP/HTTPS?? 是高頻必考知識點,尤其在前端、后端、測試、DevOps等與網絡通信相關的職位中。以下是系統化的核心考點梳理,涵蓋基礎概念、協議機制、安全特性及應聘高頻問題。??一…

Nginx訪問日志分析在云服務器環境的技術實現與案例

在云計算時代,Nginx訪問日志分析已成為服務器運維的關鍵環節。本文將深入解析如何通過日志切割、實時監控和可視化展示三大技術路徑,實現云環境下Nginx日志的高效分析。我們將結合具體案例,演示從原始日志到運維決策的完整技術閉環&#xff0…

鴻蒙實現一次上傳多張圖片

記錄初接觸鴻蒙,遇到的一個問題,需求是點擊一個圖片上傳的號圖,訪問本地圖片,可以選擇多張圖片并上傳。下面是圖片上傳后的方法://選擇圖片并上傳private async showPhotoPicker() {const maxImageCount 3;const rema…

【STM32】CRC 校驗函數

先上一下 CRC校驗 的源代碼&#xff1a; void crc_check(unsigned char *ptr,unsigned int len) //crc為開源函數 {unsigned long wcrc0XFFFF;//預置16位crc寄存器&#xff0c;初值全部為1unsigned char temp;//定義中間變量int i0,j0;//定義計數for(i0;i<len;i)//循環計算每…

【Java】SVN 版本控制軟件的快速安裝(可視化)

目錄 一、SVN 的概述 1.1 SVN 的概念 1.2 SVN 與 Git 的對比 1.3 SVN 軟件 二、SVN 的安裝 2.1 SVN 的工作流程 2.2 服務器端 SVN 的安裝 三、SVN 服務器端的配置 3.1 搭建項目 3.2 權限控制 四、SVN 客戶端的配置 4.1 SVN 客戶端的下載 4.2 客戶端連接 SVN 服務器…

Hadoop安全機制深度剖析:Kerberos認證與HDFS ACL細粒度權限控制

Hadoop安全機制概述在大數據時代&#xff0c;Hadoop作為分布式計算框架的核心組件&#xff0c;其安全性直接關系到企業數據資產的保護。隨著數據價值的不斷提升&#xff0c;Hadoop安全機制已從早期的"簡單信任模式"演進為包含多重防護措施的綜合體系&#xff0c;其重…

uniapp基本使用

資料 咸蝦米視頻 黑馬視頻 uniapp官方文檔 hbuilder 1.uniapp頁面生命周期 1.1 onLoad 還拿不到dom適合接受上頁的參數&#xff0c;聯網取數據&#xff0c;更新data。相當于created和beforeCreated期間主要的作用是比如說獲取url上的query參數 *url: ***/**?name張三&…

ssh2-sftp-client 簡化 sftp 文件傳輸的 node庫

ssh2-sftp-client 極大地簡化了通過 sftp 進行文件傳輸的復雜性。無論你是需要上傳、下載、刪除文件&#xff0c;還是列出目錄內容&#xff0c;可當簡易的部署腳步npm run deploy const SftpClient require(ssh2-sftp-client) const sftp new SftpClient()const config {hos…

數字美元與全球支付革命:穩定幣的興起與全球金融格局的重塑

一、數字美元的崛起&#xff1a;美國戰略布局與全球競爭1. 數字美元的定位與戰略意義 數字美元作為美國構建“數字美元帝國”的核心工具&#xff0c;旨在通過區塊鏈技術實現美元的數字化發行與流通&#xff0c;鞏固其全球儲備貨幣地位。其核心邏輯在于&#xff1a;技術賦能貨幣…

LeetCode 633.平方數之和

給定一個非負整數 c &#xff0c;你要判斷是否存在兩個整數 a 和 b&#xff0c;使得 a2 b2 c 。 示例 1&#xff1a; 輸入&#xff1a;c 5 輸出&#xff1a;true 解釋&#xff1a;1 * 1 2 * 2 5 示例 2&#xff1a; 輸入&#xff1a;c 3 輸出&#xff1a;false 提示&…

Spring Boot 使用Jasypt加密

一、配置Jasypt 1.在pom.xml中導入依賴 <!-- Jasypt 加密工具 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency&…