redis有淘汰機制
1.noeviction(預設c策略)
記憶體不足時,直接報錯。(不用)
2.allkeys-lru
當記憶體不足時,在全部key中移除最近最少使用的key(lru演算法)
3.volatile-lru
當記憶體不足時,在設定了過期時間的key中移除最近最少使用的key(lru演算法)
4.allkeys-random
當記憶體不足時,在所有key中隨機刪除乙個key
5.volatile-random
當記憶體不足時,隨機刪除乙個設定了過期時間的key
6.volatile-ttl
記憶體不足時,有限刪除生存時間最短的key
7.allkeys-lfu
記憶體不足時,在全部key中移除最近最少使用次數的key(lfu演算法)
8.volatile-lfu
當記憶體不足時,在設定了過期時間的key中移除最近最少使用次數的key(lfu演算法)
以上策略可在配置檔案redis.conf中設定
maxmemory # 指定redis的最大記憶體
maxmemory-policy noeviction #指定redis的淘汰機制
3.快取穿透的原因,解決方案
理想狀態下第一次請求 請求 -> 先去快取查詢 -> 再去資料庫查詢 -> 放到快取乙份.
下次請求 請求 -> 先去快取查詢.
而快取穿透則是快取中沒有,資料庫 中也沒有,導致資料庫壓力過大,直接宕機,例如查詢乙個主鍵為id為0的記錄
解決方案:
1.設定主鍵自增
查詢最大的主鍵值,放到redis裡,每次去資料庫查詢之前,先判斷一下傳條件是否大於你的主鍵值.
2. 將全部的主鍵放到redis的set中,在查詢之前,先判斷查詢條件是否存在於set中.
3. 將使用者的ip放到zset中,每查詢一次,將時間戳放入zset中,1分鐘發起了很多次請求,超過了要求上線,封ip.
4. 無論資料庫中是否存在,都存入redis,若不存在則值為null,
4.快取擊穿
原因:資料庫和快取中有乙個是熱點資料,當快取中資料到期,大量請求會同時查詢資料庫,導致資料庫壓力過大,直接宕機
解決方案:利用分布式鎖雙重檢測讓一部分人先查資料庫查完存入快取,其他人再進行查詢就回直接查詢快取
public listselectproductattr(string phonemodel) .gettype();
//先判斷是否有key
boolean aboolean = stringredistemplate.haskey(key);
//如果有key則表示快取中有資料
if (aboolean)
//雙重鎖校驗
//第一層檢測目的:避免所有執行緒排隊
if (null == list || list.isempty())
//2、如果快取中沒有資料
if (null == list || list.isempty()) else }}
}//4、將查詢到的資料返回給使用者
return list;
}
總結:
1、雙重檢測機制(在鎖的內外都進行快取查詢,沒有查到再進行資料庫查詢)。
2、不論查詢到的資料是否為null,都將它寫入快取。
3、避免快取中的null鍵值撐滿整個記憶體,所以需要給null鍵值設定過期時間。
5、key的設計,要唯一標識一條資料,不能被其他資料覆蓋。
比如分頁,book_page_1, book_page_2.
快取id為1的資料:book_id_1
通過這些步驟,既能解決穿透又能保證效率。
4.快取雪崩
原因:大量的快取同時到期,導致資料庫壓力過大,直接宕機
解決方案:
設定生存時間時,避免設定相同時間,應設定為一定返回內的隨機數,如30-60分鐘的隨機數
5.快取傾斜
原因:大量的熱點資料都存在了乙個redis節點中,導致redis宕機
解決方案:
在web伺服器中新增jvm快取(map),設定生存時間
將熱點資料的key在web伺服器中做一次hash計算,並將乙個資料設定到多個redis節點中,分擔壓力,在集群上搭建主從
6.快取同步
將資料庫中的資料同步到快取中
實時同步: 直接呼叫set方法,存入快取
不要求實時同步: 傳送到mq中進行同步
Redis相關面試題
reids 單執行緒 io多路復用機制 redis與memcached的區別 一 memcached值是簡單字串,redis支援hash set list等複雜資料型別 二 redis可持久化資料,容災能力強。memcached只存於記憶體中。三 redis是單執行緒操作,核心是io多路復用機制,效...
Redis相關面試題
原因 redis是記憶體儲存,斷電丟失資料,所以需要資料持久化。非同步執行緒 fork copy on write 系統io fsync rdb 指定時間間隔內觸發頻率,對資料進行快照儲存。儲存rdb檔案是父程序fork子程序來完成,最大化redis的效能 丟失資料多 aof 每次對伺服器寫操作會追...
Redis 相關面試題(下)
1 redis的快取失效策略和主鍵失效機制 作為快取系統都要定期清理無效資料,就需要乙個主鍵失效和淘汰策略.在redis當中,有生存期的key被稱為volatile。在建立快取時,要為給定的key設定生存期,當key過期的時候 生存期為0 它可能會被刪除。1.過期時間跟著key走,與值無關 在red...