欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis數據一致性之延時雙刪策略詳解

 更新時間:2023年09月05日 11:11:27   作者:無形風  
在使用redis時,需要保持redis和數據庫數據的一致性,最流行的解決方案之一就是延時雙刪策略,今天我們就來詳細刨析一下,需要的朋友可以參考下

在使用redis時,需要保持redis和數據庫數據的一致性,最流行的解決方案之一就是延時雙刪策略,今天我們就來詳細刨析一下

注意:要知道經常修改的數據表不適合使用redis,因為雙刪策略執(zhí)行的結果是把redis中保存的那條數據刪除了,以后的查詢就都會去查詢數據庫。所以redis使用的是讀遠遠大于改的數據緩存。

1,首先要理解在并發(fā)環(huán)境下redis數據一致性的問題所在

在多線程并發(fā)情況下,假設有兩個數據庫修改請求,為保證數據庫與redis的數據一致性,
修改請求的實現中需要修改數據庫后,級聯修改redis中的數據。
請求一:1.1修改數據庫數據		1.2 修改redis數據
請求二:2.1修改數據庫數據		2.2 修改redis數據
并發(fā)情況下就會存在1.1 ---> 2.1 ---> 2.2 ---> 1.2的情況 
(一定要理解線程并發(fā)執(zhí)行多組原子操作執(zhí)行順序是可能存在交叉現象的)
此時存在的問題就是:
	1.1修改數據庫的數據最終保存到了redis中,2.1在1.1之后也修改了數據庫數據。
	此時出現了redis中數據和數據庫數據不一致的情況,在后面的查詢過程中就會長時間去先查redis,
	從而出現查詢到的數據并不是數據庫中的真實數據的嚴重問題。
問題解決:
	修改數據庫級聯修改redis數據改為  修改數據庫數據后級聯刪除redis數據
	至于是先執(zhí)行1.2的redis刪除,還是限制性2.2的redis刪除,無關緊要。
	結果都是redis中數據已被刪除。之后的查詢就會由于redis中沒有數據而去查數據庫,
	此時即不會存在查詢到的數據和數據庫的數據不一致的情況。

2,上面詳解了redis數據一致性的問題所在,并提供了單刪策略來解決問題但此時依然存在比較嚴重的問題。

上面的單刪策略情況如下:
修改請求的實現中需要修改數據庫后,級聯刪除redis中的數據。
請求一:1.1修改數據庫數據		1.2 刪除redis數據
請求二:2.1修改數據庫數據		2.2 刪除redis數據
假設現在并發(fā)存在一個查詢請求
請求三:3.1查詢redis中數據   3.2查詢數據庫數據    3.3 新查到的數據寫入redis
(一定要理解帶redis的查詢請求實現邏輯,先查redis,數據不存在查數據庫,
			查到的數據寫入redis以便以后的查詢不去直接查數據庫)
此時并發(fā)情況下就會存在1.1 ---> 1.2 ---> 3.1 ---> 3.2 ---> 2.1 ---> 2.2 ---> 3.3的情況 
此時存在的問題就是:
	此時數據庫中的數據保存的是2.1修改后的數據,而redis中保存的數據是3.2中在1.1修改數據后的結果,
	此時出現了redis中數據和數據庫數據不一致的情況,在后面的查詢過程中就會長時間去先查redis,
	從而出現查詢到的數據并不是數據庫中的真實數據的嚴重問題。

3,上面刨析到了單刪策略來解決redis數據一致性存在的問題,下面我們來說雙刪策略

上面的單刪策略存在問題的情況如下:
請求一:1.1修改數據庫數據		1.2 刪除redis數據
請求二:2.1修改數據庫數據		2.2 刪除redis數據
請求三:3.1查詢redis中數據   3.2查詢數據庫數據    3.3 新查到的數據寫入redis
添加延時雙刪策略后的情況
請求一:1.1修改數據庫數據		1.2 刪除redis數據    1.3 延時3--5s再去刪除redis中數據
請求二:2.1修改數據庫數據		2.2 刪除redis數據    2.3 延時3--5s再去刪除redis中數據
請求三:3.1查詢redis中數據     3.2 查詢數據庫數據    3.3 新查到的數據寫入redis
雙刪策略為什么能解決問題:
因為存在了延時時間,故1.3或2.3 一定是最后執(zhí)行的一步操作(并發(fā)中的延時一定要理解)
延時的根本目的就是為了讓程序先把3.3執(zhí)行完,再去刪除redis

4,如何實現延時3–5s的操作

比較好的:   項目整合quartz等定時任務框架,去實現延時3--5s再去執(zhí)行最后一步任務
比較一般的:  創(chuàng)建線程池,線程池中拿一個線程,線程體中延時3-5s再去執(zhí)行最后一步任務(不能忘了啟動線程)
比較差的:   單獨創(chuàng)建一個線程去實現延時執(zhí)行

到此這篇關于redis數據一致性之延時雙刪詳解的文章就介紹到這了,更多相關redis延時雙刪內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于Redis無序集合如何實現禁止多端登錄功能

    基于Redis無序集合如何實現禁止多端登錄功能

    這篇文章主要給你大家介紹了關于基于Redis無序集合如何實現禁止多端登錄功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • 異步redis隊列實現 數據入庫的方法

    異步redis隊列實現 數據入庫的方法

    今天小編就為大家分享一篇異步redis隊列實現 數據入庫的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • Redis中不同持久化方式的差異對比

    Redis中不同持久化方式的差異對比

    大家應該都知道,Redis持久化方式主要有兩種:RDB(Redis DataBase)和AOF(Append-only file),但是他們各自存儲了什么內容?有什么差異呢?今天我來給大家做個小試驗,需要的朋友可以參考下
    2024-03-03
  • 5分鐘搭建redis集群(redis5.0.5)

    5分鐘搭建redis集群(redis5.0.5)

    本文主要介紹了5分鐘搭建redis集群,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 基于Redis+Lua腳本實現分布式限流組件封裝的方法

    基于Redis+Lua腳本實現分布式限流組件封裝的方法

    這篇文章主要介紹了基于Redis+Lua腳本實現分布式限流組件封裝,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Redis緩存lettuce更換為Jedis的實現步驟

    Redis緩存lettuce更換為Jedis的實現步驟

    在springboot中引入spring-boot-starter-data-redis依賴時,默認使用的是lettuce,如果不想使用lettuce而是使用Jedis連接池,本文主要介紹了Redis緩存lettuce更換為Jedis的實現步驟,感興趣的可以了解一下
    2024-08-08
  • SpringMVC集成redis配置的多種實現方法

    SpringMVC集成redis配置的多種實現方法

    這篇文章主要介紹了SpringMVC集成redis配置的多種實現方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Redis中大Key與熱Key的解決方案

    Redis中大Key與熱Key的解決方案

    在工作中Redis已經成為必備的一款高性能的緩存數據庫,但是在實際的使用過程中,我們常常會遇到兩個常見的問題,也就是文章標題所說的大 key與熱 key,本文給大家介紹了Redis中大Key與熱Key的解決方案,需要的朋友可以參考下
    2024-06-06
  • 如何用redis?setNX命令來加鎖

    如何用redis?setNX命令來加鎖

    這篇文章主要介紹了如何用redis?setNX命令來加鎖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 在Redis數據庫中實現分布式速率限制的方法

    在Redis數據庫中實現分布式速率限制的方法

    這篇文章主要介紹了在Redis數據庫中實現分布式速率限制的方法,文中展示了一個用Python編寫的應用示例,需要的朋友可以參考下
    2015-06-06

最新評論