国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

redis和數(shù)據(jù)庫的一致性問題的解決方案

這篇具有很好參考價值的文章主要介紹了redis和數(shù)據(jù)庫的一致性問題的解決方案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

當(dāng)前沒有框架能夠保證redis的數(shù)據(jù)和數(shù)據(jù)庫的完全一致性,所以需要 我們自己在性能和一致性上作取舍。

使用到緩存的場景

	這里講到的是緩存和數(shù)據(jù)庫的一致性問題。
	當(dāng)查詢數(shù)據(jù)庫數(shù)據(jù)的時候,才涉及到緩存的利用上,所以緩存的引入是為了讓查詢數(shù)據(jù)的時候提高效率;
    而當(dāng)發(fā)生增、刪、改數(shù)據(jù)的時候,對于緩存來說是要讓數(shù)據(jù)庫和緩存發(fā)生一致性的改變,進(jìn)而能讓緩存在數(shù)據(jù)查詢時候能繼續(xù)起作用。

下圖就是兩種在redis緩存數(shù)據(jù)庫內(nèi)容時的使用。
redis和數(shù)據(jù)庫的一致性問題的解決方案
redis和數(shù)據(jù)庫的一致性問題的解決方案

對于緩存的一致性操作的選擇

明確了緩存的使命------在查詢數(shù)據(jù)庫信息時,提前將數(shù)據(jù)進(jìn)行緩存,既減少了數(shù)據(jù)庫io,也提高了查詢效率。

那么如一個節(jié)點(diǎn)的兩個圖:
緩存的生成,是在首次查詢或者緩存過期時間到或者緩存被其他業(yè)務(wù)刪除,進(jìn)而需要在數(shù)據(jù)庫查詢完畢之后,將數(shù)據(jù)庫內(nèi)容同步到緩存中。
那當(dāng)數(shù)據(jù)發(fā)生增刪改時,涉及到兩個方向的選擇
1、是刪除還是更新redis緩存
2、是先刪除\更新緩存,再操作數(shù)據(jù)庫;還是先操作數(shù)據(jù)庫,再刪除\更新緩存。
下面一一討論

(1)數(shù)據(jù)發(fā)生變化,刪除還是更新redis緩存

更新:數(shù)據(jù)發(fā)生增刪改,把緩存的內(nèi)容 重新用redis的set操作,賦予新值。
刪除:在查詢時,發(fā)現(xiàn)緩存已經(jīng)不存在,去數(shù)據(jù)庫查詢之后,同步到redis緩存。

1、如何選擇,可以使用排除方法,首先討論更新。
(1)、redis更新是放在數(shù)據(jù)庫操作的前。
線程1: redis更新 ---------------------------數(shù)據(jù)庫更新
線程2:redis更新-------------------------數(shù)據(jù)庫更新
(2)、redis更新是放在數(shù)據(jù)庫操作的后。
線程1: 數(shù)據(jù)庫更新 ---------------------------redis更新
線程2:數(shù)據(jù)庫更新-------------------------redis更新
可以看到這樣的場景,當(dāng)線程1和2完成之后,此時緩存和數(shù)據(jù)庫是不一致的。
2、寫多讀少:上面一直討論緩存的目的是給讀操作使用的,那么每修改一次就寫入一次緩存,無疑大大的做無用功。
3、如果緩存是需要計(jì)算加工的數(shù)據(jù):即查詢到數(shù)據(jù)庫值之后,緩存的值需要再做計(jì)算,那么每一次修改將很損耗性能。

總結(jié):綜合上面三點(diǎn),刪除要比更新的效率和避免數(shù)據(jù)不一致的效果更好。

(1)數(shù)據(jù)發(fā)生變化,先刪除還是先操作數(shù)據(jù)庫

1、 先更新數(shù)據(jù)庫,再刪除緩存
2、先刪除緩存,再更新數(shù)據(jù)庫
下面一一討論:
(1)先更新數(shù)據(jù)庫,再刪除緩存
①如果更新數(shù)據(jù)庫失敗,那么程序捕獲異常,之后不進(jìn)行刪除緩存操作。
②如果更新數(shù)據(jù)庫成功,但是刪除緩存失敗。
針對②可以采用異步操作的辦法,把刪除失敗的key給到隊(duì)列當(dāng)中,由線程池來執(zhí)行失敗重試。
或者可以利用canal 監(jiān)聽數(shù)據(jù)庫修改 進(jìn)而發(fā)生刪除的操作。

(2)先刪除緩存,再更新數(shù)據(jù)庫
這種方式可能存在以下三種異常情況

1、刪除緩存失敗,這時可以通過程序捕獲異常,直接返回結(jié)果,不再繼續(xù)更新數(shù)據(jù)庫,所以不會出現(xiàn)數(shù)據(jù)不一致的問題
2、刪除緩存成功,更新數(shù)據(jù)庫失敗。此時不會發(fā)生數(shù)據(jù)不一致現(xiàn)象。
3、下圖的場景,兩個線程執(zhí)行完成之后,會導(dǎo)致redis和數(shù)據(jù)庫的不一致。
redis和數(shù)據(jù)庫的一致性問題的解決方案
解決第三種情況可以使用 延時雙刪的策略,如下圖:
redis和數(shù)據(jù)庫的一致性問題的解決方案
這里討論一下延時雙刪如何解決第三種異常情況,
1、線程2在查詢數(shù)據(jù)庫舊值之后,更新緩存,此時數(shù)據(jù)不一致,所以需要再次刪除。
2、休眠時間,是為了在線程2寫入緩存之后,線程1才發(fā)生刪除緩存,不延時,可能導(dǎo)致線程2還沒寫入緩存,線程1就完成了刪除緩存,那么最終的結(jié)果 還是數(shù)據(jù)不一致。
3、無論如何線程2并利用的是舊數(shù)據(jù),這點(diǎn)沒辦法更改這點(diǎn)容錯率還是支持的,畢竟要是發(fā)生在刪除緩存前一秒還會利用緩存,此時數(shù)據(jù)還是最新數(shù)據(jù),而刪除緩存之后的一秒,才會到數(shù)據(jù)庫去查最新數(shù)據(jù),這個時間差的代價無論如何一定存在。
偽代碼:

