新聞中心
Redis緩存擊穿是指,由于緩存中不存在某個鍵,當(dāng)大量請求企圖訪問它時,緩存集群將會擊穿成為直接到源服務(wù)層的請求,導(dǎo)致源服務(wù)層過載,短時間內(nèi)持續(xù)處理的請求過多從而宕掉,從而影響服務(wù)的正常運(yùn)行,嚴(yán)重時還會給用戶帶來困擾,故防止Redis緩存擊穿幾乎成為了所有程序員的必修課。

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作與策劃設(shè)計(jì),天等網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:天等等地區(qū)。天等做網(wǎng)站價(jià)格咨詢:028-86922220
那么,如何有效防止Redis緩存擊穿呢?
第一、合理設(shè)計(jì)Redis緩存結(jié)構(gòu)。一般來說,將數(shù)據(jù)分到多個Redis節(jié)點(diǎn)上可以降低擊穿無法給節(jié)點(diǎn)帶來壓力,而Hash管理結(jié)構(gòu)可以更好管理緩存,分散請求量,加大整個redis集群的容量,從而有效防止擊穿,當(dāng)然實(shí)際的緩存結(jié)構(gòu)的選擇要結(jié)合具體的業(yè)務(wù)場景。以下是一個在Js中分離Redis鍵的示例代碼:
//redis鍵名:userid:complex:info
var redisKey = 'userid:' + userId + ':complex:info';
//redis鍵值:拆分成多個Redis鍵
var redisHashKey = {
name: 'userid:' + userId + ':name',
age: 'userid:' + userId + ':age‘
job: 'userid:' + userId + ':job'
....
....
};
第二、即使緩存中不存在某個鍵,也要盡量避免直接向源服務(wù)層發(fā)出請求。Redis緩存中可以設(shè)置一個虛擬值,當(dāng)程序發(fā)現(xiàn)不存在某個鍵時,也能夠拿到一個虛擬值,從而可以有效的減少直接的源服務(wù)層請求,攔截掉緩存擊穿。如下面示例代碼:
//首先查看緩存中是否存在該鍵
if (!exist) {
//不存在,設(shè)置虛擬值,并設(shè)置緩存過期時間,以免發(fā)生誤操作
redis.setex(' userid ' + user_id + ': no_exist ', 60, "This record doesn‘t exist!’");
}else {
//存在,走正常的流程
var val = redis.get(' userid ' + user_id + ':userinfo ');
//調(diào)用回調(diào)函數(shù)
cb(val);
}
對于一些更高級的操作,可以考慮使用布隆過濾器。布隆過濾器是一種高效的技術(shù),可以有效減少緩存擊穿發(fā)生的概率,比如說緩存中沒有某鍵,在布隆過濾器中也可以查到,這樣,哪怕向源服務(wù)層發(fā)出請求,也可以先從布隆過濾器中查詢,有了肯定結(jié)果后才向源服務(wù)層發(fā)出請求,從而有效的減少擊穿的概率,還可以有效的減少源服務(wù)層的壓力。
為了有效的防止Redis緩存擊穿,需要我們充分認(rèn)識其原理,并結(jié)合緩存結(jié)構(gòu)設(shè)計(jì)、虛擬值設(shè)置以及布隆過濾器的技術(shù),一起細(xì)致的對緩存系統(tǒng)進(jìn)行設(shè)計(jì),才能夠有效的防止Redis緩存擊穿的問題。
創(chuàng)新互聯(lián)-老牌IDC、云計(jì)算及IT信息化服務(wù)領(lǐng)域的服務(wù)供應(yīng)商,業(yè)務(wù)涵蓋IDC(互聯(lián)網(wǎng)數(shù)據(jù)中心)服務(wù)、云計(jì)算服務(wù)、IT信息化、AI算力租賃平臺(智算云),軟件開發(fā),網(wǎng)站建設(shè),咨詢熱線:028-86922220
新聞標(biāo)題:如何有效防止Redis緩存擊穿(如何防止redis被擊穿)
文章起源:http://www.dlmjj.cn/article/dhsjjsp.html


咨詢
建站咨詢
