一、redis-萬字長文讀懂redis

高性能分布式緩存Redis

  • `第一篇章`
  • 1.1緩存發展史&緩存分類
    • 1.1.1 大型網站中緩存的使用
      • 帶來的問題
    • 1.1.2 常見緩存的分類及對比
      • 與memcache對比
    • 1.2 數據類型選擇&應用場景
      • 1.2.1 string
      • 1.2.2 hash
      • 1.2.3 鏈表
      • 1.2.4 set
      • 1.2.5 sortedset有序集合類型
      • 1.2.6 總結
    • 1.3 Redis高級應用&拓展功能
      • 1.3.1 發布訂閱
        • redis提供發布訂閱功能,可用于消息的傳輸
        • 指令詳情
        • 使用場景
      • 1.3.2 事務
        • redis事務支持回滾嗎
        • redis 事務
      • 1.3.2 lua腳本
      • 1.3.3 慢查詢日志
  • `第二篇章`
    • 2.1 持久化原理
      • 2.1.1 原理
      • 2.1.2 持久化流程
      • 2.1.3 RDB
        • 概念
        • 特點
        • 觸發方式:指令手動觸發和redis.conf自動觸發
        • RDB優勢
        • RDB劣勢
      • 2.1.4 AOF
        • 概念
        • 特點
        • AOF持久化實現
        • AOF重寫原理
        • 持久化優先級
      • 2.1.5 降低fork阻塞
      • 2.1.6 實踐中的其它策略
    • 2.2 過期刪除策略
      • 2.2.1 問題分析
        • 1. 如何設置過期時間
        • 2. 如何盤判定key已過期
        • 3. 過期刪除策略有哪些
        • 4. Redis過期刪除策略是什么
    • 2.3 內存淘汰策略
      • 2.3.1 概念
      • 2.3.2 如何設置Redis的最大運行內存
      • 2.3.3 Redis的八種內存淘汰策略
      • 2.3.4 LRU算法和LFU算法有什么區別
        • LRU傳統算法
        • Redis中的LRU算法
        • LFU算法
        • redis中LFU算法
    • 2.4 Redis高可用
      • 2.4.1 主從復制的出現
      • 2.4.2 主從復制結構
      • 2.4.3 主從復制實現
      • 2.4.4 sentinel 哨兵模式
        • 哨兵的出現
        • 客觀下線
        • 哨兵掛了怎么辦
      • 2.4.5 主從+哨兵存在的問題
  • `第三篇章`
    • 3.1 分布式鎖
      • 何為分布式鎖
      • 分布鎖的特點
      • 如何設計一把良好的鎖
    • 3.2 布隆過濾器(BloomFilter)
    • 3.3 Redis Cluster
  • `第四篇章-FAQ`
    • 4.1 如何保持緩存和數據庫的一致性
      • ==總結==
      • 1)為什么使用redis來做緩存
      • 2)緩存策略帶來的問題
      • 3)導致數據不一致原因
      • 4)并發引起的一致性問題
      • 5)刪除緩存可以保證一致性嗎
      • 6)如何保證兩步都執行成功
      • 7)主從庫延遲和延遲雙刪策略
      • 8)保證更新數據庫和刪除緩存都能成功
    • 4.2 redis是單線程架構還是多線程架構
    • 4.3 單線程的redis為什么這么快
    • 4.4 Redis6.x之后為何引入了多線程?
    • 4.5 緩存穿透\緩存擊穿\緩存雪崩
    • 4.6 為什么用 Redis 作為 MySQL 的緩存?
    • 4.7 Redis 如何實現數據不丟失?

第一篇章

1.1緩存發展史&緩存分類

1.1.1 大型網站中緩存的使用

在這里插入圖片描述
分析:直接從數據庫中的數據,是存儲在磁盤中的,需要多次的IO,而且請求數據庫是基于TCP連接,單機的mysql qps 1W+,而redis的qps達到10w+;所以可以在Tomcat和mysql中加入屏障,將熱點數據放入redis,非熱點數據放入數據庫中,流程如下
在這里插入圖片描述

