redis核心知識點

Redis是一種基于內存的數據庫,對數據的讀寫操作都是在內存中完成,因此讀寫速度非常快,常用于緩存,消息隊列、分布式鎖等場景。

Redis 提供了多種數據類型來支持不同的業務場景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位圖)、HyperLogLog(基數統計)、GEO(地理信息)、Stream(流),并且對數據類型的操作都是原子性的,因為執行命令由單線程負責的,不存在并發競爭的問題。

Redis 與 Memcached 區別:

? Redis 支持的數據類型更豐富(String、Hash、List、Set、ZSet),而 Memcached 只支持最簡單的 key-value 數據類型;

? Redis 支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用,而 Memcached 沒有持久化功能,數據全部存在內存之中,Memcached 重啟或者掛掉后,數據就沒了;

? Redis 原生支持集群模式,Memcached 沒有原生的集群模式,需要依靠客戶端來實現往集群中分片寫入數據;

? Redis 支持發布訂閱模型、Lua 腳本、事務等功能,而 Memcached 不支持;

在這里插入圖片描述

1748698363099)

Redis 五種數據類型的應用場景:

? String 類型的應用場景:緩存對象、常規計數、分布式鎖、共享 session 信息等。

? List 類型的應用場景:消息隊列(但是有兩個問題:1. 生產者需要自行實現全局唯一 ID;2. 不能以消費組形式消費數據)等。

? Hash 類型:緩存對象、購物車等。

? Set 類型:聚合計算(并集、交集、差集)場景,比如點贊、共同關注、抽獎活動等。

? Zset 類型:排序場景,比如排行榜、電話和姓名排序等。Redis 后續版本又支持四種數據類型,它們的應用場景如下:

? BitMap(2.2 版新增):二值狀態統計的場景,比如簽到、判斷用戶登陸狀態、連續簽到用戶總數等;

? HyperLogLog(2.8 版新增):海量數據基數統計的場景,比如百萬級網頁 UV 計數等;

? GEO(3.2 版新增):存儲地理位置信息的場景,比如滴滴叫車;

? Stream(5.0 版新增):消息隊列,相比于基于 List 類型實現的消息隊列,有這兩個特有的特性:自動生成全局唯一消息ID,支持以消費組形式消費數據。

redis數據類型的實現

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

String 類型的底層的數據結構實現主要是 SDS(簡單動態字符串):

SDS 不僅可以保存文本數據,還可以保存二進制數據。

SDS 獲取字符串長度的時間復雜度是 O(1)。

Redis 的 SDS API 是安全的,拼接字符串不會造成緩沖區溢出。

redis線程模型

Redis 單線程指的是「接收客戶端請求->解析請求 ->進行數據讀寫等操作->發送數據給客戶端」這個過程是由一個線程(主線程)來完成的。

Redis 為「關閉文件、AOF 刷盤、釋放內存」這些任務創建單獨的線程來處理,是因為這些任務的操作都是很耗時的,如果把這些任務都放在主線程來處理,那么 Redis 主線程就很容易發生阻塞,這樣就無法處理后續的請求了。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

在 Redis 6.0 版本之后,也采用了多個 I/O 線程來處理網絡請求,這是因為隨著網絡硬件的性能提升,Redis 的性能瓶頸有時會出現在網絡 I/O 的處理上。

Redis 持久化

Redis 共有三種數據持久化的方式:? AOF 日志:每執行一條寫操作命令,就把該命令以追加的方式寫入到一個文件里;

? RDB 快照:將某一時刻的內存數據,以二進制的方式寫入磁盤;

? 混合持久化方式:Redis 4.0 新增的方式,集成了 AOF 和 RDB 的優點;

Redis 提供了 3 種寫回硬盤的策略,控制的就是上面說的第三步的過程。 在 Redis.conf 配置文件中的 appendfsync 配置項可以有以下 3 種參數可填:

? Always,這個單詞的意思是「總是」,所以它的意思是每次寫操作命令執行完后,同步將 AOF 日志數據寫回硬盤;

