redis數(shù)據(jù)一致性之延時(shí)雙刪策略詳解
在使用redis時(shí),需要保持redis和數(shù)據(jù)庫數(shù)據(jù)的一致性,最流行的解決方案之一就是延時(shí)雙刪策略,今天我們就來詳細(xì)刨析一下
注意:要知道經(jīng)常修改的數(shù)據(jù)表不適合使用redis,因?yàn)殡p刪策略執(zhí)行的結(jié)果是把redis中保存的那條數(shù)據(jù)刪除了,以后的查詢就都會(huì)去查詢數(shù)據(jù)庫。所以redis使用的是讀遠(yuǎn)遠(yuǎn)大于改的數(shù)據(jù)緩存。
1,首先要理解在并發(fā)環(huán)境下redis數(shù)據(jù)一致性的問題所在
在多線程并發(fā)情況下,假設(shè)有兩個(gè)數(shù)據(jù)庫修改請(qǐng)求,為保證數(shù)據(jù)庫與redis的數(shù)據(jù)一致性, 修改請(qǐng)求的實(shí)現(xiàn)中需要修改數(shù)據(jù)庫后,級(jí)聯(lián)修改redis中的數(shù)據(jù)。 請(qǐng)求一:1.1修改數(shù)據(jù)庫數(shù)據(jù) 1.2 修改redis數(shù)據(jù) 請(qǐng)求二:2.1修改數(shù)據(jù)庫數(shù)據(jù) 2.2 修改redis數(shù)據(jù) 并發(fā)情況下就會(huì)存在1.1 ---> 2.1 ---> 2.2 ---> 1.2的情況 (一定要理解線程并發(fā)執(zhí)行多組原子操作執(zhí)行順序是可能存在交叉現(xiàn)象的) 此時(shí)存在的問題就是: 1.1修改數(shù)據(jù)庫的數(shù)據(jù)最終保存到了redis中,2.1在1.1之后也修改了數(shù)據(jù)庫數(shù)據(jù)。 此時(shí)出現(xiàn)了redis中數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)不一致的情況,在后面的查詢過程中就會(huì)長(zhǎng)時(shí)間去先查redis, 從而出現(xiàn)查詢到的數(shù)據(jù)并不是數(shù)據(jù)庫中的真實(shí)數(shù)據(jù)的嚴(yán)重問題。 問題解決: 修改數(shù)據(jù)庫級(jí)聯(lián)修改redis數(shù)據(jù)改為 修改數(shù)據(jù)庫數(shù)據(jù)后級(jí)聯(lián)刪除redis數(shù)據(jù) 至于是先執(zhí)行1.2的redis刪除,還是限制性2.2的redis刪除,無關(guān)緊要。 結(jié)果都是redis中數(shù)據(jù)已被刪除。之后的查詢就會(huì)由于redis中沒有數(shù)據(jù)而去查數(shù)據(jù)庫, 此時(shí)即不會(huì)存在查詢到的數(shù)據(jù)和數(shù)據(jù)庫的數(shù)據(jù)不一致的情況。
2,上面詳解了redis數(shù)據(jù)一致性的問題所在,并提供了單刪策略來解決問題但此時(shí)依然存在比較嚴(yán)重的問題。
上面的單刪策略情況如下: 修改請(qǐng)求的實(shí)現(xiàn)中需要修改數(shù)據(jù)庫后,級(jí)聯(lián)刪除redis中的數(shù)據(jù)。 請(qǐng)求一:1.1修改數(shù)據(jù)庫數(shù)據(jù) 1.2 刪除redis數(shù)據(jù) 請(qǐng)求二:2.1修改數(shù)據(jù)庫數(shù)據(jù) 2.2 刪除redis數(shù)據(jù) 假設(shè)現(xiàn)在并發(fā)存在一個(gè)查詢請(qǐng)求 請(qǐng)求三:3.1查詢r(jià)edis中數(shù)據(jù) 3.2查詢數(shù)據(jù)庫數(shù)據(jù) 3.3 新查到的數(shù)據(jù)寫入redis (一定要理解帶redis的查詢請(qǐng)求實(shí)現(xiàn)邏輯,先查redis,數(shù)據(jù)不存在查數(shù)據(jù)庫, 查到的數(shù)據(jù)寫入redis以便以后的查詢不去直接查數(shù)據(jù)庫) 此時(shí)并發(fā)情況下就會(huì)存在1.1 ---> 1.2 ---> 3.1 ---> 3.2 ---> 2.1 ---> 2.2 ---> 3.3的情況 此時(shí)存在的問題就是: 此時(shí)數(shù)據(jù)庫中的數(shù)據(jù)保存的是2.1修改后的數(shù)據(jù),而redis中保存的數(shù)據(jù)是3.2中在1.1修改數(shù)據(jù)后的結(jié)果, 此時(shí)出現(xiàn)了redis中數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)不一致的情況,在后面的查詢過程中就會(huì)長(zhǎng)時(shí)間去先查redis, 從而出現(xiàn)查詢到的數(shù)據(jù)并不是數(shù)據(jù)庫中的真實(shí)數(shù)據(jù)的嚴(yán)重問題。
3,上面刨析到了單刪策略來解決redis數(shù)據(jù)一致性存在的問題,下面我們來說雙刪策略
上面的單刪策略存在問題的情況如下: 請(qǐng)求一:1.1修改數(shù)據(jù)庫數(shù)據(jù) 1.2 刪除redis數(shù)據(jù) 請(qǐng)求二:2.1修改數(shù)據(jù)庫數(shù)據(jù) 2.2 刪除redis數(shù)據(jù) 請(qǐng)求三:3.1查詢r(jià)edis中數(shù)據(jù) 3.2查詢數(shù)據(jù)庫數(shù)據(jù) 3.3 新查到的數(shù)據(jù)寫入redis 添加延時(shí)雙刪策略后的情況 請(qǐng)求一:1.1修改數(shù)據(jù)庫數(shù)據(jù) 1.2 刪除redis數(shù)據(jù) 1.3 延時(shí)3--5s再去刪除redis中數(shù)據(jù) 請(qǐng)求二:2.1修改數(shù)據(jù)庫數(shù)據(jù) 2.2 刪除redis數(shù)據(jù) 2.3 延時(shí)3--5s再去刪除redis中數(shù)據(jù) 請(qǐng)求三:3.1查詢r(jià)edis中數(shù)據(jù) 3.2 查詢數(shù)據(jù)庫數(shù)據(jù) 3.3 新查到的數(shù)據(jù)寫入redis 雙刪策略為什么能解決問題: 因?yàn)榇嬖诹搜訒r(shí)時(shí)間,故1.3或2.3 一定是最后執(zhí)行的一步操作(并發(fā)中的延時(shí)一定要理解) 延時(shí)的根本目的就是為了讓程序先把3.3執(zhí)行完,再去刪除redis
4,如何實(shí)現(xiàn)延時(shí)3–5s的操作
比較好的: 項(xiàng)目整合quartz等定時(shí)任務(wù)框架,去實(shí)現(xiàn)延時(shí)3--5s再去執(zhí)行最后一步任務(wù) 比較一般的: 創(chuàng)建線程池,線程池中拿一個(gè)線程,線程體中延時(shí)3-5s再去執(zhí)行最后一步任務(wù)(不能忘了啟動(dòng)線程) 比較差的: 單獨(dú)創(chuàng)建一個(gè)線程去實(shí)現(xiàn)延時(shí)執(zhí)行
到此這篇關(guān)于redis數(shù)據(jù)一致性之延時(shí)雙刪詳解的文章就介紹到這了,更多相關(guān)redis延時(shí)雙刪內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Redis無序集合如何實(shí)現(xiàn)禁止多端登錄功能
這篇文章主要給你大家介紹了關(guān)于基于Redis無序集合如何實(shí)現(xiàn)禁止多端登錄功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12異步redis隊(duì)列實(shí)現(xiàn) 數(shù)據(jù)入庫的方法
今天小編就為大家分享一篇異步redis隊(duì)列實(shí)現(xiàn) 數(shù)據(jù)入庫的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10基于Redis+Lua腳本實(shí)現(xiàn)分布式限流組件封裝的方法
這篇文章主要介紹了基于Redis+Lua腳本實(shí)現(xiàn)分布式限流組件封裝,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Redis緩存lettuce更換為Jedis的實(shí)現(xiàn)步驟
在springboot中引入spring-boot-starter-data-redis依賴時(shí),默認(rèn)使用的是lettuce,如果不想使用lettuce而是使用Jedis連接池,本文主要介紹了Redis緩存lettuce更換為Jedis的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-08-08SpringMVC集成redis配置的多種實(shí)現(xiàn)方法
這篇文章主要介紹了SpringMVC集成redis配置的多種實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03在Redis數(shù)據(jù)庫中實(shí)現(xiàn)分布式速率限制的方法
這篇文章主要介紹了在Redis數(shù)據(jù)庫中實(shí)現(xiàn)分布式速率限制的方法,文中展示了一個(gè)用Python編寫的應(yīng)用示例,需要的朋友可以參考下2015-06-06