帶來的問題

  • 讀寫緩存策略
    • 讀寫穿透
    • 異步緩存寫入
  • 數據庫和緩存如何保證數據一致性
    • 寫策略
      • 先更新緩存,再刪除緩存
      • 先刪除緩存,再更新數據庫

1.1.2 常見緩存的分類及對比

與memcache對比

共同點:

  1. 都是基于內存的數據庫,一般都用來當做緩存使用。
  2. 都有過期策略。
  3. 兩者的性能都非常高。

區別:

  1. Redis 支持的數據類型更豐富(String、Hash、List、Set、zset),而 Memcached 只支持最簡單的 key-value 數據類型;
  2. Redis 支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用,而 Memcached 沒有持久化功能,數據全部存在內存之中,Memcached 重啟或者掛掉后,數據就沒了
  3. Redis 原生支持集群模式,Memcached 沒有原生的集群模式,需要依靠客戶端來實現往集群中分片寫入數據;
  4. Redis 支持發布訂閱模型、Lua 腳本、事務等功能,而 Memcached 不支持
    所以,很少使用memcached了

1.2 數據類型選擇&應用場景

  • 常見的五種數字類型:string、hash、list、set、zset

1.2.1 string

  • redis并不是簡單的使用c的string,而是構建了簡單動態字符串,不光可以保存文本數據還可以保存二進制,并且獲取字符串的長度為0
    • 常用命令:set,get,strlen,exists
    • 應用場景:緩存對象、常規計數、分布式鎖、共享session
      • 對象緩存:直接緩存整個對象的json
      • 分布式鎖:setnx product:10001 true;setnx product:10001 false

1.2.2 hash

  • key-value,適合存儲
    • 適合做對象緩存

      電商購物車
      用戶id為key;商品id為field;商品數量為value;

      Hest cart:1 1001 1 //向id為1的商品1001添加1間商品
      

1.2.3 鏈表

  • c的鏈表查詢比較難,所以redis使用了雙向鏈表,支持反向查找和遍歷,更方便操作,不過帶了了額外的內存開銷
    • 內部實現:quicklist
    • 常用命令:rpush、lpop、lpush
    • 應用場景:發布與訂閱或者說消息隊列,慢查詢
      在這里插入圖片描述
    • 常用數據結構
      • Stack(棧)=LPUSH(左邊放)+LPOP(左邊取)–> FILO
      • Queue(隊列)=LPUSH(左邊放)+RPOP右邊取)
      • BLocking queue(阻塞隊列)=LPUSH(左邊放)+ BRPOP(右邊阻塞取:沒有數據就阻塞!)
        • 實現微波朋友圈等的關注列表顯示
        • 實現后發的消息在列表中最上方展示
        • 小明關注了北京本地寶,京城美味君等公眾號,這些訂閱號發布消息時,通過推或拉的方式把消息LPUSH放入redis中屬于小明的list中。其中key為msg:{小明D}。當小明要獲取大V們發的消息時,使用LRANGE 命令從隊列中獲取指定個數的訂閱號信息
          Lpush msg:1 1001 //1001是北京本地寶,mag:1是小明的id
          Lpush msg:1 1002
          顯示的結果是1002先顯示

1.2.4 set

  • 是一個無序并唯一的鍵值集合,它的存儲順序不會按照插入的先后順序進行存儲。一個集合最多可以存儲 2^32-1 個元素。概念和數學中個的集合基本類似,可以交集,并集,差集等等,所以 set 類型除了支持集合內的增刪改查,同時還支持多個集合取交集、并集、差集
    • 底層實現:哈希表或整數集合
    • 常用命令: sadd,spop,smembers,sismember,scard,sinterstore,sunion 等
    • 應用場景: 需要存放的數據不能重復以及需要獲取多個數據源交集和并集等場景

