手機(jī)驗(yàn)證碼場(chǎng)景
redis里面存儲(chǔ)過(guò)期時(shí)間。通過(guò)校驗(yàn)redis里面存儲(chǔ)的值來(lái)校驗(yàn)驗(yàn)證碼是否過(guò)期或者是否正確。
image.png
校驗(yàn)邏輯
image.png
延伸
郵件的激活也是類似甥材,通過(guò)下發(fā)一個(gè)隨機(jī)的激活碼绑改,但是這個(gè)激活碼具有時(shí)效性谢床。是天然的redis的使用場(chǎng)景
Redis作為緩存數(shù)據(jù)庫(kù)
這里涉及到一個(gè)問(wèn)題緩存中的數(shù)據(jù)如何和DB的數(shù)據(jù)進(jìn)行同步呢(MySQL和Redis的雙寫一致性)
- 先更新緩存再更新數(shù)據(jù)庫(kù)
如果更新緩存成功但是數(shù)據(jù)庫(kù)失敗,會(huì)造成臟數(shù)據(jù)厘线,絕對(duì)不可取 - 先更新數(shù)據(jù)庫(kù)在更新緩存
在高并發(fā)情況下识腿,線程A更新數(shù)據(jù)庫(kù)成功,但是還沒(méi)有更新緩存造壮。線程B這時(shí)候更新數(shù)據(jù)庫(kù)渡讼,并且更新了緩存。這時(shí)候線程A再更新緩存耳璧。造成線程B對(duì)緩存的更新丟失了 -
先刪除緩存成箫,再更新數(shù)據(jù)庫(kù)
這種避免了緩存更新丟失的情況,但在高并發(fā)情況下依然會(huì)有不一致情況旨枯。
image.png
可以是使用延遲雙刪的方式來(lái)解決蹬昌。
public void write(String key,Object data){
redis.delKey(key);
db.updateData(data);
Thread.sleep(1000);
redis.delKey(key);
}
-
先更新數(shù)據(jù)庫(kù),再刪除緩存
image.png
public void write(String key,Object data){
db.updateData(data);
redis.delKey(key);
Thread.sleep(1000);
redis.delKey(key);
}