Redis專題

前言

Redis的各種思想跟機組Cache和操作系統對進程的管理非常類似!

一:看到你的簡歷上寫了你的項目里面用到了redis,為啥用redis?

因為傳統的關系型數據庫如Mysql,已經不能適用所有的場景,比如秒殺的庫存扣減,APP首頁的訪問流量高峰等,都很容易把數據庫打崩,所以引入了緩存中間件,redis。

Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫;跟機組內存中的cache很相似。

集群:復制模式,每個機器做同一件事

分布式:每臺機器分工合作,做的不是同一件事。

二、Redis數據類型

字符串類型String

哈希類型hash

列表類型

集合類型

有序集合類型

三:Redis的使用

1:下載軟件

2:Spring-data-redis:提供了通過簡單配置訪問redis服務,對redis底層開發包jedis進行了高度封裝,RedisTemplate類提供了redis各種操作。

? ? ?redisTemplate.opsForValue().set("name", "gao1");

? ??redisTemplate.opsForList().rightPush("nameList1", "劉備");

? ??redisTemplate.opsForHash().put("nameHash", "c", "八戒");

四、Redis常見問題

1:緩存穿透:惡意請求或者頻繁查詢一個不存在的數據,導致每次請求都要訪問數據庫。

解決:緩存空對象,并設置合適的過期時間。

2:緩存擊穿:在高并發的情況下,一個熱點數據的緩存過期或被刪除,恰好有大量的請求同時訪問該數據,導致無法從緩存中獲取數據,從而直接訪問數據庫。

解決:互斥鎖;單機環境用synchronized,集群環境則使用分布式鎖(redis的setnx,Redisson)

3:緩存雪崩:在同一時段大量的緩存Key同時失效或者Redis服務宕機,導致大量請求到達數據庫。(與緩存擊穿的區別,雪崩是很多key,擊穿是某一個key緩存)

解決:合理設置緩存過期時間,給不同的key的·TTL添加隨機值;建立redis集群

緩存預熱:緩存預熱是指在系統啟動或高峰期之前,提前將一些熱點數據加載到緩存中,以減少后續請求對數據庫的訪問壓力,提高系統的性能和響應速度

五、緩存擊穿問題解決

分布式環境下解決:使用 Redisson 會更加合適。

1:引入依賴;配置文件??

 //1、獲取一把鎖,只要鎖的名字一樣,就是同一把鎖RLock lock = redissonClient.getLock("my-lock");//2、加鎖  阻塞式等待(沒有獲得鎖的線程都要等待)。默認加的鎖都是30s,lockWatchdogTimeout = 30 * 1000 【看門狗默認時間】lock.lock();//1)、鎖的自動續期,如果業務超長,運行期間自動續期,不用擔心業務時間長,鎖自動過期被刪掉//只要占鎖成功,就會啟動一個定時任務【重新給鎖設置過期時間,新的過期時間就是看門狗的默認時間】,每隔10秒都會自動的再次續期,續成30秒// internalLockLeaseTime 【看門狗時間】 / 3, 10s//2)、加鎖的業務只要運行完成,就不會給當前鎖續期,即使不手動解鎖,鎖默認會在30s內自動過期,不會產生死鎖問題try {System.out.println("加鎖成功,執行業務..." + Thread.currentThread().getId());try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }} finally {//3、解鎖  假設解鎖代碼沒有運行,Redisson會不會出現死鎖System.out.println("釋放鎖..." + Thread.currentThread().getId());lock.unlock();}return "hello";
}

六、redis與數據庫不一致問題

失效模式:修改數據庫后,刪除緩存后面再重新建立緩存。

雙寫模式:修改數據庫后,修改緩存。

七、SpringCache簡化緩存開發

springcache提供了一些核心概念和注解來管理緩存。

? ? Cache Manager? :是一個緩存的抽象接口。

? ? Cache:基本操作單元,定義了常見的緩存操作,例如get,put,evict(刪除)

? ?緩存注解:

@Cacheable:觸發將數據放入緩存的操作。

@CacheEvict:觸發將數據從緩存刪除的操作。失效模式

@CachePut:不影響方法執行更新緩存。雙寫模式。

// value:分組,區分不同模塊的緩存
//@Cacheable(value = "product", key = "'selectById:' + #id")
@Cacheable(value = "product", key = "#root.methodName + ':' + #id")
@Override
public Product selectById(Long id) {return productMapper.selectById(id);
}
//加鎖解決緩存擊穿問題:sync = true
//@Cacheable(value = "product", key = "'selectById'")
//多個參數這種方式用“,”分割就不用字符串拼接了, key = "{#root.methodName, #id, #name}"
@Cacheable(value = "product", key = "#root.methodName + ':' + #id", sync = true)
@Override
public Product selectById(Long id) {return productMapper.selectById(id);
}//@CacheEvict(value = "product", allEntries = true) //刪除分區中所有數據
@CacheEvict(value = "product", key = "'selectById:' + #product.id")
@Override
public void update(Product product) {productMapper.updateById(product);
}

八、Redis持久化機制

1:RDB:Redis Database Backup file(Redis數據備份文件),也被叫做Redis數據快照。