1.2.5 sortedset有序集合類型

  • 介紹:zset 類型(有序集合類型)相比于 Set 類型多了一個排序屬性 score(分值),對于有序集合zSet 來說,每個存儲元素相當于有兩值組成的,一個是有序集合的元素值,一個是排序值。
    • 內部實現:壓縮列表或跳表
    • 常用命會: zadd,zcard,zscore,zrange,zrevrange,zrem等
    • 應用場景: 需要對數據根據某個權重進行排序的場景。比如在直播系統中,實時排行信息包含直播間在線用戶列表,各種禮物排行榜,彈幕消息(可以理解為按消息維度的消息排行榜)等信息。

1.2.6 總結

在這里插入圖片描述

1.3 Redis高級應用&拓展功能

1.3.1 發布訂閱

redis提供發布訂閱功能,可用于消息的傳輸

redis的發布訂閱包含三個部分,publisher(redis客戶端),subscriber(redis客戶端)、channel(服務器)
在這里插入圖片描述

指令詳情
  • SUBSCRIBE/PSUBSCRIBE:訂閱,精確、或者按匹配符UNSUBSCRIBE/PUNSUBSCRIBE:退訂,精確、或者按匹配
  • PUBLISH:發送;PUBSUB:查看消息列表
使用場景
  • 在Redis哨兵模式中,哨兵通過發布與訂閱的方式與Redis主服務器和Redis從服務器進行通信Redisson是一個分布式鎖框架,在Redisso
  • 分布式鎖釋放的時候,是使用發布與訂閱的方式通知的注:重業務的消息,推薦用消息隊列

1.3.2 事務

redis事務支持回滾嗎

所謂事務,是指作為單個邏輯工作單元執行的一系列操作
mysql在執行事務時,會提供回滾機制,當事務執行發生錯誤時,事務中的所有操作都會撤銷,已修改的數據也會被恢復到事務執行前的狀態,但是redis并沒有提供回滾機制,redis事務不一定能保證原子性

redis 事務

redis事務的本質是一組命令的集合:單詞執行多個命令,一次性、排他性、順序性

  • redis事務是通過multi、exec、discrd、watch這四個命令來完成的
  • redis的單個命令都是原子性的,所以這里需要確保事務的對象是命令集合
  • redis將命令集合序列化并確保處于同一事務的命令集合連續且不被打斷的執行
  • redis不能保障失敗回滾

原理刨析:
在exec執行事務的一瞬間,判斷監控的key是否變動
變動則取消事務隊列,直接不執行
無變動則執行,提交事務
在這里插入圖片描述

1.3.2 lua腳本

redis+lua腳本保持原子性

  • lua是一種輕量小巧的腳本語言用標準C語言編寫并以源代碼形式開放,其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。
  • Lua應用場景
    • 游戲開發、獨立應用腳本、web應用腳本、查詢庫存扣減庫存
    • Nginx+lua開發高性能web應用,限流、防止Sql注入

時間復雜度:取決于執行的腳本。

  • 使用Lua腳本的好處:
  • 減少網絡開銷。可以將多個請求通過腳本的形式一次發送,減少網絡時延。原子操作。redis會將整個腳本作為一個整體執行,中間不會被其他命令插入。因此在編寫腳本的過程中無需擔心會出現競態條件,無換事務。
  • 復用。客戶端發送的腳本會永久存在redis中,這樣,其他客戶端可以復用這一腳本而不需要使用代碼完成相同的邏輯。

1.3.3 慢查詢日志

日常使用redis為什么要用慢查詢日志
客戶端請求的生命周期的完整生命周期,4個階段
慢查詢只統計步驟3的時間
在這里插入圖片描述

  • 在生產環境中,慢查詢功能可以有效地幫助我們找到Redis可能存在的瓶頸,但在實際使用過程中要注意以下幾點:
    • slowog-max-en:線上建議調大慢查詢列表,記錄慢査詢時Redis會對長命令做階段操作,并不會占用大量內存,增大慢查詢列表可以減緩慢查詢被剔除的可能,例如線上可設置為1000以上.
    • 2slowlog-log-slower-than:默認值超過10毫秒判定為慢查詢,需要根據Redis并發量調整該值,慢查詢只記錄命令的執行時間,
      并不包括命令排隊和網絡傳輸時間,因此客戶端執行命令的時間會大于命令的實際執行時間,因為命2令執行排隊機制,慢查詢會導致其他命令級聯阻塞,因此客戶端出現請求超時時,需要檢査該時間點是否有對應的慢查詢,從而分析是否為慢查詢導致的命令級聯阻塞.

