redis中 數據一致性的方案

背景:
現在redis在互聯中有大量的使用,根據業務的不同,其使用上也有所不同,但一般都有數據存儲和緩存的一致性問題,下面就給大家介紹幾個比較成熟實用的方案,希望對大家有幫助,如果大家有好的方案和建議歡迎給我留言

方式1:
數據庫保存數據,redis不persist redis啓動後,從數據庫加載數據 不要求強一致實時性的讀請求,都由redis處理 要求強一致實時性的讀請求,由數據庫處理 寫請求有2種處理方式,由數據庫處理

應用先寫道數據庫,然後更新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"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章