? Everysec,這個單詞的意思是「每秒」,所以它的意思是每次寫操作命令執行完后,先將命令寫入到 AOF 文件的內核緩沖區,然后每隔一秒將緩沖區里的內容寫回到硬盤;

? No,意味著不由 Redis 控制寫回硬盤的時機,轉交給操作系統控制寫回的時機,也就是每次寫操作命令執行完后,先將命令寫入到 AOF 文件的內核緩沖區,再由操作系統決定何時將緩沖區內容寫回硬盤。

特性AOF 緩沖區AOF 重寫緩沖區
用途暫存所有寫命令,用于常規 AOF 刷盤暫存 AOF 重寫期間的新命令,保證數據一致性
生命周期持續存在,Redis 運行期間一直使用僅在 AOF 重寫過程中存在
刷盤時機appendfsync 控制在重寫完成后一次性寫入新 AOF 文件
數據量通常較小(取決于刷盤頻率)可能較大(取決于重寫耗時和寫命令頻率)

RDB快照

RDB 快照就是記錄某一個瞬間的內存數據,記錄的是實際數據,而 AOF 文件記錄的是命令操作的日志,而不是實際的數據。

執行 bgsave 過程中,Redis 依然可以繼續處理操作命令的,也就是數據是能被修改的,關鍵的技術就在于寫時復制技術(Copy-On-Write, COW)。

如果主線程執行寫操作,則被修改的數據會復制一份副本,然后 bgsave 子進程會把該副本數據寫入 RDB 文件,在這個過程中,主線程仍然可以直接修改原來的數據。

混合持久化

為了集成了兩者的優點, Redis 4.0 提出了混合使用 AOF 日志和內存快照,也叫混合持久化,既保證了 Redis 重啟速度,又降低數據丟失風險。

redis集群

主從復制

主服務器可以進行讀寫操作,當發生寫操作時自動將寫操作同步給從服務器,而從服務器一般是只讀,并接受主服務器同步過來寫操作命令,然后執行這條命令。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

主從服務器之間的命令復制是異步進行的。具體來說,在主從服務器命令傳播階段,主服務器收到新的寫命令后,會發送給從服務器。但是,主服務器并不會等到從服務器實際執行完命令后,再把結果返回給客戶端,而是主服務器自己在本地執行完命令后,就會向客戶端返回結果了。如果從服務器還沒有執行主服務器同步過來的命令,主從服務器間的數據就不一致了。所以,無法實現強一致性保證(主從數據時時刻刻保持一致),數據不一致是難以避免的。

哨兵模式

在使用 Redis 主從服務的時候,會有一個問題,就是當 Redis 的主從服務器出現故障宕機時,需要手動進行恢復。為了解決這個問題,Redis 增加了哨兵模式(Redis Sentinel),因為哨兵模式做到了可以監控主從服務器,并且提供主從節點故障轉移的功能。

切片集群模式

當 Redis 緩存數據量大到一臺服務器無法緩存時,就需要使用 Redis 切片集群(Redis Cluster )方案,它將數據分布在不同的服務器上,以此來降低系統對單主節點的依賴,從而提高 Redis 服務的讀寫性能。Redis Cluster 方案采用哈希槽(Hash Slot),來處理數據和節點之間的映射關系。在 Redis Cluster 方案中,一個切片集群共有 16384 個哈希槽,這些哈希槽類似于數據分區,每個鍵值對都會根據它的 key,被映射到一個哈希槽中,具體執行過程分為兩大步:

? 根據鍵值對的 key,按照 CRC16 算法(opens new window)計算一個 16 bit 的值。

? 再用 16bit 值對 16384 取模,得到 0~16383 范圍內的模數,每個模數代表一個相應編號的哈希槽。

Redis 過期刪除與內存淘汰

每當我們對一個 key 設置了過期時間時,Redis 會把該 key 帶上過期時間存儲到一個過期字典(expires dict)中,也就是說「過期字典」保存了數據庫中所有 key 的過期時間。

Redis 使用的過期刪除策略是「惰性刪除+定期刪除」這兩種策略配和使用。

