1.redis支持哪些數(shù)據(jù)類型
?string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)
2.過期策略
(1)定期刪除:
Redis 默認(rèn)每個 100ms 檢查,有過期 Key 則刪除。需要說明的是,Redis 不是每個 100ms 將所有的 Key 檢查一次,而是隨機(jī)抽取進(jìn)行檢查,因為如果redis中有數(shù)量很大的key(例如幾十萬key),那么每隔100ms檢查一次,redis很可能就死掉了,因為數(shù)據(jù)太多,檢查太頻繁,cpu負(fù)載太高了。如果只采用定期刪除策略,會導(dǎo)致很多 Key 到時間沒有刪除。于是,惰性刪除派上用場。
(2)惰性刪除:
當(dāng)你在獲取某個 key 的時候,redis 會檢查這個 key是否設(shè)置了過期時間,如果設(shè)置了過期時間,檢查key是否過期,如果過期了此時就會刪除,返回空值。
3.淘汰機(jī)制
noeviction: 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯(使用較少)。
allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,移除最近最少使用的 key(這個是最常用的)。
allkeys-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,隨機(jī)移除某個 key(使用較少)。
volatile-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,移除最近最少使用的 key(使用較少)。
volatile-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,隨機(jī)移除某個 key(使用較少)。
volatile-ttl:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,有更早過期時間的 key 優(yōu)先移除(使用較少)。
4.什么是緩存雪崩
(1)對于“對緩存數(shù)據(jù)設(shè)置相同的過期時間,導(dǎo)致某段時間內(nèi)緩存失效,請求全部走數(shù)據(jù)庫。
(2)Redis掛掉了,請求全部走數(shù)據(jù)庫。
5.怎么解決緩存雪崩
對于“對緩存數(shù)據(jù)設(shè)置相同的過期時間,導(dǎo)致某段時間內(nèi)緩存失效,請求全部走數(shù)據(jù)庫?!边@種情況
- 在緩存的時候給過期時間加上一個隨機(jī)值,這樣就會大幅度的減少緩存在同一時間過期。
對于“Redis掛掉了,請求全部走數(shù)據(jù)庫”這種情況,我們可以有以下的思路:
- 事發(fā)前:實(shí)現(xiàn)Redis的高可用(主從架構(gòu)+Sentinel 或者Redis Cluster),盡量避免Redis掛掉這種情況發(fā)生。
- 事發(fā)中:萬一Redis真的掛了,我們可以設(shè)置本地緩存(ehcache)+限流(hystrix),盡量避免我們的數(shù)據(jù)庫被干掉(起碼能保證我們的服務(wù)還是能正常工作的)
- 事發(fā)后:redis持久化,重啟后自動從磁盤上加載數(shù)據(jù),快速恢復(fù)緩存數(shù)據(jù)
6.什么是緩存擊穿
緩存穿透是指查詢一個一定不存在的數(shù)據(jù)。由于緩存不命中,并且出于容錯考慮,如果從數(shù)據(jù)庫查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個不存在的數(shù)據(jù)每次請求都要到數(shù)據(jù)庫去查詢,失去了緩存的意義。
比如:每次請求的ID都是負(fù)數(shù)。這會導(dǎo)致我的緩存就沒用了,請求全部都找數(shù)據(jù)庫去了,但數(shù)據(jù)庫也沒有這個值啊,所以每次都返回空出去。
7.如何解決緩存擊穿
- 由于請求的參數(shù)是不合法的(每次都請求不存在的參數(shù)),于是我們可以使用布隆過濾器(BloomFilter)或者壓縮filter提前攔截,不合法就不讓這個請求到數(shù)據(jù)庫層!
-當(dāng)我們從數(shù)據(jù)庫找不到的時候,我們也將這個空對象設(shè)置到緩存里邊去。下次再請求的時候,就可以從緩存里邊獲取了。這種情況我們一般會將空對象設(shè)置一個較短的過期時間。