簡單來說就是把內存中的所有數據都記錄到磁盤中。當Redis實例故障重啟后,從磁盤讀取快照文件,恢復數據。

2:AOF:Append Only File(追加文件)

Redis處理的每一個寫命令都會記錄在AOF文件,可以看做是命令日志文件(不記錄讀命令)。

AOF默認是關閉的,需要修改redis.conf配置文件來開啟AOF

AOF重寫

比如我們有個計數的服務,有很多自增的操作,比如有一個key自增到1個億,對AOF文件來說就是一億次incr。AOF重寫就只用記1條記錄。

九、Redis過期數據刪除策略

???????惰性刪除?

只會在取出key的時候才對數據進行過期檢查,如果過期,我們就刪掉它,反之返回該key。

優點 :對CPU友好,只會在使用該key時才會進行過期檢查,對于很多用不到的key不用浪費時間進行過期檢查

缺點 :對內存不友好,如果一個key已經過期,但是一直沒有使用,那么該key就會一直存在內存中,內存永遠不會釋放

???????定期刪除?

每隔一段時間抽取一批 key進行檢查,刪除里面過期的key。

優點:可以通過限制刪除操作執行的時長和頻率來減少刪除操作對 CPU 的影響。也能有效釋放過期鍵占用的內存。

缺點:難以確定刪除操作執行的時長和頻率。

Redis的過期刪除策略:惰性刪除 + 定期刪除兩種策略進行配合使用

十、Redis數據淘汰策略(和操作系統的進程管理類似)

當Redis中的內存不夠用時,此時在向Redis中添加新的key,那么Redis就會按照某一種規則將內存中的數據刪除掉,這種數據的刪除規則被稱之為內存的淘汰策略。

Redis支持8種不同策略來選擇要刪除的key:

noeviction:當內存不足時,Redis 不會淘汰任何數據,而是直接返回錯誤信息。這是默認的淘汰策略。

allkeys-lru: 對全體key,基于LRU算法進行淘汰

allkeys-lfu: 對全體key,基于LFU算法進行淘汰

allkeys-random:對全體key ,隨機進行淘汰。

volatile-lru: 對設置了TTL的key,基于LRU算法進行淘汰

volatile-lfu: 對設置了TTL的key,基于LFU算法進行淘汰

volatile-random:對設置了TTL的key ,隨機進行淘汰。

volatile-ttl: 對設置了TTL的key,比較key的剩余TTL值,TTL越小越先被淘汰

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

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

相關文章

【Rust 精進之路之第7篇-函數之道】定義、調用與參數傳遞:構建代碼的基本單元

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:封裝邏輯,代碼復用的基石 在之前的文章中,我們已經探索了 Rust 如何處理數據(變量、標量類型、復合類型)以及如何控制程序的執行流程(if/else、循環)。這些構成了編寫簡…

文件有幾十個T,需要做rag,用ragFlow能否快速落地呢?

一、RAGFlow的優勢 1、RAGFlow處理大規模數據性能: (1)、RAGFlow支持分布式索引構建,采用分片技術,能夠處理TB級數據。 (2)、它結合向量搜索和關鍵詞搜索,提高檢索效率。 &#xf…

安卓的桌面 launcher是什么

安卓的桌面Launcher是一種安卓應用程序,它主要負責管理和展示手機主屏幕的界面以及相關功能,為用戶提供與設備交互的主要入口。以下是其詳細介紹: 功能 主屏幕管理:用戶可以在主屏幕上添加、刪除和排列各種應用程序圖標、小部件…

【學習筆記】計算機網絡(九)—— 無線網絡和移動網絡

第9章 無線網絡和移動網絡 文章目錄 第9章 無線網絡和移動網絡9.1 無線局域網WLAN9.1.1 無線局域網的組成9.1.2 802.11局域網的物理層9.1.3 802.11局域網的MAC層協議CSMA 協議CSMA/CD 協議 - 總線型 - 半雙工CSMA/CA 協議 9.1.4 802.11局域網的MAC幀 9.2 無線個人區域網WPAN9.3…

無線網絡入侵檢測系統實戰 | 基于React+Python的可視化安全平臺開發詳解

隨著無線網絡的普及,網絡攻擊風險也日益嚴峻。本項目旨在構建一個實時監測、智能識別、高效防護的無線網絡安全平臺,通過結合前后端技術與安全算法,實現對常見攻擊行為的有效監控和防御。 一、項目簡介與功能目的 本系統是一款基于 React 前…

速通FlinkCDC3.0

1.FlinkCDC概述 1.1FlinkCDC是什么? FlinkCDC(Flink Change Data Capture)是一個用于實時捕獲數據庫變更日志的工具,它可以將數據庫的變更實時同步到ApacheFlink系統中。 1.2 FlinkCDC的三個版本? 1.x 這個版本的Fli…

B+樹節點與插入操作

B樹節點與插入操作 設計B樹節點 在設計B樹的數據結構時,我們首先需要定義節點的格式,這將幫助我們理解如何進行插入、刪除以及分裂和合并操作。以下是對B樹節點設計的詳細說明。 節點格式概述 所有的B樹節點大小相同,這是為了后續使用自由…

