Redis場景問題1:緩存穿透

Redis 緩存穿透是指在緩存系統(如 Redis)中,當客戶端請求的數據既不在緩存中也不在數據庫中時,每次請求都會直接穿透緩存訪問數據庫,從而給數據庫帶來巨大壓力,甚至可能導致數據庫崩潰。下面為你詳細介紹其產生原因、解決方案以及示例代碼。

產生原因

  • 非法請求:惡意攻擊者可能會故意發送大量不存在于數據庫中的請求,使緩存失去作用,請求全部落到數據庫上。
  • 業務邏輯錯誤:在業務開發過程中,如果對數據的判斷邏輯有誤,可能會導致程序請求不存在的數據。

解決方案

1. 緩存空對象

當請求的數據在數據庫中不存在時,將一個空對象(如null"")存入緩存,并設置一個較短的過期時間。這樣下次相同的請求就會直接從緩存中獲取空對象,而不會再次訪問數據庫。

2. 布隆過濾器

布隆過濾器是一種空間效率極高的概率型數據結構,用于判斷一個元素是否存在于一個集合中。在請求訪問緩存之前,先通過布隆過濾器判斷該請求的數據是否可能存在。如果布隆過濾器判斷數據不存在,那么就直接返回,避免訪問數據庫。

示例代碼(Python + Redis)

以下是使用 Python 和 Redis 實現緩存空對象的示例代碼:

import redis# 連接Redis
r = redis.Redis(host='localhost', port=6379, db=0)def get_data(key):# 先從緩存中獲取數據data = r.get(key)if data is not None:# 如果緩存中有數據,直接返回if data == b'':return Nonereturn data.decode('utf-8')else:# 緩存中沒有數據,從數據庫中獲取(這里用模擬函數代替)data = get_data_from_db(key)if data is None:# 如果數據庫中也沒有數據,緩存空對象r.setex(key, 60, '')  # 設置過期時間為60秒else:# 數據庫中有數據,存入緩存r.setex(key, 3600, data)  # 設置過期時間為3600秒return datadef get_data_from_db(key):# 模擬從數據庫中獲取數據# 這里可以替換為實際的數據庫查詢操作if key == 'existing_key':return 'some data'return None# 測試
print(get_data('existing_key'))
print(get_data('non_existing_key'))

上述代碼實現了一個簡單的緩存空對象的機制,當請求的數據在數據庫中不存在時,會將空對象存入緩存,避免下次請求再次訪問數據庫。

布隆過濾器示例(Python + RedisBloom)

如果你使用的是 RedisBloom 模塊,可以使用布隆過濾器來解決緩存穿透問題:

from redisbloom.client import Client# 連接RedisBloom
rb = Client()# 初始化布隆過濾器
rb.bfCreate('mybloom', 0.01, 1000)  # 錯誤率為0.01,預計插入1000個元素# 向布隆過濾器中添加元素
rb.bfAdd('mybloom', 'existing_key')def get_data_with_bloom(key):# 先通過布隆過濾器判斷元素是否可能存在if not rb.bfExists('mybloom', key):return None# 再從緩存中獲取數據data = r.get(key)if data is not None:if data == b'':return Nonereturn data.decode('utf-8')else:data = get_data_from_db(key)if data is None:r.setex(key, 60, '')else:r.setex(key, 3600, data)return data# 測試
print(get_data_with_bloom('existing_key'))
print(get_data_with_bloom('non_existing_key'))

上述代碼使用了 RedisBloom 模塊的布隆過濾器,在請求訪問緩存之前,先通過布隆過濾器判斷元素是否可能存在,從而減少不必要的數據庫訪問。

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

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

相關文章

CUDA Memory Fence 函數的功能與硬件實現細節

CUDA Memory Fence 函數的功能與硬件實現細節 Memory Fence 的基本功能 CUDA中的memory fence函數用于控制內存操作的可見性順序,確保在fence之前的內存操作對特定范圍內的線程可見。主要功能包括: 排序內存操作:確保fence之前的內存操作在…

實戰篇Redis

黑馬程序員的Redis的筆記(后面補一下圖片) 【黑馬程序員Redis入門到實戰教程,深度透析redis底層原理redis分布式鎖企業解決方案黑馬點評實戰項目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive編程:什么是Reactive編程?Reactive編程思想