惰性刪除策略的做法是,不主動刪除過期鍵,每次從數據庫訪問 key 時,都檢測 key 是否過期,如果過期則刪除該 key。

定期刪除策略的做法是,每隔一段時間「隨機」從數據庫中取出一定數量的 key 進行檢查,并刪除其中的過期key。Redis 的定期刪除的流程:

  1. 從過期字典中隨機抽取 20 個 key;

  2. 檢查這 20 個 key 是否過期,并刪除已過期的 key;

  3. 如果本輪檢查的已過期 key 的數量,超過 5 個(20/4),也就是「已過期 key 的數量」占比「隨機抽取 key 的數量」大于 25%,則繼續重復步驟 1;如果已過期的 key 比例小于 25%,則停止繼續刪除過期 key,然后等待下一輪再檢查。可以看到,定期刪除是一個循環的流程。那 Redis 為了保證定期刪除不會出現循環過度,導致線程卡死現象,為此增加了定期刪除循環流程的時間上限,默認不會超過 25ms。

如何避免緩存雪崩、緩存擊穿、緩存穿透

通常我們為了保證緩存中的數據與數據庫中的數據一致性,會給 Redis 里的數據設置過期時間,當緩存數據過期后,用戶訪問的數據如果不在緩存里,業務系統需要重新生成緩存,因此就會訪問數據庫,并將數據更新到 Redis 里,這樣后續請求都可以直接命中緩存。

當大量緩存數據在同一時間過期(失效)時,如果此時有大量的用戶請求,都無法在 Redis 中處理,于是全部請求都直接訪問數據庫,從而導致數據庫的壓力驟增,嚴重的會造成數據庫宕機,從而形成一系列連鎖反應,造成整個系統崩潰,這就是緩存雪崩的問題。

將緩存失效時間隨機打散: 我們可以在原有的失效時間基礎上增加一個隨機值(比如 1 到 10 分鐘)這樣每個緩存的過期時間都不重復了,也就降低了緩存集體失效的概率。

設置緩存不過期: 我們可以通過后臺服務來更新緩存數據,從而避免因為緩存失效造成的緩存雪崩,也可以在一定程度上避免緩存并發問題。


我們的業務通常會有幾個數據會被頻繁地訪問,比如秒殺活動,這類被頻地訪問的數據被稱為熱點數據。如果緩存中的某個熱點數據過期了,此時大量的請求訪問了該熱點數據,就無法從緩存中讀取,直接訪問數據庫,數據庫很容易就被高并發的請求沖垮,這就是緩存擊穿的問題。

互斥鎖方案(Redis 中使用 setNX 方法設置一個狀態位,表示這是一種鎖定狀態),保證同一時間只有一個業務線程請求緩存,未能獲取互斥鎖的請求,要么等待鎖釋放后重新讀取緩存,要么就返回空值或者默認值。

不給熱點數據設置過期時間,由后臺異步更新緩存,或者在熱點數據準備要過期前,提前通知后臺線程更新緩存以及重新設置過期時間;

當用戶訪問的數據,既不在緩存中,也不在數據庫中,導致請求在訪問緩存時,發現緩存缺失,再去訪問數據庫時,發現數據庫中也沒有要訪問的數據,沒辦法構建緩存數據,來服務后續的請求。那么當有大量這樣的請求到來時,數據庫的壓力驟增,這就是緩存穿透的問題。

非法請求的限制:當有大量惡意請求訪問不存在的數據的時候,也會發生緩存穿透,因此在 API 入口處我們要判斷求請求參數是否合理,請求參數是否含有非法值、請求字段是否存在,如果判斷出是惡意請求就直接返回錯誤,避免進一步訪問緩存和數據庫。? 設置空值或者默認值:當我們線上業務發現緩存穿透的現象時,可以針對查詢的數據,在緩存中設置一個空值或者默認值,這樣后續請求就可以從緩存中讀取到空值或者默認值,返回給應用,而不會繼續查詢數據庫。? 使用布隆過濾器快速判斷數據是否存在,避免通過查詢數據庫來判斷數據是否存在:我們可以在寫入數據庫數據時,使用布隆過濾器做個標記,然后在用戶請求到來時,業務線程確認緩存失效后,可以通過查詢布隆過濾器快速判斷數據是否存在,如果不存在,就不用通過查詢數據庫來判斷數據是否存在,即使發生了緩存穿透,大量請求只會查詢 Redis 和布隆過濾器,而不會查詢數據庫,保證了數據庫能正常運行,Redis 自身也是支持布隆過濾器的。

