redis并發、穿透、雪崩

Redis如何實現高并發

  • 首先是單線程模型:redis采用單線程可以避免多線程下切換和競爭的開銷,提高cpu的利用率,如果是多核cpu,可以部署多個redis實例。
  • 基于內存的數據存儲:redis將數據存儲在內存中,相比于硬盤訪問速度更快。
  • 優化數據結構:redis使用多種高效的數據結構,如哈希表、跳躍表等提高數據的操作效率。
  • 多路復用和非阻塞IO:多路復用允許一個線程同時監聽多個客戶端,而非阻塞IO允許發起IO請求后不會阻塞當前線程,而可以執行其他任務,提高了響應速度和利用率。

redis4.0及之前都是單線程模式,之后慢慢往多線程方向發展,這是為什么呢?

  • 4.0之前機器大多是單核的,故使用單線程,但隨著互聯網發展,機器都是多核,為了提高性能慢慢往多線程方向發展。
  • 其次,實踐中出現的部分問題不好解決,比如刪除一個大key ——hash表,就需要將里面的鍵值對全部刪除,非常耗時,如果是單線程會出現卡頓,導致其他連接用戶不能及時響應。

到了redis6/7版本網絡處理請求是多線程(瓶頸),命令執行是單線程。

開啟多線程

配置文件redis.conf設置

io-threads 數量? ? ?//設置線程核心數

io-threads-do-reads? yes //開啟多線程


緩存穿透

緩存穿透是指請求的數據在緩存中和數據庫中都不存在,每次請求訪問數據庫。

場景:

  • 查詢不存在的數據:緩存無法存儲,故每次從數據庫查詢;
  • 查詢熱門數據:數據被訪問頻繁,導致緩存系統無法處理,只能從數據庫中訪問;
  • 查詢異常數據:數據服務異常緩存無法訪問。

解決方法:維護一個布隆過濾器(判斷一個元素是否可能在一個集合中)。


緩存擊穿

是指一個查詢的熱點數據不存在緩存,每次都需要訪問數據庫。

場景:

  • 未緩存存儲的熱點數據
  • 熱點數據過期

解決方法:查詢數據庫前判斷緩存中是否有,若沒用使用redis查詢數據庫,寫入緩存。


緩存雪崩

指某一時間大量緩存數據集體失效,導致數據庫的訪問量加大,對數據庫產生極大負荷。

場景:

  • 緩存服務器宕機:當服務器宕機或重啟時,大量訪問將命中數據庫;
  • 數據過期時間設置不合理。
  • 促銷商品:打折等促銷活動將帶來高頻的數據訪問。

解決方法:

  • 將緩存過期時間分散開,即為不同的數據設置不同的過期時間;
  • 使用多級緩存結構,通過增加緩存層數來提高數據的保存時間;

實際生產上如何禁止keys */flushdb/flushall等危險命令?

將相應命令設置成空字符串。

在redis.conf配置命令為空字符串

rename- command keys ""

命令含義:重命名指令keys為空字符串

實際遍歷可以通過scan來進行

命令:scan 游標(從0開始)?match 模糊匹配 count 數量

例子 :

從0開始匹配前綴為k的15條記錄

返回第一行表示下一個游標,如果為0表示遍歷完畢。

多大算大key

String為超過10KB。

而集合如List Hash等超過5000即為大key。

危害

造成內存不均,集群遷移困難。

刪除等會造成阻塞。

查詢

redis-cli --bigkeys : 發現其中的大key

memory usage 鍵:查詢某個key的大小

如何刪除

先將大key中數據進行刪除,里面大致清空時直接delete該key

如何調優

將大key移除改為非阻塞

?雙檢加鎖策略

當redis中無數據,而需要向mysql查詢時,如何保證數據一致性?

策略:

  • 先在redis緩存查詢是否存在,命中直接返回;
  • 未命中則加鎖,再進行一次緩存查詢(因為在多線程中可能上次加鎖的線程已經將數據更新到緩存)
  • 若未查到,訪問數據庫,并更新緩存。

數據庫和緩存一致性的策略

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

讓下次訪問時,將數據從數據庫中寫回到緩存。

缺陷:可能存在更新不及時,導致線程訪問到舊的數據寫會緩存,導致后面請求訪問的都是舊數據。

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

