Redis知識(一)

目錄

Redis過期刪除和內存淘汰策略:

過期刪除策略:

內存淘汰策略(解決內存過大問題):

LRU和LFU以及他們在Redis里的實現

主從復制

哨兵模式

緩存

緩存雪崩

緩存擊穿

緩存穿透

數據庫和緩存一致性問題


Redis過期刪除和內存淘汰策略:

過期刪除策略:

當對一個key設置過期時間之后,Redis會將其加入到過期字典中,Redis里使用的是惰性刪除和定期刪除相結合的方式,惰性刪除是當查詢key的時候,先判斷是否在過期字典中存在,如果存在,則判斷過期時間和當前時間的大小,如果還未過期,返回查詢的結果,如果過期,就刪除。定期刪除每過一段時間在過期字典中隨機抽查一些key,判斷是否過期,如果過期的key占抽查的key25%以上,就會繼續抽查,直到小于25%。然后再過一段時間之后繼續抽查。

內存淘汰策略(解決內存過大問題):

當Redis的內存超過最大運行內存時,會觸發內存淘汰策略,第一種不進行數據淘汰策略,是Redis3.0版本之后的默認內存淘汰策略,當超過最大內存限制之后,不能再添加key,但是可以查詢。

兩大種:在設置了過期時間的數據中進行淘汰,1.隨機淘汰。2.優先淘汰更早的鍵值對。3.LRU淘汰算法(最近最少使用)。4.LFU淘汰算法(最近最不常用)。

在所有數據種進行淘汰,1.隨機淘汰。2.LRU。3.LFU

LRU和LFU以及他們在Redis里的實現

LRU算法是基于鏈表的結構,鏈表中的元素按照操作順序從后往前排列,最新的操作會被移動到鏈表頭部,淘汰時只需要刪除鏈表尾部的元素。

因為,傳統LRU算法需要涉及很多鏈表的移動操作,會耗時間,影響Redis緩存的性能,所以Redis用的是近似的LRU算法。是在Redis的對象結構體中添加一個額外字段,用于記錄此數據的最后一次訪問時間。當Redis進行內存淘汰時,會隨機采樣來淘汰數據,淘汰最久沒使用的那個。缺點 無法解決緩存污染問題,比如某一次讀取了大量的數據,一下就把內存占滿了,那之前的數據就會被清除掉,而這個數據如果只用一次,就會在Redis留存很長的時間,會造成緩存污染。

為了解決問題,Redis 4.0之后引入了LFU算法(最近最不常用),根據訪問次數來淘汰數據。Redis里用的是,在Redis的對象結構體中添加了數據的訪問頻次字段lru,lru 24bits,高16bit存儲ldt,記錄訪問時間戳,低8bit存儲 logc,記錄訪問頻次。然后根據這兩個值來判斷是否淘汰。

主從復制

為了解決單點故障的問題,Redis提供了主從復制模式,并且主從服務器采用的是讀寫分離方式,主服務器可以讀寫,當發生寫操作時自動把寫操作同步給從服務器,從服務器一般是只讀,并且接收主服務器同步過來的寫操作命令,然后執行命令。

第一次同步:

1.建立連接(replicaof 命令),確定主從。主服務器會返回FULLRSYNC響應命令,表示采用全量復制,把所有數據都同步給從服務器。

2.將主服務器同步數據給從服務器。主服務器生成RDB快照(異步操作,不會影響Redis處理命令)并發送給從服務器,從服務器清空所有數據然后載入RDB文件。但是同步期間發生的操作命令,主服務器會將命令寫入到 replication buffer 中,會通過第三步發送給從服務器

3.主服務器發送新寫操作給從服務器,將replication buffer中的寫操作命令發送給從服務器。

命令傳播:TCP連接,長連接。傳輸寫操作命令

分攤主服務器壓力:服務器B可以是服務器A的從服務器,也可以是服務器C的主服務器。這樣減少了主服務器生成RDB文件和傳輸文件的消耗。