public void update(String key, Object data) {
    // 首先刪除緩存
    redisCache.delKey(key);
    // 更新數(shù)據(jù)庫
    db.updateData(data);
    // 休眠一段時間,時間依據(jù)數(shù)據(jù)的讀取耗費(fèi)的時間而定
    Thread.sleep(500);
    // 再次刪除緩存
    redisCache.delKey(key);
 

總結(jié)

1、選擇刪除緩存 而不是更新
2、如果先修改數(shù)據(jù)庫,再刪除緩存,緩存刪除成功的機(jī)制可以用異步的失敗重試機(jī)制。
3、如果先刪除緩存,再修改數(shù)據(jù)庫,可以使用延時雙刪的機(jī)制。

文章摘錄至https://blog.csdn.net/chanmufeng/article/details/122933214文章來源地址http://www.zghlxwxcb.cn/news/detail-400976.html

到了這里,關(guān)于redis和數(shù)據(jù)庫的一致性問題的解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis---數(shù)據(jù)庫和緩存如何保證一致性?

    用「讀 + 寫」請求的并發(fā)的場景來分析: 假如某個用戶數(shù)據(jù)在緩存中不存在,請求 A 讀取數(shù)據(jù)時從數(shù)據(jù)庫中查詢到年齡為 20,在未寫入緩存中時另一個請求 B 更新數(shù)據(jù)。它更新數(shù)據(jù)庫中的年齡為 21,并且清空緩存。這時請求 A 把從數(shù)據(jù)庫中讀到的年齡為 20 的數(shù)據(jù)寫入到緩存

    2024年01月24日
    瀏覽(28)
  • 怎樣保證數(shù)據(jù)庫和redis里的數(shù)據(jù)一致性

    使用緩存更新策略:在更新數(shù)據(jù)庫時,同時更新Redis中相應(yīng)的數(shù)據(jù)。這可以通過編寫代碼來實(shí)現(xiàn),在數(shù)據(jù)庫更新操作完成后,同步更新Redis中對應(yīng)的數(shù)據(jù)。這可以通過在代碼中使用事務(wù)來保證更新的原子性,確保數(shù)據(jù)庫和Redis中的數(shù)據(jù)保持一致。 使用消息隊(duì)列:可以將數(shù)據(jù)庫更

    2024年02月19日
    瀏覽(27)
  • redis實(shí)戰(zhàn)-緩存數(shù)據(jù)&解決緩存與數(shù)據(jù)庫數(shù)據(jù)一致性

    redis實(shí)戰(zhàn)-緩存數(shù)據(jù)&解決緩存與數(shù)據(jù)庫數(shù)據(jù)一致性

    緩存( Cache),就是數(shù)據(jù)交換的 緩沖區(qū) ,俗稱的緩存就是 緩沖區(qū)內(nèi)的數(shù)據(jù) ,一般從數(shù)據(jù)庫中獲取,存儲于本地代碼。防止過高的數(shù)據(jù)訪問猛沖系統(tǒng),導(dǎo)致其操作線程無法及時處理信息而癱瘓,這在實(shí)際開發(fā)中對企業(yè)講,對產(chǎn)品口碑,用戶評價都是致命的;所以企業(yè)非常重視緩存技術(shù),

    2024年02月12日
    瀏覽(36)
  • mysql和redis如何保證數(shù)據(jù)庫一致性

    如果對于小公司的單機(jī)服務(wù)器來說在更新和刪除mysql數(shù)據(jù)的同時對redis緩存進(jìn)行更新或者刪除就行,一般有兩個選擇,例如: 先更新MySQL,后刪除(或更新)Redis 先刪除(或更新)Redis,后更新MySQL 但是不管使用其中哪種方式,都存在兩個可能的問題: 由于第一步與第二步并不是原

    2023年04月24日
    瀏覽(25)
  • Redis 原理緩存過期、一致性hash、雪崩、穿透、并發(fā)、布隆、緩存更新策略、緩存數(shù)據(jù)庫一致性

    Redis 原理緩存過期、一致性hash、雪崩、穿透、并發(fā)、布隆、緩存更新策略、緩存數(shù)據(jù)庫一致性

    redis的過期策略可以通過配置文件進(jìn)行配置 redis會把設(shè)置了過期時間的key放在單獨(dú)的字典中,定時遍歷來刪除到期的key。 1).每100ms從過期字典中 隨機(jī)挑選20個,把其中過期的key刪除; 2).如果過期的key占比超過1/4,重復(fù)步驟1 為了保證不會循環(huán)過度,導(dǎo)致卡頓,掃描時間上限

    2024年02月08日
    瀏覽(31)
  • 126、高頻Redis面試題:如何保證Redis和數(shù)據(jù)庫數(shù)據(jù)一致性

    126、高頻Redis面試題:如何保證Redis和數(shù)據(jù)庫數(shù)據(jù)一致性

    問題:如果數(shù)據(jù)庫中的某條數(shù)據(jù)放入緩存后,又馬上被更新了,那我們應(yīng)該如何更新緩存 缺點(diǎn): 如果先更新緩存成功,在更新數(shù)據(jù)庫的時候失敗,這時候會導(dǎo)致數(shù)據(jù)不一致;緩存的作用是不是臨時將我們數(shù)據(jù)保存在內(nèi)存,便于提高查詢速度;但是如果某條數(shù)據(jù)在數(shù)據(jù)庫中都

    2024年02月13日
    瀏覽(27)
  • Redis緩存MySQL數(shù)據(jù)庫存儲二者如何保證數(shù)據(jù)一致性

    在大型互聯(lián)網(wǎng)應(yīng)用中,由于數(shù)據(jù)庫讀寫頻繁、壓力大等原因,我們通常會使用緩存來減少數(shù)據(jù)庫的訪問次數(shù),提高系統(tǒng)的性能。而Redis作為一個高性能的內(nèi)存數(shù)據(jù)庫,成為了緩存的首選方案之一。但是,緩存和數(shù)據(jù)庫之間存在數(shù)據(jù)一致性的問題,如何解決這個問題呢?本文將

    2023年04月19日
    瀏覽(27)
  • redis面試題目-如何保證數(shù)據(jù)庫與緩存的數(shù)據(jù)一致性

    原視頻:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于緩存和數(shù)據(jù)庫是分開的,無法做到原子性的同時進(jìn)行數(shù)據(jù)修改,可能出現(xiàn)緩存更新失敗,或者數(shù)據(jù)庫更新失敗的情況,這時候會出現(xiàn)數(shù)據(jù)不一致,影響前端業(yè)務(wù) 先更新數(shù)據(jù)庫,再更新緩存。緩

    2024年02月05日
    瀏覽(27)
  • MySQL數(shù)據(jù)庫和Redis緩存一致性的更新策略
  • redis的緩存更新策略以及如何保證redis與數(shù)據(jù)庫的數(shù)據(jù)一致性

    redis的緩存更新策略有這么幾種: 1、由應(yīng)用直接和redis以及數(shù)據(jù)庫相連接: ?? ??? ?查詢數(shù)據(jù)時,應(yīng)用去redis中查詢,查不到的話再由應(yīng)用去數(shù)據(jù)庫中查詢,并將查詢結(jié)果放在redis; ?? ??? ?更新數(shù)據(jù)時,由應(yīng)用去觸發(fā)redis數(shù)據(jù)的刪除以及數(shù)據(jù)庫的update。 2、應(yīng)用只跟redi

    2024年02月13日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包