常見的緩存更新策略共有3種:

? Cache Aside(旁路緩存)策略;

? Read/Write Through(讀穿 / 寫穿)策略;

? Write Back(寫回)策略;

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

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

相關文章

vscode不滿足先決條件問題的解決——vscode的老版本安裝與禁止更新(附安裝包)

目錄 起因 vscode更新設置的關閉 安裝包 結語 起因 由于主包用的系統是centos的,且版本有點老了,再加上vscode現在不支持老版本的,這對主包來說更是雪上加霜啊 但是主包看了網上很多教程,眼花繚亂,好多配置要改&…

如何成為一名優秀的產品經理(自動駕駛)

一、 夯實核心基礎 深入理解智能駕駛技術棧: 感知: 攝像頭、雷達(毫米波、激光雷達)、超聲波傳感器的工作原理、優缺點、融合策略。了解目標檢測、跟蹤、SLAM等基礎算法概念。 定位: GNSS、IMU、高精地圖、輪速計等定…

【ISAQB大綱解讀】信息隱藏指的是什么

在軟件架構中,信息隱藏(Information Hiding) 是核心設計原則之一,由 David Parnas 在 1972 年提出。它強調通過限制對模塊內部實現細節的訪問,來降低系統復雜度、提高可維護性和可擴展性。在 ISAQB 的學習目標&#xf…

網頁前端開發(基礎進階2--JS)

