首頁 >資料庫 >Redis >redis如何保證資料一致性

redis如何保證資料一致性

(*-*)浩
(*-*)浩原創
2019-11-28 09:56:2016217瀏覽

現在redis在互聯中有大量的使用,根據業務的不同,其使用上也有所不同,但一般都有資料儲存和快取的一致性問題,以下就給大家介紹幾個比較成熟實用的方案。

redis如何保證資料一致性

方式1:

#資料庫儲存數據,redis不persist redis啟動後,從資料庫載入資料不要求強一致即時性的讀取請求,都由redis處理要求強一致即時性的讀取請求,由資料庫處理寫入請求有2種處理方式,由資料庫處理     (建議學習:Redis視訊教學

應用程式先寫道資料庫,然後更新redis

應用程式先寫道資料庫,然後其它daemon同步到redis 

優點:redis啟動不用處理redis資料和資料庫不一致 

缺點:redis啟動給資料庫很大的讀取壓力

方式2:

資料庫和redis分別處理不同的資料類型,資料庫處理要求強一致即時性的數據,例如金融數據、交易數據;Redis處理不要求強一致即時性的數據,例如網站最熱貼排行榜

redis和MySQL數據的同步,程式碼層級大致可以這樣做: 讀: 讀redis->沒有,讀mysql->把mysql資料寫回redis 寫: 寫mysql->成功,寫redis

並發不高的情況: 讀: 讀redis- > 沒有,讀mysql->把mysql資料寫回redis,有的話直接從redis中取;寫: 寫mysql->成功,再寫redis;

並發高的情況:讀: 讀redis->沒有,讀mysql->把mysql資料寫回redis,有的話直接從redis中取;寫:異步話,先寫入redis的緩存,就直接返回;定期或特定動作將資料儲存到mysql,可以做到多次更新,一次儲存;

--備註:如果寫redis要使用redis的交易:

127.0.0.1:6379> WATCH id
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR id
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 342183
127.0.0.1:6379>

方式3:

使用lua腳本:redis在使用lua使用同時只允許一個腳本執行,符合交易的原子性,但一個lua腳本不能執行時間過大,不然會阻塞

EVAL

EVAL指令對Lua 腳本進行執行求值。

語法:

EVAL script numkeys key [key …] arg [arg …]
script lua脚本内容 注意的是脚本不应该是Lua函数。
numkeys 表示指定键名参数的个数。
key [key ...] 表示脚本对应的key值列表 在脚本中可以使用KEYS[1] KEYS[2] KEYS[3]KEYS[n] n从1开始 。
arg [arg ...] 命名行中传递的参数列表 在脚本中可以使用ARGV[1] ARGV[2] ARGV[3]ARGV[n] n从1开始 。

一個範例勝過千言萬語的解釋

eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 id name 3 mytest

執行上面腳本回傳

1) "id"2) "name"
3) "2"
4) "mytest"

更多Redis相關技術文章,請造訪Redis入門教學專欄進行學習!

以上是redis如何保證資料一致性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn