Linux——Redis

目錄

一、Redis概念

1.1 Redis定義

1.2 Redis的特點

1.3 Redis的用途

1.4?Redis與其他數據庫的對比

二、Redis數據庫

三、Redis五個基本類型

3.1 字符串

3.2 列表(list) ——可以有相同的值

3.3 集合(set) ——值不能重復

3.4 哈希(hash) ——類似于Map集合

3.5 有序集合(zset) ——不能重復

四、事務

4.1 事務定義

4.2 與mysql的事務的區別

4.3 代碼解釋?

五、樂觀鎖和悲觀鎖?

5.1 樂觀鎖

5.2 悲觀鎖

5.3?樂觀鎖與悲觀鎖的區別和適用場景

六、Redis持久化?

6.1 定義

6.2 兩種方式

(1)RDB

(2)AOF

七、主從復制

7.1 概念

7.2 模式

(1)一個主機有兩個從機

(2)鏈路模式

八、哨兵模式

8.1 概念

8.2 優缺點

九、緩存穿透、擊穿和雪崩

1.緩存穿透——查不到

2.緩存擊穿——量太大,緩存過期

3.緩存雪崩


一、Redis概念

1.1 Redis定義

????????Redis(Remote Dictionary Server)是一個開源的、基于內存的數據結構存儲系統,通常用作數據庫、緩存或消息代理。它支持多種數據結構,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,并提供豐富的操作命令。

1.2 Redis的特點

  • 高性能:數據存儲在內存中,讀寫速度極快,適合高并發場景。
  • 持久化:支持RDB(快照)和AOF(日志)兩種持久化機制,確保數據安全。
  • 數據結構豐富:支持多種數據結構,滿足不同業務需求。
  • 原子操作:所有操作是原子性的,適合分布式鎖等場景。
  • 擴展性:支持主從復制、分片(集群)等功能。

1.3 Redis的用途

  • 緩存:加速數據訪問,減輕后端數據庫壓力。
  • 會話存儲:存儲用戶會話信息,支持分布式系統。
  • 消息隊列:利用列表或發布/訂閱模式實現消息傳遞。
  • 實時排行榜:使用有序集合實現實時排名功能。
  • 地理空間索引:支持存儲和查詢地理位置數據。

1.4?Redis與其他數據庫的對比

  • 與關系型數據庫(如MySQL):Redis基于內存,適合高速讀寫;關系型數據庫適合復雜查詢和事務。
  • 與Memcached:Redis支持更多數據結構和持久化,Memcached更簡單,僅支持鍵值存儲。

二、Redis數據庫

1.Redis有16個(0-15)數據庫,默認使用0號數據庫。

2.Redis數據庫的有關操作

三、Redis五個基本類型

3.1 字符串

(1)特點

最基本數據類型,可以存儲文本或二進制數據。

(2)常用的操作

(3)使用場景

①計數器

②統計多個單位數量

③對象緩存存儲

3.2 列表(list) ——可以有相同的值

(1)定義

有序的字符串列表,可以在表頭或表尾推入或彈出元素(隊列或棧結構)。

支持隊列(先進先出)和棧(后進先出)的操作。

(2)常用命令

(3)使用場景

①消息隊列

②任務調度

3.3 集合(set) ——值不能重復

(1)定義

無序唯一元素的集合。

(2)常見命令

(3)使用場景

可以實現差集、交集、并集。

3.4 哈希(hash) ——類似于Map集合

(1)定義

用于存儲鍵值對的集合。

(2)常用命令

(3)使用場景

需要頻繁訪問和更新某個實體的多個字段的場景。

3.5 有序集合(zset) ——不能重復

(1)常用命令

(2)使用場景

應用于排行榜、優先隊列等場景。

四、事務

4.1 事務定義

是一組命令的集合,不保證原子性。

4.2 與mysql的事務的區別

mysql事務:支持完整的ACID事務,保證所有操作要么全部成功,要么全部失敗。

區別:redis事務不支持隔離級別,也不支持回滾。

4.3 代碼解釋?

注意:

①如果編譯出錯,則exec執行不成功,所有命令均不會執行。

②運行時錯誤,其他命令仍可以執行,只是在出錯的地方拋出異常。

五、樂觀鎖和悲觀鎖?

5.1 樂觀鎖

(1)定義:假設沖突很少發生,操作過程中不鎖定資源,只在提交時檢測沖突。檢測是否修改過數據,如果有修改,則放棄修改,不提交。

