最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis與緩存解讀

 更新時間:2025年01月10日 10:54:18   作者:knight-n  
文章介紹了Redis作為緩存層的優(yōu)勢和缺點,并分析了六種緩存更新策略,包括超時剔除、先刪緩存再更新數(shù)據(jù)庫、旁路緩存、先更新數(shù)據(jù)庫再刪緩存、先更新數(shù)據(jù)庫再更新緩存、讀寫穿透和異步緩存寫入模式,還討論了緩存常見問題

緩存

在業(yè)務(wù)開發(fā)中,必然會存在需要頻繁訪問的數(shù)據(jù)即熱點數(shù)據(jù),如果通過訪問數(shù)據(jù)庫訪問這些數(shù)據(jù),由于數(shù)據(jù)存儲在磁盤上,在頻繁訪問下會進行頻繁的IO操作,會導(dǎo)致數(shù)據(jù)庫壓力過大,響應(yīng)速度變慢。

那么我們可以在添加一層中間緩存層,將熱點數(shù)據(jù)緩存在內(nèi)存中,在訪問數(shù)據(jù)時我們不在直接查詢數(shù)據(jù)庫,而是先訪問緩存,如果數(shù)據(jù)存在(命中),直接返回即可。如果數(shù)據(jù)不存在(未命中),再訪問數(shù)據(jù)庫。

redis 將數(shù)據(jù)存儲在內(nèi)存中,因此可以提供接近于內(nèi)存的訪問速度。所以 redis 天然適合作為緩存層。

緩存并不是萬能的,實際上緩存更使用于讀密集場景,在寫密集場景中由于需要保證緩存于數(shù)據(jù)庫的一致性,在修改緩存時還需要修改數(shù)據(jù)庫,反而加重了后端壓力。

緩存優(yōu)缺點

優(yōu)點:

  • 降低后端負載
  • 提高讀寫效率,降低響應(yīng)時間

缺點:

  • 增加數(shù)據(jù)一致性成本
  • 增加代碼維護成本

緩存更新策略

為了保證緩存數(shù)據(jù)有效,我們需要更新緩存。這里主要有六種緩存更新策略:

超時剔除

在 redis 中我們可以設(shè)置數(shù)據(jù)的生存時間(TTL),在超時后,redis會自動刪除緩存,在下次查詢該數(shù)據(jù)時,由于緩存不存在,會重新寫入緩存,完成更新。

這種方法實現(xiàn)簡單,但一致性一般,在緩存未過期之前,對數(shù)據(jù)庫的數(shù)據(jù)進行增刪查改都不會影響緩存,用戶查到的數(shù)據(jù)始終是舊數(shù)據(jù)。

先刪緩存再更新數(shù)據(jù)庫

在對數(shù)據(jù)庫進行更新時,先刪除緩存,然后更新數(shù)據(jù),在下次查詢該數(shù)據(jù)時,由于緩存不存在,會重新將新數(shù)據(jù)寫入緩存,完成更新。

這種方法也無法保證數(shù)據(jù)的一致性。假設(shè)有兩個線程,線程A 與 線程B , 在線程 A 更新緩存時,線程 B 發(fā)起查詢,可能出現(xiàn)這種情況:

在這種情況下,一直到下次數(shù)據(jù)更新之前,緩存始終不一致,因此不推薦使用這種方法。

旁路緩存(先更新數(shù)據(jù)庫,再刪緩存)

在更新數(shù)據(jù)時,先更新數(shù)據(jù)庫,再刪除緩存,在下次查詢該數(shù)據(jù)時,由于緩存不存在,會重新將新數(shù)據(jù)寫入緩存,完成更新。

這種方法同樣無法完全保證數(shù)據(jù)的一致性,但他是最常用的更新策略。因為它發(fā)生問題的概況較小,假設(shè)有兩個線程,線程A 與 線程B , 在線程 B 更新數(shù)據(jù)庫時,線程 A 發(fā)起查詢,可能出現(xiàn)這種情況:

