新聞中心
??當(dāng)在Redis中讀取的值和預(yù)期的不一致時,就會出現(xiàn)一定問題。具體問題可以分為兩類:一是緩存擊穿,二是數(shù)據(jù)臟讀。在遇到這些情況時,如何處理是我們必須面臨的難題。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)圖木舒克,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
### 1.緩存擊穿
??緩存擊穿是指當(dāng)某個被緩存的數(shù)據(jù),因為某些原因(例如數(shù)據(jù)庫、緩存等數(shù)據(jù)源改變),出現(xiàn)了緩存失效,導(dǎo)致大量涉及到這些被緩存數(shù)據(jù)的請求直接打到數(shù)據(jù)庫中,大量應(yīng)用系統(tǒng)訪問流量,從而導(dǎo)致數(shù)據(jù)庫連接數(shù)及其瓶頸,出現(xiàn)雪崩效應(yīng)。
??解決方案:為了解決緩存擊穿,通??梢圆扇〉拇胧┤缦拢?/p>
1.給緩存數(shù)據(jù)設(shè)置過期時間;
2.緩存訪問加鎖,避免對相同緩存數(shù)據(jù)發(fā)出多條請求,減輕數(shù)據(jù)庫壓力;
//先設(shè)定一個null值
String value = null;
// 加鎖
synchronized {
// 從redis中獲取值
value = redisTemplate.opsForValue().get(“KEY”);
// 如果獲取的值是空,則從數(shù)據(jù)庫中獲取
if (value == null){
value = getValueFromDB();
}
// 設(shè)置鎖的過期時間
redisTemplate.opsForValue().set(“l(fā)ock”,“l(fā)ocked”,10,TimeUnit.SECONDS);
}
//獲取數(shù)據(jù)庫中的值
private String getValueFromDB(){
String value = db.queryValue();
// 將數(shù)據(jù)庫的值保存到redis中
redisTemplate.opsForValue().set(key, value);
return value;
}
### 2.數(shù)據(jù)臟讀
??數(shù)據(jù)臟讀指的是從數(shù)據(jù)庫中讀取數(shù)據(jù)時,在數(shù)據(jù)庫中某行數(shù)據(jù)正在被事務(wù)處理,但客戶端仍然可以讀到,這種數(shù)據(jù)被稱為臟數(shù)據(jù),導(dǎo)致以上現(xiàn)象即臟讀。
??解決辦法:Redis中解決數(shù)據(jù)臟讀有以下辦法:
1.在新增,修改,刪除操作時使用watch機(jī)制;
2.利用redis的鎖原子操作來確保數(shù)據(jù)的一致性;
//定義一個隨機(jī)數(shù)
Random random = new Random();
//設(shè)置一個Redis的key
String key = "data";
//設(shè)置key的默認(rèn)值
String value = "default";
// 開啟watch
redisTemplate.watch(key);
//隨機(jī)等待幾秒
int sleepTime = random.nextInt(1000);
Thread.sleep(sleepTime);
//獲取key的值
String currentValue = redisTemplate.opsForValue().get(key);
//給key設(shè)置新的值
String newValue = “new”;
redisTemplate.opsForValue().set(key, newValue);
//進(jìn)行樂觀鎖處理
if (currentValue.equals(value)){
System.out.println("數(shù)據(jù)正常更新");
}else {
System.out.println("發(fā)現(xiàn)數(shù)據(jù)被更改,回滾更新");
redisTemplate.unwatch();
}
??以上就是在Redis中讀取的值非預(yù)期的情況下處理緩存擊穿和數(shù)據(jù)臟讀的具體步驟,要確保Redis中讀取的值能夠符合預(yù)期,就必須做好相關(guān)的解決辦法,否則會對應(yīng)用產(chǎn)生不良影響。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專業(yè)的建站服務(wù),為您量身定制,歡迎來電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設(shè)、設(shè)計、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計和制作領(lǐng)域具有豐富的經(jīng)驗。
文章題目:Redis中讀取的值非預(yù)期(redis讀回來的值不對)
URL鏈接:http://fisionsoft.com.cn/article/cdjgosd.html


咨詢
建站咨詢