(2)使用場景:沖突較少、讀多寫少的場景(讀取遠多于寫入的場景)

5.2 悲觀鎖

(1)定義:假設沖突總是會發生,操作前就鎖定資源,直到操作結束再解鎖

(2)使用場景:需要極強一致性、沖突頻繁的場景(金融交易、多寫操作)

5.3?樂觀鎖與悲觀鎖的區別和適用場景

實現方式差異:

????????樂觀鎖通常通過版本號(Version)或時間戳實現。例如數據庫表中增加version字段,更新時檢查版本是否一致:

UPDATE table SET column = new_value, version = version + 1 WHERE id = ? AND version = old_version

????????悲觀鎖依賴數據庫或編程語言提供的鎖機制,如:數據庫:SELECT FOR UPDATE

性能對比:

????????樂觀鎖在低沖突場景下性能更高,因為無需加鎖和解鎖,減少了線程阻塞的開銷。

????????悲觀鎖在高沖突場景中更穩定,但加鎖會導致線程阻塞,可能引發死鎖或性能下降。

適用場景:

樂觀鎖適合:

  • 讀多寫少的場景(如熱點數據緩存更新)

  • 沖突概率較低的業務(如用戶信息修改)

  • 需要高吞吐量的系統(如電商庫存扣減)

悲觀鎖適合:

  • 寫多讀少的場景(如銀行轉賬)

  • 關鍵數據的強一致性要求(如訂單狀態變更)

  • 短事務且沖突概率高的操作

優缺點總結:

樂觀鎖優點:

  • 無阻塞,并發性能高

  • 避免死鎖問題

  • 適合分布式環境

樂觀鎖缺點:

  • 沖突頻繁時重試成本高

  • 需處理業務邏輯的回滾

悲觀鎖優點:

  • 保證強一致性

  • 實現簡單

悲觀鎖缺點:

  • 線程阻塞影響性能

  • 可能引發死鎖

  • 不適合分布式系統

六、Redis持久化?

6.1 定義

將內存中的數據保存到磁盤中。

6.2 兩種方式

(1)RDB

①原理:通過fork創建一個子進程,子進程將內存的內容寫入到一個臨時文件,持久化過程結束,把臨時文件替換上一次持久化好的文件。(但要注意:整個過程中,主進程不進行任何IO操作)。

②優點:適合大規模數據恢復;對數據完整性要求不高。

③缺點:fork進程會占用一定的空間;需要一定的時間間隔操作,如果redis意外宕機,最后一次持久化后的數據就沒有。

(2)AOF

①原理:將所有命令記錄下來,恢復時將所有命令執行一遍。

②優點:每修改一次,都會同步,文件完整性比較好。

③缺點:AOF數據文件大,修復速度慢,運行效率低。

七、主從復制

7.1 概念

????????將一個Redis服務器數據復制(數據復制是單向的)到其他服務器,前者稱為主節點,后者稱為從節點。主機負責寫數據,從機讀數據。(注意:從機不能寫數據,從機將主機中的數據備份,同步主機數據)

7.2 模式

(1)一個主機有兩個從機

(2)鏈路模式

八、哨兵模式

8.1 概念

????????Redis哨兵(Sentinel)是Redis官方提供的高可用性解決方案,用于監控和管理Redis主從集群。哨兵模式的核心功能包括:自動故障檢測、主從切換(failover)、配置更新和通知。哨兵通過心跳機制監測主節點和從節點的健康狀態,當主節點故障時,哨兵會自動選舉一個從節點晉升為新的主節點,并更新其他從節點的配置。

? ? ? ? 簡而言之:哨兵監測主機是否宕機,如果宕機則進行“投票”選舉新的主節點,自動切換新主機。

8.2 優缺點

優點:

高可用性:自動故障轉移機制確保主節點故障時服務不中斷,提升系統容錯能力。
自動化運維:無需人工干預即可完成主從切換和配置更新,降低運維成本。
監控與告警:哨兵持續監控節點狀態,支持通過API或通知機制推送故障事件。
兼容性:與Redis主從復制無縫集成,無需修改客戶端代碼即可使用。

缺點:

腦裂問題:網絡分區可能導致多個主節點同時存在(split-brain),需額外配置解決(如min-slaves-to-write)。
性能開銷:哨兵進程本身需要資源,且故障轉移期間可能存在短暫服務不可用。
配置復雜度:需部署多個哨兵節點(建議至少3個)以避免單點故障,配置和管理較復雜。
客戶端適配:部分舊版客戶端可能不支持哨兵協議,需升級或使用代理(如Twemproxy)。