讓下次訪問時,將數據從數據庫中寫回到緩存。

缺陷:可能刪除不及時,導致部分訪問讀取緩存中的舊值。

感謝觀看——

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

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

相關文章

wireshark抓取Chrome瀏覽器quic協議的明文包

wireshark版本:Version 4.2.5 (v4.2.5-0-g4aa814ac25a1). 1.chromium瀏覽器啟用quic: chrome://flags/#enable-quic 2.windows添加環境變量 SSLKEYLOGFILED:\sslkeylogfile.log 3.配置wireshark,編輯->首選項->Protocls->TLS:(Pre)-…

MyBatis(30)如何在 MyBatis 中使用 XML 和注解混合配置方式

在MyBatis中,你可以靈活地選擇XML配置方式、注解方式,或者將這兩種方式混合使用來配置你的映射器(Mapper)。使用混合配置方式,你可以結合兩者的優勢,例如,利用XML配置復雜查詢和動態SQL&#xf…

【測試】系統壓力測試報告模板(Word原件)

系統壓力測試,簡而言之,是在模擬高負載、高并發的環境下,對系統進行全面測試的過程。它旨在評估系統在面對極端使用條件時的性能表現,包括處理能力、響應時間、資源消耗及穩定性等關鍵指標。通過壓力測試,開發團隊能夠…

上海-LM科技(面經)

上海-LM科技 hr電話面 個人簡介 個人信息的詢問 是否知道芋道框架 技術面 算法題 14. 最長公共前綴(寫出來即可) 聊一下Docker Docker核心概念總結Docker實戰 聊一下AOP Spring AOP詳解 聊一下JWT JWT 基礎概念詳解JWT 身份認證優缺點分析 Spring…

企業選擇云WAF的安全性考量

簡介 云WAF(Web Application Firewall)是一種基于云計算平臺的安全服務,旨在保護Web應用免受網絡攻擊。它通過監控和過濾HTTP/HTTPS流量,檢測和阻止潛在的威脅和惡意行為,確保Web應用程序的安全性和可靠性。 云WAF的優…

代碼隨想錄——單調遞增的數字(Leetcode738)