增量復制:由于網絡問題,如果主從服務器間的網絡連接斷開,無法保持主從一致,Redis采用了增量復制的方式繼續同步,只會把網絡斷開期間主服務器收到的寫操作命令同步給從服務器。

首先從服務器會發送自己讀的位置,然后主服務器會在 環形緩沖區內查找位置,若找到,主服務器根據當前寫的位置和從服務器讀的位置,會將之間的增量寫入到replication buffer ,然后發送給從服務器。若未找到,主服務器會采用全量同步方式。

哨兵模式

主從架構中,當主節點掛了,那就沒有主節點來執行客戶端寫操作的請求,也不能給從節點進行數據同步了。哨兵機制能實現主從節點故障轉移(監控,選主,通知),會檢測主節點是否存活,如果發現掛了,就會選舉一個從節點切換為主節點,并且把主節點的相關信息通知給各從節點和客戶端。

監控:主觀下線,哨兵每隔一秒ping所有主從節點,如果有主從節點沒有在規定的時間響應哨兵的ping命令,哨兵就會標記為主觀下線,此時會通知所有的哨兵,其他哨兵根據自身和主節點的網絡狀況來投贊成或拒絕票。如果贊成票數到達要求后 quorum(建議為哨兵個數的二分之一加一),此時會被哨兵標記為客觀下線

選哨兵進行主從故障轉移:哨兵標記主節點客觀下線后,該哨兵就會發起投票,其他哨兵投贊成或拒絕票。拿到半數以上贊成并且大于等于配置文件中quorum值,才能做leader。

選主:第一步:在已下線主節點(舊主節點)屬下的所有「從節點」里面,挑選出一個從節點,并將其轉換為主節點,選擇的規則:

  • 過濾掉已經離線的從節點;
  • 過濾掉歷史網絡連接狀態不好的從節點;
  • 將剩下的從節點,進行三輪考察:優先級、復制進度、ID 號。在每一輪考察過程中,如果找到了一個勝出的從節點,就將其作為新主節點。

通知:讓已下線主節點屬下的所有「從節點」修改復制目標,修改為復制「新主節點」;

將新主節點的 IP 地址和信息,通過「發布者/訂閱者機制」通知給客戶端;

繼續監視舊主節點,當這個舊主節點重新上線時,將它設置為新主節點的從節點;

緩存

用戶請求時,利用Redis做MySQL的緩存層,Redis是內存數據庫,相當于數據緩存在內存中。雖然速度比磁盤提升幾個等級,但引入緩存層后,會出現緩存穿透、擊穿、雪崩問題。

緩存雪崩

大量緩存數據在同一時間過期,或者Redis故障宕機,此時如果有大量的用戶請求,都無法在Redis中處理,于是全部請求都直接訪問數據庫,導致數據庫宕機,造成系統崩潰。

解決辦法:

針對大量緩存數據在同一時間過期:

1.隨機設置過期時間,保證數據不會在同一個時間過期。

2.添加互斥鎖,如果發現訪問的數據不在Redis里,就加一個互斥鎖(設置過期時間。防止出現意外不釋放鎖,其他請求拿不到鎖),保證同一時間內只有一個請求來構建緩 存,當緩存構建完成后,再釋放。

Redis故障宕機

1.通過主從節點的方式構建Redis集群。當主節點宕機,可以通過哨兵選主,避免了宕機帶來的問題。

2.啟動服務熔斷(限流。只能少部分請求)機制,暫停業務應用對緩存服務的訪問,直接返回錯誤,不用再繼續訪問數據庫,降低了對數據庫訪問的壓力,等Redis恢復正常后,再允許業務訪問。

緩存擊穿

熱點數據過期了,但是大量請求訪問這個熱點數據。緩存中沒了,就要去數據庫查詢。數據庫很容易發生崩潰。

解決方法:

1.添加互斥鎖

2.不給熱點數據添加過期時間。或者在熱點數據將要過期前,提前通知后臺更新緩存以及重新設置過期時間。

緩存穿透

請求到來時,訪問緩存沒有數據,訪問數據庫也沒有數據,無法構建緩存數據。大量的請求,導致數據庫壓力激增。