九、緩存穿透、擊穿和雪崩

1.緩存穿透——查不到

(1)定義

????????客戶端查詢要查詢數據,但發現Redis(緩存)中沒有,向持久層數據庫發起查詢,數據庫中也沒有該數據,多次重復,會給持久層數據庫造成較大的壓力。

(2)解決辦法

????????①布隆過濾器

????????②緩存空對象

2.緩存擊穿——量太大,緩存過期

(1)定義

????????對于熱點數據,存在大量的并發,當熱點數據消失時,持續并發穿破緩存,直接請求數據庫,導致數據庫瞬間壓力大。

(2)解決辦法

????????①互斥鎖

????????②熱點數據不過期

3.緩存雪崩

(1)定義

????????緩存集中過期/Redis宕機

(2)解決辦法

????????①限流降級

????????②數據預熱

????????③Redis高可用

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

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

相關文章

【AI大模型】部署優化量化:INT8壓縮模型

INT8(8位整數)量化是AI大模型部署中最激進的壓縮技術,通過將模型權重和激活值從FP32降至INT8(-128~127整數),實現4倍內存壓縮2-4倍推理加速,是邊緣計算和高并發服務的核心優化手段。…

LFU 緩存

題目鏈接 LFU 緩存 題目描述 注意點 1 < capacity < 10^40 < key < 10^50 < value < 10^9對緩存中的鍵執行 get 或 put 操作&#xff0c;使用計數器的值將會遞增當緩存達到其容量 capacity 時&#xff0c;則應該在插入新項之前&#xff0c;移除最不經常使…

檢查輸入有效性(指針是否為NULL)和檢查字符串長度是否為0

檢查輸入有效性&#xff08;指針是否為NULL&#xff09;和檢查字符串長度是否為0 這兩個檢查針對的是完全不同的邊界情況&#xff0c;都是必要的防御性編程措施&#xff1a; 1. 空指針檢查 if(!src) 目的&#xff1a;防止解引用空指針場景&#xff1a;當調用者傳入 NULL 時風險…

Apache POI 的 HSSFWorkbook、SXSSFWorkbook和XSSFWorkbook三者的區別

HSSFWorkbook 專用于處理Excel 97-2003&#xff08;.xls&#xff09;格式的二進制文件。基于純Java實現&#xff0c;所有數據存儲在內存中&#xff0c;適合小規模數據&#xff08;通常不超過萬行&#xff09;。內存占用較高&#xff0c;但功能完整&#xff0c;支持所有舊版Exce…

冷凍電鏡重構的GPU加速破局:從Relion到CryoSPARC的并行重構算法

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 一、冷凍電鏡重構的算力困局 隨著單粒子冷凍電鏡&#xff08;cryo-EM&#xff09;分辨率突破…

算法學習筆記:16.哈希算法 ——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

在計算機科學中&#xff0c;哈希算法&#xff08;Hash Algorithm&#xff09;是一種將任意長度的輸入數據映射到固定長度輸出的技術&#xff0c;其輸出稱為哈希值&#xff08;Hash Value&#xff09;或散列值。哈希算法憑借高效的查找、插入和刪除性能&#xff0c;在數據存儲、…

16018.UE4+Airsim仿真環境搭建超級詳細

文章目錄 1 源碼下載2 下載安裝軟件2.1 安裝 UE4 軟件2.2 安裝visual studio 20223 編譯airsim源碼4 進入AirSim工程,打開工程5 UE4 工程創建5.1 下載免費場景 CityPark,并創建工程5.2 工程編譯5.2.1 將airsim 插件拷貝到 UE4工程路徑中5.2.2 修改工程配置文件5.2.3 創建c++類…

Python 實戰:構建 Git 自動化助手

在多項目協作、企業級工程管理或開源社區維護中&#xff0c;經常面臨需要同時管理數十甚至上百個 Git 倉庫的場景&#xff1a;多倉庫需要統一 pull 拉取更新定期向多個項目批量 commit 和 push自動備份 Git 項目批量拉取私有倉庫并管理密鑰為解決這類高頻、重復、機械性工作&am…

