溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

redis怎么實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和緩存的一致性

發(fā)布時(shí)間:2020-06-23 11:38:15 來(lái)源:億速云 閱讀:340 作者:Leah 欄目:關(guān)系型數(shù)據(jù)庫(kù)

redis怎么實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和緩存的一致性?針對(duì)這個(gè)問(wèn)題,這篇文章給出了相對(duì)應(yīng)的分析和解答,希望能幫助更多想解決這個(gè)問(wèn)題的朋友找到更加簡(jiǎn)單易行的辦法。

方式1:

數(shù)據(jù)庫(kù)保存數(shù)據(jù),redis不persist redis啟動(dòng)后,從數(shù)據(jù)庫(kù)加載數(shù)據(jù) 不要求強(qiáng)一致實(shí)時(shí)性的讀請(qǐng)求,都由redis處理 要求強(qiáng)一致實(shí)時(shí)性的讀請(qǐng)求,由數(shù)據(jù)庫(kù)處理 寫(xiě)請(qǐng)求有2種處理方式,由數(shù)據(jù)庫(kù)處理

應(yīng)用先寫(xiě)道數(shù)據(jù)庫(kù),然后更新redis

應(yīng)用先寫(xiě)道數(shù)據(jù)庫(kù),然后其它daemon同步到redis

優(yōu)點(diǎn):redis啟動(dòng)不用處理redis數(shù)據(jù)和數(shù)據(jù)庫(kù)不一致

缺點(diǎn):redis啟動(dòng)給數(shù)據(jù)庫(kù)很大的讀壓力

方式2:

數(shù)據(jù)庫(kù)和redis分別處理不同的數(shù)據(jù)類(lèi)型,數(shù)據(jù)庫(kù)處理要求強(qiáng)一致實(shí)時(shí)性的數(shù)據(jù),例如金融數(shù)據(jù)、交易數(shù)據(jù);Redis處理不要求強(qiáng)一致實(shí)時(shí)性的數(shù)據(jù),例如網(wǎng)站最熱貼排行榜

redis和MySQL數(shù)據(jù)的同步,代碼級(jí)別大致可以這樣做: 讀: 讀redis->沒(méi)有,讀mysql->把mysql數(shù)據(jù)寫(xiě)回redis 寫(xiě): 寫(xiě)mysql->成功,寫(xiě)redis

并發(fā)不高的情況: 讀: 讀redis->沒(méi)有,讀mysql->把mysql數(shù)據(jù)寫(xiě)回redis,有的話(huà)直接從redis中取; 寫(xiě): 寫(xiě)mysql->成功,再寫(xiě)redis;

并發(fā)高的情況: 讀: 讀redis->沒(méi)有,讀mysql->把mysql數(shù)據(jù)寫(xiě)回redis,有的話(huà)直接從redis中取; 寫(xiě):異步話(huà),先寫(xiě)入redis的緩存,就直接返回;定期或特定動(dòng)作將數(shù)據(jù)保存到mysql,可以做到多次更新,一次保存;

--備注:如果寫(xiě)redis要使用redis的事務(wù):

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使用同時(shí)只允許一個(gè)腳本執(zhí)行,符合事務(wù)的原子性,但一個(gè)lua腳本不能執(zhí)行時(shí)間過(guò)大,不然會(huì)阻塞

EVAL

EVAL命令對(duì) Lua 腳本進(jìn)行執(zhí)行求值。

語(yǔ)法:

EVAL script numkeys key [key …] arg [arg …]
script lua腳本內(nèi)容 注意的是腳本不應(yīng)該是Lua函數(shù)。
numkeys 表示指定鍵名參數(shù)的個(gè)數(shù)。
key [key ...] 表示腳本對(duì)應(yīng)的key值列表 在腳本中可以使用KEYS[1] KEYS[2] KEYS[3]KEYS[n] n從1開(kāi)始 。
arg [arg ...] 命名行中傳遞的參數(shù)列表 在腳本中可以使用ARGV[1] ARGV[2] ARGV[3]ARGV[n] n從1開(kāi)始 。

一個(gè)示例勝過(guò)千言萬(wàn)語(yǔ)的解釋

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

執(zhí)行上面腳本返回

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

關(guān)于redis實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和緩存的一致性的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI