網(wǎng)站搭建類型推廣平臺收費(fèi)標(biāo)準(zhǔn)
1.什么是緩存穿透,什么是緩存雪崩,什么是緩存擊穿?
緩存穿透:假如某一時刻訪問redis的大量key都在redis中不存在(比如黑客故意偽造一些亂七八糟的key),那么也會給數(shù)據(jù)造成壓力,這就是緩存穿透,解決方案是使用布隆過濾器,它的作用就是如果它認(rèn)為一個key不存在,那么這個key就肯定不存在,所以可以在緩存之前加一層布隆過濾器來攔截不存在的key
緩存擊穿:和緩存雪崩類似,緩存雪崩是大批熱點(diǎn)數(shù)據(jù)失效,而緩存擊穿是指某一個熱點(diǎn)key突然失效,也導(dǎo)致了大量請求直接訪問Mysql數(shù)據(jù)庫,這就是緩存擊穿,解決方案就是考慮這個熱點(diǎn)key不設(shè)過期時間
緩存雪崩:如果緩存中某一時刻大批熱點(diǎn)數(shù)據(jù)同時過期,那么就可能導(dǎo)致大量請求直接訪問Mysql了,解決辦法就是在過期時間上增加一點(diǎn)隨機(jī)值,另外如果搭建一個高可用的Redis集群也是防止緩存雪崩的有效手段
2.redis怎么設(shè)置key的過期時間?
(1)分開設(shè)置
// 兩條命令分別設(shè)置值和過期時間
?? ?// 時間單位:秒
?? ?redis.expire("key",6);
?? ?// 時間單位:毫秒
?? ?//redis.pexpire("key",6000L)
(2)合并設(shè)置
一條命令同時設(shè)置值和過期時間,推薦使用此方式。
?? ?// 一條語句設(shè)置值和過期時間
? ? // 時間單位:秒
?? ?redis.setex("key",6,"value");
? ? // 時間單位:毫秒
?? ?//redis.psetex("key",6000L,"value")
3.redis怎么刪除過期時間
(1)定期刪除
當(dāng)放入數(shù)據(jù)后,設(shè)置一個定時器,當(dāng)定時器讀秒完畢后,將對應(yīng)的數(shù)據(jù)從dict中刪除。
優(yōu)點(diǎn): 內(nèi)存友好,數(shù)據(jù)一旦過期就會被刪除
缺點(diǎn): CPU不友好,定時器耗費(fèi)CPU資源,并且頻繁的執(zhí)行清理操作也會耗費(fèi)CPU資源。
用時間換空間
定期刪除可以通過:第一、配置redis.conf 的hz選項,默認(rèn)為10 (即1秒執(zhí)行10次,100ms一次,值越大說明刷新頻率越快,最Redis性能損耗也越大) 第二、配置redis.conf的maxmemory最大值,當(dāng)已用內(nèi)存超過maxmemory限定時,就會觸發(fā)主動清理策略
(2)懶漢式刪除
當(dāng)數(shù)據(jù)過期的時候,不做任何操作。當(dāng)訪問數(shù)據(jù)的時候,查看數(shù)據(jù)是否過期,如果過期返回null,并且將數(shù)據(jù)從內(nèi)存中清除。如果沒過期,就直接返回數(shù)據(jù)。
優(yōu)點(diǎn): CPU友好,數(shù)據(jù)等到過期并且被訪問的時候,才會刪除。
缺點(diǎn): 內(nèi)存不友好,會占用大量內(nèi)存。
4.redis為什么讀取速度比較快
(一)純內(nèi)存操作,避免大量訪問數(shù)據(jù)庫,減少直接讀取磁盤數(shù)據(jù),redis將數(shù)據(jù)儲存在內(nèi)存里面,讀寫數(shù)據(jù)的時候都不會受到硬盤 I/O 速度的限制,所以速度快;
(二)單線程操作,避免了不必要的上下文切換和競爭條件,也不存在多進(jìn)程或者多線程導(dǎo)致的切換而消耗CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現(xiàn)死鎖而導(dǎo)致的性能消耗;
(三)采用了非阻塞I/O多路復(fù)用機(jī)制 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用戶首先將需要進(jìn)行IO操作的socket添加到select中,然后阻塞等待select系統(tǒng)調(diào)用返回。當(dāng)數(shù)據(jù)到達(dá)時,socket被激活,select函數(shù)返回。用戶線程正式發(fā)起read請求,讀取數(shù)據(jù)并繼續(xù)執(zhí)行。這樣用戶可以注冊多個socket,然后不斷地調(diào)用select讀取被激活的socket,redis服務(wù)端將這些socke置于隊列中,然后,文件事件分派器,依次去隊列中取,轉(zhuǎn)發(fā)到不同的事件處理器中,提高讀取效率。