前面學習了html與css,接下來學習JS(JavaScript與Java無關)。 web標準(網頁標準)分為3個部分: 1.html主要負責網頁的結構(頁面的元素和內容) 2.css主要負責網頁的表現(…

完全移除內聯腳本

說明 日期&#xff1a;2025年5月9日。 內聯腳本給跨站腳本攻擊&#xff08;XSS&#xff09;留了條路。 示例 日期&#xff1a;2025年5月9日。 如下網頁文件a.html&#xff1a; <!-- 內聯腳本塊 --> <script> function handleClick{ alert("Hello")…

[藍橋杯]約瑟夫環

約瑟夫環 題目描述 nn 個人的編號是 1 ~ nn&#xff0c;如果他們依編號按順時針排成一個圓圈&#xff0c;從編號是 1 的人開始順時針報數。 &#xff08;報數是從 1 報起&#xff09;當報到 kk 的時候&#xff0c;這個人就退出游戲圈。下一個人重新從 1 開始報數。 求最后剩…

電子電氣架構 --- 如何應對未來區域式電子電氣(E/E)架構的挑戰?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

isp中的 ISO代表什么意思

isp中的 ISO代表什么意思 在攝影和圖像信號處理&#xff08;ISP&#xff0c;Image Signal Processor&#xff09;領域&#xff0c;ISO是一個用于衡量相機圖像傳感器對光線敏感度的標準參數。它最初源于膠片攝影時代的 “國際標準化組織&#xff08;International Organization …

第十二節:第五部分:集合框架:Set集合的特點、底層原理、哈希表、去重復原理

Set系列集合特點 哈希值 HashSet集合的底層原理 HashSet集合去重復 代碼 代碼一&#xff1a;整體了解一下Set系列集合的特點 package com.itheima.day20_Collection_set;import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.…

邁向分布式智能:解析MCP到A2A的通信范式遷移

智能體與外部世界的橋梁之言&#xff1a; 在深入探討智能體之間的協作機制之前&#xff0c;我們有必要先厘清一個更基礎的問題&#xff1a;**單個智能體如何與外部世界建立連接&#xff1f;** 這就引出了我們此前介紹過的 **MCP&#xff08;Model Context Protocol&…

Android Studio 配置之gitignore

1.創建或編輯.gitignore文件 在項目根目錄下檢查是否已有.gitignore文件。如果沒有&#xff0c;創建一個新文件&#xff0c;命名為.gitignore&#xff08;注意文件名前有個點&#xff09;。 添加忽略規則&#xff1a;在.gitignore中添加以下內容&#xff1a; 忽略整個 .idea …

算法:二分查找

1.二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 二分查找算法要確定“二段性”&#xff0c;時間復雜度為O(lonN)。為了防止數據溢出&#xff0c;所以求mid時要用防溢出的方式。 class Solution { public:int search(vector<int>& nums, int tar…

day62—DFS—太平洋大西洋水流問題(LeetCode-417)

題目描述 有一個 m n 的矩形島嶼&#xff0c;與 太平洋 和 大西洋 相鄰。 “太平洋” 處于大陸的左邊界和上邊界&#xff0c;而 “大西洋” 處于大陸的右邊界和下邊界。 這個島被分割成一個由若干方形單元格組成的網格。給定一個 m x n 的整數矩陣 heights &#xff0c; hei…

Langchaine4j 流式輸出 (6)

Langchaine4j 流式輸出 大模型的流式輸出是指大模型在生成文本或其他類型的數據時&#xff0c;不是等到整個生成過程完成后再一次性 返回所有內容&#xff0c;而是生成一部分就立即發送一部分給用戶或下游系統&#xff0c;以逐步、逐塊的方式返回結果。 這樣&#xff0c;用戶…

自動駕駛與智能交通:構建未來出行的智能引擎

隨著人工智能、物聯網、5G和大數據等前沿技術的發展&#xff0c;自動駕駛汽車和智能交通系統正以前所未有的速度改變人類的出行方式。這一變革不僅是技術的融合創新&#xff0c;更是推動城市可持續發展的關鍵支撐。 一、自動駕駛與智能交通的定義 1. 自動駕駛&#xff08;Auto…

數據基座覺醒!大數據+AI如何重構企業智能決策金字塔(下)

1. 數據架構的量子躍遷 1.1 從線性堆疊到立體網絡 傳統六層架構正在經歷基因重組。某智能家居企業將數據流轉路徑重構為三維拓撲網絡后&#xff0c;新品研發周期從18個月壓縮至9個月。這個改造的核心在于打破數據層間的物理隔離&#xff0c;讓原始數據流能直接觸達決策中樞。…

Linux 腳本文件編輯(vim)

1. 用戶級配置文件&#xff08;~/.bashrc&#xff09; vim ~/.bashrc # 編輯 source ~/.bashrc # 讓編輯生效 ~/.bashrc 文件是 Bash Shell 的配置文件&#xff0c;用于定義用戶登錄時的環境變量、別名、函數等設置。當你修改了 ~/.bashrc 文件后&#xff0c;通常需要重新…

【Pytorch學習筆記】模型模塊06——hook函數

hook函數 什么是hook函數 hook函數相當于插件&#xff0c;可以實現一些額外的功能&#xff0c;而又不改變主體代碼。就像是把額外的功能掛在主體代碼上&#xff0c;所有叫hook&#xff08;鉤子&#xff09;。下面介紹Pytorch中的幾種主要hook函數。 torch.Tensor.register_h…

SQL進階之旅 Day 11:復雜JOIN查詢優化

【SQL進階之旅 Day 11】復雜JOIN查詢優化 在數據處理日益復雜的今天&#xff0c;JOIN操作作為SQL中最強大的功能之一&#xff0c;常常成為系統性能瓶頸。今天我們進入"SQL進階之旅"系列的第11天&#xff0c;將深入探討復雜JOIN查詢的優化策略。通過本文學習&#xf…

Spring AI 之檢索增強生成(Retrieval Augmented Generation)

檢索增強生成&#xff08;RAG&#xff09;是一種技術&#xff0c;有助于克服大型語言模型在處理長篇內容、事實準確性和上下文感知方面的局限性。 Spring AI 通過提供模塊化架構來支持 RAG&#xff0c;該架構允許自行構建自定義的 RAG 流程&#xff0c;或者使用 Advisor API 提…