【PTA數據結構 | C語言版】出棧序列的合法性

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 給定一個最大容量為 m 的堆棧&#xff0c;將 n 個數字按 1, 2, 3, …, n 的順序入棧&#xff0c;允許按任何順序出棧&#xff0c;則哪些數字序列是不可能得到的&#xff1f;例如給定 m5、n7&#xf…

【LangGraph】create_react_agent 方法詳細解釋

create_react_agent 方法詳細解釋 create_react_agent 方法是一個在 LangGraph 中創建 React 代理的核心函數,接下來我們將一起探討這個函數的作用、參數、返回值以及工作原理。 @_convert_modifier_to_prompt def create_react_agent(model: Union[str, LanguageModelLike]…

【時間之外】塵封的智能套件復活記

目錄 塵封的獎品 初次觸網的挫敗 客服只會誘導消費 意外發現的生機 真相與反思 塵封的獎品 五年前那個蟬鳴陣陣的夏日&#xff0c;我抱著創新比賽特等獎的獎品禮盒走下領獎臺時&#xff0c;絕對想不到這份榮譽會衍生出如此曲折的故事。禮盒里靜靜躺著的智能家居套裝&…

從零開始學前端html篇1

1基本結構<!DOCTYPE html> <html><head><title>this is a good website</title></head><body><h1>hello!</h1></body> </html>運行效果如下&#xff08;編輯器提示waings:"缺少所需的 lang 特性"…

Redis Cluster 手動部署(小白的“升級打怪”成長之路)

目錄 一、環境規劃 二、基礎環境 1、創建配置目錄 2、生成配置文件 3、修改監聽端口 4、修改數據目錄 5、修改日志目錄 6、修改PID文件目錄 7、修改保護模式 8、修改進程運行模式 9、修改監聽地址 10、生成集群配置 11、啟動服務 三、構建集群 1、將其他節點加入…

【Java入門到精通】(三)Java基礎語法(下)

一、面向對象&#xff08;類和對象&#xff09;1.1 萬事萬物皆對象類&#xff1a;對對象向上抽取出像的部分、公共的部分以此形成類&#xff0c;類就相當于一個模板。對象&#xff1a;模板下具體的產物可以理解為具體對象&#xff0c;對象就是一個一個具體的實例&#xff0c;就…

Java文件傳輸要點

Java文件傳輸要點 一、前端 <form action"/upload" method"post" enctype"multipart/form-data"> <!--<form action"/upload" method"post">-->姓名: <input type"text" name"username…

Spring Boot 中使用 Lombok 進行依賴注入的示例

Spring Boot 中使用 Lombok 進行依賴注入的示例 下面我將展示 Spring Boot 中使用 Lombok 進行依賴注入的不同方式&#xff0c;包括構造器注入、屬性注入和 setter 方法注入&#xff0c;以及相應的測試用例。 1. 構造器注入&#xff08;推薦方式&#xff09; import lombok.Req…

vue3+vit+vue-router路由,側邊欄菜單,面包屑導航設置層級結構

文章目錄注意效果圖目錄結構代碼vite.config.ts需要配置路徑別名符號main.tsApp.vueBreadcrumb.vue面包屑組件menus.ts// src/router/index.ts其他文件注意 目錄結構僅供參考DefaultLayout.vue 沒有用到&#xff0c;我直接寫在APP文件中vux-store我也沒有用到&#xff0c;單獨…

使用Selenium自動化獲取抖音創作者平臺視頻數據

前言 在當今短視頻盛行的時代&#xff0c;抖音作為國內領先的短視頻平臺&#xff0c;吸引了大量內容創作者。對于創作者而言&#xff0c;了解自己發布的視頻表現&#xff08;如播放量、發布時間等&#xff09;至關重要。本文將介紹如何使用Python的Selenium庫來自動化獲取抖音…

SpringCloud之Eureka

SpringCloud之Eureka 推薦參考&#xff1a;https://www.springcloud.cc/spring-cloud-dalston.html#_service_discovery_eureka_clients 1. 什么是Eureka Eureka 用于簡化分布式系統的服務治理&#xff0c;基于REST的服務&#xff0c;用于服務的注冊與發現。通過注冊發現、客戶…

squash壓縮合并

要將test分支的多次提交合并到dev分支并壓縮為一個commit&#xff0c;核心是使用 git merge --squash 命令&#xff08;壓縮合并&#xff09;&#xff0c;具體步驟如下&#xff1a; 詳細步驟&#xff1a; 1. 切換到dev分支并拉取最新代碼先確保本地dev分支是最新的&#xff0c;…