第二篇章

2.1 持久化原理

2.1.1 原理

redis是內存數據,數據都是存儲在內存中,為了避免進程退出導致數據的永久丟失,需要定期將redis中方的數據以某種形式從內存

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

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

相關文章

[數倉]三、離線數倉(Hive數倉系統)

第1章 數倉分層 1.1 為什么要分層 DIM:dimensionality 維度 1.2 數據集市與數據倉庫概念 1.3 數倉命名規范 1.3.1 表命名 ODS層命名為ods_表名DIM層命名為dim_表名DWD層命名為dwd_表名DWS層命名為dws_表名 DWT層命名為dwt_表名ADS層命名為ads_表名臨時表命名為…

昇思25天訓練營Day11 - 基于 MindSpore 實現 BERT 對話情緒識別

模型簡介 BERT全稱是來自變換器的雙向編碼器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末開發并發布的一種新型語言模型。與BERT模型相似的預訓練語言模型例如問答、命名實體識別、自然語言推理、…

56、最近鄰向量量化(LVQ) 網絡訓練對輸入向量進行分類

1、LVQ 網絡訓練對輸入向量進行分類簡介 1)簡介 LVQ(最近鄰向量量化)是一種簡單而有效的神經網絡模型,用于對輸入向量進行分類。LVQ網絡通過學習一組原型向量(也稱為代碼矢量或參考向量),來表…

HTML5 WebSocket技術使用詳解

HTML5 WebSocket API 提供了一種在單個連接上進行全雙工通信的方式。這意味著客戶端和服務器可以同時發送和接收數據,而不需要像傳統的 HTTP 請求那樣進行多次請求和響應的輪詢。WebSocket 允許更實時的交互,非常適合需要快速、連續數據交換的應用場景&a…

SAP Build4-office 操作

1. 郵件操作 1.1 前期準備 商店中找到outlook的sdk,添加到build中 在process中添加outlook的SDK 電腦上裝了outlook的郵箱并且已經登錄 我用個人foxmail郵箱向outlook發了一封帶附件的銷售訂單郵件,就以此作為例子 1.2 搜索郵件 搜索有兩層&…

計算機視覺、目標檢測、視頻分析的過去和未來:目標檢測從入門到精通 ------ YOLOv8 到 多模態大模型處理視覺基礎任務

文章大綱 計算機視覺項目的關鍵步驟計算機視覺項目核心內容概述步驟1: 確定項目目標步驟2:數據收集和數據標注步驟3:數據增強和拆分數據集步驟4:模型訓練步驟5:模型評估和模型微調步驟6:模型測試步驟7:模型部署常見問題目標檢測入門什么是目標檢測目標檢測算法的分類一階…

CSS實現圖片裁剪居中(只截取剪裁圖片中間部分,圖片不變形)

1.第一種方式:(直接給圖片設置:object-fit:cover;) .imgbox{width: 100%;height:200px;overflow: hidden;position: relative;img{width: 100%;height: 100%; //圖片要設置高度display: block;position: absolute;left: 0;right…

OpenCV:解鎖計算機視覺的魔法鑰匙

OpenCV:解鎖計算機視覺的魔法鑰匙 在人工智能與圖像處理的世界里,OpenCV是一個響當當的名字。作為計算機視覺領域的瑞士軍刀,OpenCV以其豐富的功能庫、跨平臺的特性以及開源的便利性,成為了開發者手中不可或缺的工具。本文將深入…

基于Java+SpringMvc+Vue技術的在線學習交流平臺的設計與實現---60頁論文參考

博主介紹:碩士研究生,專注于Java技術領域開發與管理,以及畢業項目實戰? 從事基于java BS架構、CS架構、c/c 編程工作近16年,擁有近12年的管理工作經驗,擁有較豐富的技術架構思想、較扎實的技術功底和資深的項目管理經…

AI+若依框架(低代碼開發)

提前說明: 文章是實時更新,寫了就會更。 文章是黑馬視頻的筆記,如果要自己學可以點及下面的鏈接: https://www.bilibili.com/video/BV1pf421B71v/一、若依介紹 1.版本介紹 若依為滿足多樣化的開發需求,提供了多個版本…

基于jeecgboot-vue3的Flowable流程-集成仿釘釘流程(一)圖標svgicon的使用

因為這個項目license問題無法開源,更多技術支持與服務請加入我的知識星球。 1、lowflow這里使用了tsx的動態圖標,如下: import ./index.scss import type { CSSProperties, PropType } from vue import { computed, defineComponent, resolv…

MATLAB基礎應用精講-【數模應用】 嶺回歸(Ridge)(附MATLAB、python和R語言代碼實現)

目錄 前言 算法原理 數學模型 Ridge 回歸的估計量 Ridge 回歸與標準多元線性回歸的比較 3. Ridge 參數的選擇 算法步驟 SPSSPRO 1、作用 2、輸入輸出描述 3、案例示例 4、案例數據 5、案例操作 6、輸出結果分析 7、注意事項 8、模型理論 SPSSAU 嶺回歸分析案…

Java [ 進階 ] 深入理解 JVM

?探索Java基礎 深入理解 JVM? 深入理解 JVM:結構與垃圾回收機制 Java 虛擬機(JVM)是 Java 程序運行的核心,了解 JVM 的內部結構和垃圾回收機制對優化 Java 應用性能至關重要。本文將深入探討 JVM 的結構和垃圾回收機制&#…

支付寶沙箱對接(GO語言)

支付寶沙箱對接 1.1 官網1.2 秘鑰生成(系統默認)1.3 秘鑰生成(軟件生成)1.4 golan 安裝 SDK1.5 GoLand 代碼1.6 前端代碼 1.1 官網 沙箱官網: https://open.alipay.com/develop/sandbox/app 秘鑰用具下載: https://ope…

序列化、反序列化

java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。 將序列化對象寫入文件之后,可以從文件中讀取出來,并且對…

Java并發編程-ThreadLocal深入解讀及案例實戰

文章目錄 概述原理使用場景示例最佳實踐內存泄漏風險阿里開源組件TransmittableThreadLocal原理和機制使用場景如何使用注意事項ThreadLocal在分布式存儲系統edits_log案例中的實踐1. 為什么使用`ThreadLocal`?2. 實踐案例2.1 緩存日志操作2.2 線程局部的編輯日志狀態3. 注意事…

在 Spring 中編寫單元測試

單元測試是軟件開發過程中不可或缺的一部分,它能有效地提高代碼質量,確保代碼功能的正確性。在 Spring 應用中,JUnit 和 Mockito 是常用的單元測試工具,而 Spring Test 提供了豐富的測試支持。本文將介紹如何在 Spring 中使用 JUn…

并行處理百萬個文件的解析和追加

處理和解析大量文件,尤其是百萬級別的文件,是一個復雜且資源密集的任務。為實現高效并行處理,可以使用Python中的多種并行和并發編程工具,比如multiprocessing、concurrent.futures模塊以及分布式計算框架如Dask和Apache Spark。這…

物聯網時代5G通信技術分析研究一、引言

一、引言 近幾年,移動網絡技術跟隨互聯網的不斷發展而改革和進步,給平民大眾的生活也帶來新的嘗試與影響。從2G網絡的出現,到逐步被社會民眾所了解的3G,再到被熟知的且正在服務于大家的4G網絡,移動網絡技術的發展速度令…

jQuery Mobile 安裝指南

jQuery Mobile 安裝指南 jQuery Mobile 是一個基于 jQuery 的移動設備友好的網頁開發框架,它允許開發者創建響應式網頁和應用程序。本指南將詳細介紹如何安裝 jQuery Mobile,并確保您的開發環境準備好進行移動網頁開發。 1. 環境準備 在開始安裝 jQuery Mobile 之前,請確…