題目鏈接 貪心 class Solution {public int monotoneIncreasingDigits(int n) {char[] digits String.valueOf(n).toCharArray();int flag digits.length;for (int i digits.length - 1; i > 0; i--) {if (digits[i] < digits[i - 1]) {flag i;digits[i - 1]--;}}…

一起學Hugging Face Transformers(13)- 模型微調之自定義訓練循環

文章目錄 前言一、什么是訓練循環1. 訓練循環的關鍵步驟2. 示例3. 訓練循環的重要性 二、使用 Hugging Face Transformers 庫實現自定義訓練循環1. 前期準備1&#xff09;安裝依賴2&#xff09;導入必要的庫 2. 加載數據和模型1&#xff09; 加載數據集2&#xff09; 加載預訓練…

玉石風能否接棒黏土風?一探AI繪畫新風尚

在數字藝術的浪潮中,AI繪畫平臺以其獨特的創造力和便捷性,正在逐步改變我們對藝術的傳統認知。從黏土風的溫暖質感到琉璃玉石的細膩光澤,每一次風格的轉變都引領著新的潮流。今天,我們將聚焦玉石風,探討它是否能成為下一個流行的藝術濾鏡,并提供一種在線體驗的方式,讓你…

Python | Leetcode Python題解之第221題最大正方形

題目&#xff1a; 題解&#xff1a; class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:if len(matrix) 0 or len(matrix[0]) 0:return 0maxSide 0rows, columns len(matrix), len(matrix[0])dp [[0] * columns for _ in range(rows)]for i in…

使用Python實現深度學習模型:模型監控與性能優化

在深度學習模型的實際應用中,模型的性能監控與優化是確保其穩定性和高效性的關鍵步驟。本文將介紹如何使用Python實現深度學習模型的監控與性能優化,涵蓋數據準備、模型訓練、監控工具和優化策略等內容。 目錄 引言模型監控概述性能優化概述實現步驟數據準備模型訓練模型監控…

梧桐數據庫:語法分析模塊概述

語法分析模塊是數據庫系統的重要組成部分&#xff0c;它負責將用戶輸入的 SQL 語句轉換為內部表示形式&#xff0c;以便后續的處理和執行。在數據庫系統中&#xff0c;語法分析模塊是連接用戶與數據庫的橋梁。它的主要任務是將用戶輸入的 SQL 語句進行解析&#xff0c;檢查語法…

Kafka(一)基礎介紹

一&#xff0c;Kafka集群 一個典型的 Kafka 體系架構包括若Producer、Broker、Consumer&#xff0c;以及一個ZooKeeper集群&#xff0c;如圖所示。 ZooKeeper&#xff1a;Kafka負責集群元數據的管理、控制器的選舉等操作的&#xff1b; Producer&#xff1a;將消息發送到Broker…

隨著云計算和容器技術的廣泛應用,如何在這些環境中有效地運用 Shell 進行自動化部署和管理?

在云計算和容器技術的環境中&#xff0c;Shell 腳本可以被用于自動化部署和管理任務。下面是一些在這些環境中有效使用 Shell 進行自動化部署和管理的方法&#xff1a; 在云環境中&#xff0c;使用云服務提供商的 API 進行自動化管理。例如&#xff0c;使用命令行工具或 SDK 來…

14 - Python網絡應用開發

網絡應用開發 發送電子郵件 在即時通信軟件如此發達的今天&#xff0c;電子郵件仍然是互聯網上使用最為廣泛的應用之一&#xff0c;公司向應聘者發出錄用通知、網站向用戶發送一個激活賬號的鏈接、銀行向客戶推廣它們的理財產品等幾乎都是通過電子郵件來完成的&#xff0c;而…

[AI 大模型] OpenAI ChatGPT

文章目錄 ChatGPT 簡介ChatGPT 的模型架構ChatGPT的發展歷史節點爆發元年AI倫理和安全 ChatGPT 新技術1. 技術進步2. 應用領域3. 代碼示例4. 對話示例 ChatGPT 簡介 ChatGPT 是由 OpenAI 開發的一個大型語言模型&#xff0c;基于GPT-4架構。它能夠理解和生成自然語言文本&…

學習筆記——動態路由——OSPF(特殊區域)

十、OSPF特殊區域 1、技術背景 早期路由器靠CPU計算轉發&#xff0c;由于硬件技術限制問題&#xff0c;因此資源不是特別充足&#xff0c;因此是要節省資源使用&#xff0c;規劃是非常必要的。 OSPF路由器需要同時維護域內路由、域間路由、外部路由信息數據庫。當網絡規模不…

電腦會議錄音轉文字工具哪個好?5個轉文字工具簡化工作流程

在如今忙碌的生活中&#xff0c;我們常常需要記錄和回顧重要的對話和討論。手寫筆記可能跟不上速度&#xff0c;而錄音則以其便捷性成為了捕捉信息的有力工具。但錄音文件的后續處理&#xff0c;往往讓人頭疼不已。想象一下&#xff0c;如果能夠瞬間將這些聲音轉化為文字&#…

spring-16

Spring 對 DAO 的支持 Spring 對 DAO 的支持是通過 Spring 框架的 JDBC 模塊實現的&#xff0c;它提供了一系列的工具和類來簡化數據訪問對象&#xff08;DAO&#xff09;的開發和管理。 首先&#xff0c;我們需要在 Spring 配置文件中配置數據源和事務管理器&#xff1a; &l…

Java筆試|面試 —— 子類對象實例化全過程 (熟悉)

子類對象實例化全過程 (熟悉) &#xff08;1&#xff09;從結果的角度來看&#xff1a;體現為繼承性 當創建子類對象后&#xff0c;子類對象就獲取了其父類中聲明的所有的屬性和方法&#xff0c;在權限允許的情況下&#xff0c;可以直接調用。 &#xff08;2&#xff09;從過…

iptables實現端口轉發ssh

iptables實現端口轉發 實現使用防火墻9898端口訪問內網front主機的22端口&#xff08;ssh連接&#xff09; 1. 防火墻配置(lb01) # 配置iptables # 這條命令的作用是將所有目的地為192.168.100.155且目標端口為19898的TCP數據包的目標IP地址改為10.0.0.148&#xff0c;并將目標…