C# 檢查字符串是否包含在另一個字符串中

string shopList "我是大浪,你的小狼"; this.ShopId"你的小狼"; bool existsShopId false; if (!string.IsNullOrEmpty(shopList)) {existsShopId shopList.Split(,).Any(part > part.Trim() this.ShopId); }檢查 goodsIdSet 中的每個元素是否都在 …

珈和科技遙感賦能農業保險創新 入選省級衛星應用示范標桿

為促進空天信息與數字經濟深度融合,拓展衛星數據應用場景價值,提升衛星數據應用效能和用戶體驗,加速衛星遙感技術向民生領域轉化應用,近日,湖北省國防科工辦組織開展了2024年湖北省衛星應用示范項目遴選工作。 經多渠…

深入理解 React 組件的生命周期:從創建到銷毀的全過程

React 作為當今最流行的前端框架之一,其組件生命周期是每個 React 開發者必須掌握的核心概念。本文將全面剖析 React 組件的生命周期,包括類組件的各個生命周期方法和函數組件如何使用 Hooks 模擬生命周期行為,幫助開發者編寫更高效、更健壯的…

緩存 --- Redis性能瓶頸和大Key問題

緩存 --- Redis性能瓶頸和大Key問題 內存瓶頸網絡瓶頸CPU 瓶頸持久化瓶頸大key問題優化方案 Redis 是一個高性能的內存數據庫,但在實際使用中,可能會在內存、網絡、CPU、持久化、大鍵值對等方面遇到性能瓶頸。下面從這些方面詳細分析 Redis 的性能瓶頸&a…

Python爬蟲與代理IP:高效抓取數據的實戰指南

目錄 一、基礎概念解析 1.1 爬蟲的工作原理 1.2 代理IP的作用 二、環境搭建與工具選擇 2.1 Python庫準備 2.2 代理IP選擇技巧 三、實戰步驟分解 3.1 基礎版:單線程免費代理 3.2 進階版:多線程付費代理池 3.3 終極版:Scrapy框架自動…

Nginx HTTP 414 與“大面積”式洪水攻擊聯合防御實戰

一、引言 在大規模分布式應用中,Nginx 常作為前端負載均衡和反向代理服務器。攻擊者若結合超長 URI/頭部攻擊(觸發 HTTP 414)與海量洪水攻擊,可在網絡層與應用層形成雙重打擊:一方面耗盡緩沖區和內存,另一…

【上位機——MFC】運行時類信息機制

運行時類信息機制的使用 類必須派生自CObject類內必須添加聲明宏DECLARE_DYNAMIC(theClass)3.類外必須添加實現宏 IMPLEMENT_DYNAMIC(theClass,baseClass) 具備上述三個條件后&#xff0c;CObject::IsKindOf函數就可以正確判斷對象是否屬于某個類。 代碼示例 #include <…

Maven插件管理的基本原理

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

卷積神經網絡--手寫數字識別

本文我們通過搭建卷積神經網絡模型&#xff0c;實現手寫數字識別。 pytorch中提供了手寫數字的數據集 &#xff0c;我們可以直接從pytorch中下載 MNIST中包含70000張手寫數字圖像&#xff1a;60000張用于訓練&#xff0c;10000張用于測試 圖像是灰度的&#xff0c;28x28像素 …

大文件分片上傳進階版(新增md5校驗、上傳進度展示、并行控制,智能分片、加密上傳、斷點續傳、自動重試),實現四位一體的網絡感知型大文件傳輸系統?

上篇文章我們總結了大文件分片上傳的主要核心&#xff0c;但是我對md5校驗和上傳進度展示這塊也比較感興趣&#xff0c;所以在deepseek的幫助下&#xff0c;擴展了一下我們的代碼&#xff0c;如果有任何問題和想法&#xff0c;非常歡迎大家在評論區與我交流&#xff0c;我需要學…

C# 點擊導入,將需要的參數傳遞到彈窗的頁面

點擊導入按鈕&#xff0c;獲取本頁面的datagridview標題的結構&#xff0c;并傳遞到導入界面。 新增一個datatable用于存儲datagridview的caption和name&#xff0c;這里用的是devexpress組件中的gridview。 DataTable dt new DataTable(); DataColumn CAPTION …

android的 framework 是什么

Android的Framework&#xff08;框架&#xff09;是Android系統的核心組成部分&#xff0c;它為開發者提供了一系列的API&#xff08;應用程序編程接口&#xff09;&#xff0c;使得開發者能夠方便地創建各種Android應用。以下是關于它的詳細介紹&#xff1a; 位置與架構 在A…

【MySQL】表的約束(主鍵、唯一鍵、外鍵等約束類型詳解)、表的設計

目錄 1.數據庫約束 1.1 約束類型 1.2 null約束 — not null 1.3 unique — 唯一約束 1.4 default — 設置默認值 1.5 primary key — 主鍵約束 自增主鍵 自增主鍵的局限性&#xff1a;經典面試問題&#xff08;進階問題&#xff09; 1.6 foreign key — 外鍵約束 1.7…