解決方法:

1.非法請求的限制。

2.發現緩存穿透現象時,可以針對查詢的數據,在緩存中設置一個空值或默認值。

3.布隆過濾器。在寫入數據時,先在布隆過濾器中做標記。等請求來時,判斷是否標記過。

數據庫和緩存一致性問題

并發情況下,先更新數據庫,再刪除緩存可以解決數據庫和緩存一致性問題。但是如果第二步操作沒有成功執行,那末還是沒作用。

解決辦法:

1.給緩存設置較短的過期時間,勉強可以解決一些問題。

2.利用消息隊列,將第二個操作加入到消息隊列。如果刪除緩存失敗,那就可以從消息隊列中重新讀取數據,然后再次刪除緩存。這個就是重試機制。

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

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

相關文章

windows下redis服務啟動及.bat文件中中redis服務的啟動

windows windows下redis服務的啟動 1、不配置環境變量 找到redis服務的安裝目錄進入命令行窗口并輸入命令redis-server.exe redis.windows.conf2、配置環境變量 將redis安裝目錄配置在path環境變量中之后就可以在cmd窗口的任意位置輸入redis-server命令就可以啟動redis服務…

材料行業可以轉IC設計后端嗎?

近來有許多材料行業的小伙伴通過后臺來問我對于職業規劃的看法,甚至有些小伙伴直接點明了某個行業適不適合自己,那么我這邊僅以近年來比較熱門的數字芯片設計來展開講講,材料適不適合轉行做IC呢。 對于理工科的同學而言,選擇哪個…

Graal 編譯器

一開始,我們來講一個故事。假設有一個名為 John 的開發人員,他正在嘗試編寫一些高性能的 Java 代碼。他遇到了一些性能和速度問題,因為他的應用需要經常從大量的數據源中獲取數據,并進行計算。他嘗試了許多優化工具和技術,但是仍然無法滿足他的需求。在這個時候,他聽說了…

公告:微信小程序備案期限官方要求

備案期限要求 1、若微信小程序未上架,自2023年9月1日起,微信小程序須完成備案后才可上架,備案時間1-20日不等; 2、若微信小程序已上架,請于2024年3月31日前完成備案,逾期未完成備案,平臺將按照…

Android Studio實現列表展示圖片

效果: MainActivity 類 package com.example.tabulation;import android.content.Intent; import android.os.Bundle; import android.view.View;import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; im…

解決 Maven 創建 Spring Boot 項目時出現 “Cannot access alimaven“ 錯誤的方法

系列文章目錄 文章目錄 系列文章目錄前言一、確認 Maven 配置二、創建 Spring Boot 項目三、修改項目的 Maven 配置四、清除 Maven 本地倉庫五、重新構建項目總結前言 Maven 是 Java 項目的構建工具,而 Spring Boot 則是用于快速構建 Spring 應用程序的框架。但有時,在創建 …

Redis擴容與一致性Hash算法解析

推薦閱讀 AI文本 OCR識別最佳實踐 AI Gamma一鍵生成PPT工具直達鏈接 玩轉cloud Studio 在線編碼神器 玩轉 GPU AI繪畫、AI講話、翻譯,GPU點亮AI想象空間 資源分享 「java、python面試題」來自UC網盤app分享,打開手機app,額外獲得1T空間 https://dr…

Java導出數據到Excel

系列文章目錄 文章目錄 系列文章目錄前言一、為什么需要導出數據到Excel?二、使用Java導出數據到Excel的步驟1.添加依賴2.編寫導出邏輯3.運行測試總結前言 當今數據處理的場景中,Excel仍然是一個不可或缺的工具,用于存儲、分析和共享數據。在Java應用程序中,有時候需要將數…

神經網絡基礎-神經網絡補充概念-04-梯度下降法

概念 梯度下降法是一種常用的優化算法,用于在機器學習和深度學習中更新模型參數以最小化損失函數。它通過迭代地調整參數,沿著損失函數的負梯度方向移動,從而逐步逼近損失函數的最小值。 基本思想 梯度下降法的基本思想是:在每…