文章目錄 **1. Reactive編程概述****1.1 什么是Reactive編程?****1.1.1 Reactive編程的定義****1.1.2 Reactive編程的歷史****1.1.3 Reactive編程的應用場景****1.1.4 Reactive編程的優勢** **1.2 Reactive編程的核心思想****1.2.1 響應式(Reactive&…

異步轉同步,實現一個消息隊列

有一個場景,需要實現一個消息隊列,要求 1,3,4 秒后,依次打印 1,2,3,如下: 其實考察的是怎么用同步的方式實現異步。 本文總結了四種方式實現:常規嵌套、prom…

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望 #微服務實戰 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事務 #Seata #ServiceMesh #總結 #SpringCloud #SpringBoot 系列終章:經過前九篇 [【深度 Mape 系列】] 的系統學習…

求職筆試題

PDD 最長公共子序列 1143-最長公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二維動態規劃"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 這種寫法錯誤,m1行…

【MySQL基礎-16】MySQL DELETE語句:深入理解與應用實踐

1. DELETE語句基礎:數據刪除的藝術 在數據庫管理中,DELETE語句是維護數據完整性和清理過期信息的關鍵工具。與日常生活中的"刪除"不同,數據庫中的刪除操作需要更加謹慎和精確,因為數據一旦刪除,恢復可能非常…

python學習筆記(3)——元組

Python3 元組全面詳解 一、元組的定義與特性 基本概念 元組(Tuple)是Python中的不可變序列,用小括號()表示,元素用逗號分隔。與列表不同,元組一旦創建,元素不能修改、添加或刪除(元素本身為可變對象的情況除外)。 不可變性 ? 元組的每個元素的引用不可變,但若元素是可…

Android 中實現一個自定義的 AES 算法

版權歸作者所有,如有轉發,請注明文章出處:https://cyrus-studio.github.io/blog/ 前言 AES(Advanced Encryption Standard,高級加密標準) 是一種 對稱加密算法,用于加密和解密數據。AES 由 美國…

小河:團隊金牌精準計劃

【趨勢識別與預測】 數據趨勢分析在隨機序列研究中首要價值在于識別潛在規律并提升預測能力。隨機序列常表現為無規則波動,但通過滑動平均、指數平滑、小波變換等方法,可剝離噪聲干擾,提取長期趨勢或周期性成分。例如,在金融時間序…

S32K144外設實驗(七):FTM輸出多路互補帶死區PWM

文章目錄 1. 概述1.1 時鐘系統1.2 實驗目的2. 代碼的配置2.1 時鐘配置2.2 FTM模塊配置2.3 輸出引腳配置2.4 API函數調用1. 概述 互補對的PWM輸出是很重要的外設功能,尤其應用再無刷電機的控制。 1.1 時鐘系統 筆者再墨跡一遍時鐘的設置,因為很重要。 FTM的CPU接口時鐘為SY…

數據結構與算法:算法分析

遇到的問題,都有解決方案,希望我的博客能為您提供一點幫助。 本篇參考《Data Structures and Algorithm Analysis in C》 “在程序設計中,不僅要寫出能工作的程序,更要關注程序在大數據集上的運行時間。” 本章討論要點&#xf…

Redis數據持久化機制 + Go語言讀寫Redis各種類型值

Redis(Remote Dictionary Server)作為高性能的鍵值存儲系統,憑借其豐富的數據類型和原子性操作,成為現代分布式系統中不可或缺的組件。 1、Redis支持的數據類型 Redis支持的數據類型可歸納為以下9類: String&#x…

排序--歸并排序

一,引言 歸并排序作為七大排序中一種,本文將講解其排序原理和代碼實現。 二,邏輯講解 來看一組動圖: 首先先進行大邏輯的講解,在一個亂序的數組中如圖: 通過遞歸進行一次次分組如圖: 分組邏…

React程序打包與部署

===================== 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 為生產環境準備React應用最小化和打包環境變量錯誤處理部署到托管服務部署到Netlify探索高級主題:Hooks、Su…

Spring Data審計利器:@LastModifiedDate詳解(依賴關系補充篇)!!!

🕒 Spring Data審計利器:LastModifiedDate詳解🔥(依賴關系補充篇) 🔌 核心依賴解析 使用LastModifiedDate必須知道的依賴關系 #mermaid-svg-qm1OUa9Era9ktbeK {font-family:"trebuchet ms",verd…

接口測試中數據庫驗證,怎么解決?

在接口測試中,通常需要在接口調用前后查詢數據庫,以驗證接口操作是否正確影響了數據庫狀態。?這可以通過數據庫斷言來實現,PyMySQL庫常用于連接和操作MySQL數據庫。?通過該庫,可以在測試中執行SQL語句,查詢或修改數據…

游戲引擎學習第189天

今天的回顧與計劃 在昨天,我們花了一些時間來優化調試數據的收集方法,并且在調試界面中增加了一些界面代碼,使得我們可以懸停在不同的元素上,查看相關信息。今天的任務是對這些數據進行更多的操作,進行一些有趣的實驗…

智能粉塵監測解決方案|守護工業安全,杜絕爆炸隱患

在廠房轟鳴的生產線上,一粒微小粉塵的聚集可能成為一場災難的導火索。如何實現粉塵濃度的精準監控與快速響應?我們為您打造了一套"感知-預警-處置"全閉環的智能安全方案! 行業痛點:粉塵管理的生死線 在金屬加工、化工…

Java 實現將Word 轉換成markdown

日常的開發中&#xff0c;需要將word 等各類文章信息轉換成格式化語言&#xff0c;因此需要使用各類語言將word 轉換成Markdown 1、引入 jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&g…