同樣這種情況會出現(xiàn)數(shù)據(jù)不一致問題,但這種情況出現(xiàn)概率非常小,出現(xiàn)這種情況需要至少滿足四個條件:

  • 讀操作所讀數(shù)據(jù)緩存失效
  • 有個并發(fā)的寫操作
  • 寫操作比讀操作更快
  • 讀操作早于寫操作進入數(shù)據(jù)庫,晚于寫操作更新緩存

這樣的條件是十分苛刻的,即使發(fā)生也是小概率事件,即使出現(xiàn)也可以通過緩存生存時間兜底。

這種方法最大的問題是刪除緩存后的并發(fā)問題即緩存擊穿問題,在緩存常見問題我們會介紹。

先更新數(shù)據(jù)庫,再更新緩存

在更新數(shù)據(jù)時,先更新數(shù)據(jù)庫,再更新緩存。

理論上這種方式比先更新數(shù)據(jù)庫再刪緩存有著更高的讀性能,因為它事先準備好數(shù)據(jù)。但由于要更新數(shù)據(jù)庫和緩存兩塊數(shù)據(jù),所以它的寫性能就比較低,同時他也不能完全保證數(shù)據(jù)的一致性。

假設(shè)有兩個線程,線程A 與 線程B , 在線程 A B 同時更新,可能出現(xiàn)這種情況:

讀寫穿透

客戶端只與緩存交互,緩存負責與數(shù)據(jù)庫的交互。

讀操作先查詢緩存,如果緩存未命中,則緩存從數(shù)據(jù)庫加載數(shù)據(jù)并寫入緩存。寫操作是直接寫緩存,然后緩存同步更新數(shù)據(jù)庫。這種模式下,緩存和數(shù)據(jù)庫的一致性由緩存中間件維護。

異步緩存寫入模式

客戶端只與緩存交互,緩存異步地將數(shù)據(jù)更新到數(shù)據(jù)庫,實現(xiàn)最終一致性。

這種模式適用于寫操作頻繁的場景,但可能會導(dǎo)致數(shù)據(jù)一致性問題。

緩存常見問題

使用緩存比較常見的問題有下面三種問題:緩存擊穿,緩存雪崩,緩存穿透。

緩存穿透

在我們的業(yè)務(wù)邏輯中,如果客戶端訪問的數(shù)據(jù)不存在于緩存我們會訪問數(shù)據(jù)庫,如果數(shù)據(jù)庫存在數(shù)據(jù)就寫入緩存,如果不存在就返回,那么如果客戶端不懷好意,頻繁發(fā)起對不存在數(shù)據(jù)的請求會發(fā)生什么呢?大量請求會直接打入數(shù)據(jù)庫,增大后端壓力,實現(xiàn)對服務(wù)器的攻擊。

解決方案有很多種,最常見的有兩種方法:緩存空對象,布隆過濾器。

緩存空對象:當請求的數(shù)據(jù)在數(shù)據(jù)庫中不存在時,我們將這個“不存在”的結(jié)果緩存起來,設(shè)置一個較短的過期時間。 這樣,相同的請求在緩存失效之前會直接命中緩存,減輕數(shù)據(jù)庫的壓力。

布隆過濾器:使用布隆過濾器存儲所有可能查詢的鍵,當請求到達時,先通過布隆過濾器判斷鍵是否存在。如果布隆過濾器認為鍵不存在,則直接返回,不進行數(shù)據(jù)庫查詢和緩存操作。

緩存雪崩

緩存雪崩是指在高并發(fā)系統(tǒng)中,大量的緩存數(shù)據(jù)在同一時間過期或被清除,導(dǎo)致大量請求同時涌向數(shù)據(jù)庫,從而對數(shù)據(jù)庫造成巨大壓力,甚至可能導(dǎo)致數(shù)據(jù)庫宕機。類似于“雪崩”。

常見的解決方法有以下幾種:

設(shè)置不同的過期時間: 對于緩存中的每個數(shù)據(jù)項,設(shè)置不同的過期時間,這樣可以避免大量數(shù)據(jù)同時過期。例如,可以為每個數(shù)據(jù)項的過期時間加上一個隨機值。

使用互斥鎖: 當緩存數(shù)據(jù)過期時,如果多個請求同時到達,使用互斥鎖確保只有一個請求去查詢數(shù)據(jù)庫并更新緩存,其他請求等待或重試。

熱點數(shù)據(jù)永不過期: 對于訪問非常頻繁的熱點數(shù)據(jù),可以考慮設(shè)置為永不過期,或者設(shè)置一個非常長的過期時間。

緩存擊穿

在高并發(fā)的訪問下,當某個熱點數(shù)據(jù)緩存處于過期失效的時間點時,極有可能出現(xiàn)多個線程同時查詢該緩存。而查詢數(shù)據(jù)庫更新緩存又需要消耗一定時間,在同一時間會有大量并發(fā)請求直接訪問數(shù)據(jù)庫而導(dǎo)致數(shù)據(jù)庫服務(wù)器的CPU或者內(nèi)存負載過高,服務(wù)能力下降甚至宕機。

那么如何解決這個問題呢?有三種解決方案。

  • 加鎖:在緩存失效后,通過加鎖的方式只允許一個線程查詢數(shù)據(jù)和寫緩存,其他線程阻塞等待。這個方法會造成部分請求等待。
  • 二級緩存:A1為原始緩存,A2為拷貝緩存。A1失效時,可以訪問A2,其中A1的緩存失效時間設(shè)置為短期(比如5min),A2的緩存失效時間設(shè)置為長期(比如1天)。如果緩存value很大,此方案的緩存空間利用率低。
  • 雙key:思路和方案2類似,不同的是雙key分別緩存過期時間(key-time)和緩存數(shù)據(jù)(key-data),其中(key-time)的緩存失效時間設(shè)置為短期(比如5min),(key-data)的緩存失效時間設(shè)置為長期(比如1天)。當?shù)谝粋€線程發(fā)現(xiàn) key-time 過期不存在時,則先更新key-time,然后去查詢數(shù)據(jù)庫并更新key-data 的值;當其他線程來獲取數(shù)據(jù)時,雖然第一個線程還沒有從數(shù)據(jù)庫查詢完畢并更新緩存,但發(fā)現(xiàn)key-time存在,會直接讀取緩存的舊數(shù)據(jù)返回。和二級緩存的方案對比,該方案的緩存空間利用率高。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis中的連接命令與鍵命令操作詳解

    Redis中的連接命令與鍵命令操作詳解

    Redis連接命令主要是用于客戶端與服務(wù)器建立連接的,Redis是一種流行的內(nèi)存數(shù)據(jù)庫,支持多種數(shù)據(jù)結(jié)構(gòu),其中鍵命令是核心操作之一,在Redis中,鍵(Key)是用來存儲數(shù)據(jù)的主要元素,每個鍵都有一個唯一的名稱,本文給大家介紹了Redis中的連接命令與鍵命令操作
    2024-09-09
  • Redis分布式鎖實例分析講解

    Redis分布式鎖實例分析講解

    分布式鎖是控制分布式系統(tǒng)不同進程共同訪問共享資源的一種鎖的實現(xiàn)。如果不同的系統(tǒng)或同一個系統(tǒng)的不同主機之間共享了某個臨界資源,往往需要互斥來防止彼此干擾,以保證一致性
    2022-12-12
  • Redis與數(shù)據(jù)庫數(shù)據(jù)一致性的原因及解決方案

    Redis與數(shù)據(jù)庫數(shù)據(jù)一致性的原因及解決方案

    Redis作為一種高效的鍵值對存儲系統(tǒng),常用于緩存數(shù)據(jù)庫減少IO操作,下面這篇文章主要介紹了Redis與數(shù)據(jù)庫數(shù)據(jù)一致性的原因及解決方案,文中介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Redis 使用跳表實現(xiàn)有序集合的方法

    Redis 使用跳表實現(xiàn)有序集合的方法

    Redis有序集合底層為什么使用跳表而非其他數(shù)據(jù)結(jié)構(gòu)如平衡樹、紅黑樹或B+樹的原因在于其特殊的設(shè)計和應(yīng)用場景,跳表提供了與平衡樹類似的效率,同時實現(xiàn)更簡單,調(diào)試和修改也更加容易,感興趣的朋友一起看看吧
    2024-09-09
  • 關(guān)于Redis數(shù)據(jù)持久化的概念介紹

    關(guān)于Redis數(shù)據(jù)持久化的概念介紹

    Redis是內(nèi)存數(shù)據(jù)庫,數(shù)據(jù)都是存儲在內(nèi)存中,需要定期將Redis中的數(shù)據(jù)以某種形式(或命數(shù)據(jù)令)從內(nèi)存保存到硬盤,今天給大家分享Redis數(shù)據(jù)的持久化的概念介紹,需要的朋友參考下吧
    2021-08-08
  • Redis緩存三大異常的處理方案梳理總結(jié)

    Redis緩存三大異常的處理方案梳理總結(jié)

    這篇文章主要介紹了Redis緩存三大異常的處理方案梳理總結(jié),緩存方式,在提高數(shù)據(jù)查詢效率、保護數(shù)據(jù)庫等方面起到了不可磨滅的作用,但實際應(yīng)用中,可能會出現(xiàn)一些Redis緩存異常的情況,下文對其方案總結(jié)需要的朋友可以參考一下
    2022-06-06
  • Redis實現(xiàn)和數(shù)據(jù)庫的數(shù)據(jù)同步

    Redis實現(xiàn)和數(shù)據(jù)庫的數(shù)據(jù)同步

    本文介紹了Redis與傳統(tǒng)數(shù)據(jù)庫數(shù)據(jù)同步的幾種常見方法,包括CacheAside、WriteThrough、WriteBehind,以及如何通過分布式事務(wù)、樂觀鎖、數(shù)據(jù)過期策略和消息隊列來解決數(shù)據(jù)一致性問題,每種方法都有其適用場景和優(yōu)缺點,需要根據(jù)具體需求進行選擇
    2025-01-01
  • 關(guān)于Redis持久化的深入探究

    關(guān)于Redis持久化的深入探究

    Redis持久化是將內(nèi)存中的數(shù)據(jù)保存到磁盤,以防止數(shù)據(jù)丟失。Redis提供了兩種持久化方式:RDB和AOF,本文將給大家詳解介紹Redis持久化,感興趣的同學(xué)可以跟著小編一起來學(xué)習(xí)
    2023-05-05
  • Redis 出現(xiàn)錯誤1067的解決辦法

    Redis 出現(xiàn)錯誤1067的解決辦法

    這篇文章主要介紹了Redis 出現(xiàn)錯誤1067的解決辦法的相關(guān)資料,Redis 錯誤1067:進程意外終止,Redis不能啟動,Redis啟動不了,需要的朋友可以參考下
    2017-07-07
  • Linux 下redis5.0.0安裝教程詳解

    Linux 下redis5.0.0安裝教程詳解

    這篇文章主要介紹了Linux 下redis5.0.0安裝教程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10

最新評論

禄劝| 潼关县| 桂林市| 兴仁县| 新郑市| 建瓯市| 吴旗县| 陆河县| 巴彦淖尔市| 色达县| 万安县| 喀喇| 龙岩市| 红原县| 清苑县| 德安县| 陆川县| 葵青区| 前郭尔| 呈贡县| 安康市| 顺义区| 石景山区| 阿尔山市| 军事| 台中县| 保定市| 海南省| 靖州| 南川市| 福安市| 黔西| 芦山县| 远安县| 高碑店市| 那曲县| 南昌市| 福海县| 乌拉特前旗| 奎屯市| 天长市|