JVM——引言+JVM內存結構

引言 什么是JVM 定義: Java VirtualMachine -java 程序的運行環境 (ava 二進制字節碼的運行環境) 好處: 一次編寫,到處運行自動內存管理,垃圾回收功能數組下標越界檢查,多態 比較: jvm jre jdk 學習jvm的作用 面試理解底層實現原理中…

神經網絡基礎-神經網絡補充概念-63-殘差網絡

概念 殘差網絡(Residual Network,ResNet)是一種深度卷積神經網絡結構,旨在解決深層網絡訓練中的梯度消失和梯度爆炸問題,以及幫助訓練非常深的網絡。ResNet 在2015年被提出,其核心思想是引入了"殘差塊…

前端-ES6

let 和 const 為了解決var的作用域的問題,而且var 有變量提升,會出現全局污染的問題 let 塊狀作用域,并且不能重復聲明const 一般用于聲明常量,一旦被聲明無法修改,但是const 可以聲明一個對象,對象內部的…

工作時使用redis,kafka查閱的資料鏈接

不分先后 一 、redis查閱地址 一篇文章講清楚RedisRedis原理介紹一篇詳文帶你入門 Redis內存耗盡后Redis會發生什么Redis 深入了解鍵的過期時間redis持久化機制Redis延遲問題全面排障指南一文搞定Redis高級特性與性能調優Redis 在 Linux 系統的配置優化Redis 的延遲問題&…

SpringBoot-lombok

為什么要使用lombok? Lombok是一個通過注解以達到減少代碼的Java庫,如通過注解的方式減少getter,setter方法,構造方法等。通過注解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,并可以自動化生成日志變量,簡化java開發、提高…

NLP文本匹配任務Text Matching [有監督訓練]:PointWise(單塔)、DSSM(雙塔)、Sentence BERT(雙塔)項目實踐

NLP文本匹配任務Text Matching [有監督訓練]:PointWise(單塔)、DSSM(雙塔)、Sentence BERT(雙塔)項目實踐 0 背景介紹以及相關概念 本項目對3種常用的文本匹配的方法進行實現:Poin…

pyqt5 如何修改QplainTextEdit 背景色和主窗口的一樣顏色

如果您希望將 QPlainTextEdit 的背景顏色設置為與窗口背景相似的灰色,您可以使用窗口的背景顏色作為基準來設置 QPlainTextEdit 的背景顏色。以下是一個示例代碼,展示如何實現這一點: from PyQt5.QtWidgets import QApplication, QMainWindo…

模型預測筆記(一):數據清洗分析及可視化、模型搭建、模型訓練和預測代碼一體化和對應結果展示(可作為baseline)

模型預測 一、導入關鍵包二、如何載入、分析和保存文件三、修改缺失值3.1 眾數3.2 平均值3.3 中位數3.4 0填充 四、修改異常值4.1 刪除4.2 替換 五、數據繪圖分析5.1 餅狀圖5.1.1 繪制某一特征的數值情況(二分類) 5.2 柱狀圖5.2.1 單特征與目標特征之間的…

Mysql性能優化:什么是索引下推?

導讀 索引下推(index condition pushdown )簡稱ICP,在Mysql5.6的版本上推出,用于優化查詢。 在不使用ICP的情況下,在使用非主鍵索引(又叫普通索引或者二級索引)進行查詢時,存儲引擎…

容斥原理 博弈論(多種Nim游戲解法)

目錄 容斥原理容斥原理的簡介能被整除的數(典型例題)實現思路代碼實現擴展:用DPS實現 博弈論博弈論中的相關性質博弈論的相關結論先手必敗必勝的證明Nim游戲(典型例題)代碼實現 臺階-Nim游戲(典型例題&…

什么叫做云計算

什么叫做云計算 相信大多數人對云計算或者是云服務的認識還停留在僅僅聽過這個名詞,但是對其真正的定義或者意義還不甚了解的層面。甚至有些技術人員,如果日常的業務不涉及到云服務,可能對其也只是一知半解的程度。首先云計算準確的講只是云服…