如何解決相親交友原始碼中Redis快取擊穿、雪崩問題?

雲豹科技程式設計師 發表於 2021-10-13
Redis

為了實現相親交友原始碼中動態資料的快取,一般會採用Redis進行處理,但是在Redis使用過程中,仍然會出現各種各樣的快取問題,像Redis快取擊穿和雪崩就是比較常見的兩個問題,在相親交友軟體開發中需要如何解決呢?

快取擊穿

相親交友原始碼中Redis快取擊穿是指快取中沒有但資料庫中有的資料,由於出現大量的併發請求,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。

造成這種情況大致有兩種情況:

1、第一次查詢資料時,沒有進行快取預熱,資料並沒有加入快取當中。
2、快取由於到達過期時間導致失效。

解決思路:

1、當快取不命中時,在查詢相親交友原始碼資料庫前使用redis分散式鎖,使用查詢的key值作為鎖條件;
2、獲取鎖的執行緒在查詢資料庫前,再查詢一次快取。這樣做是因為高併發請求獲取鎖的時候造成排隊,但第一次進來的執行緒在查詢完資料庫後會寫入快取,之後再獲得鎖的執行緒直接查詢快取就可以獲得資料;
3、讀取完資料後釋放分散式鎖。

程式碼思路:

public String queryData(String key) throws Exception {
    String data;
    data = queryDataFromRedis(key);// 查詢快取資料
    if (data == null) {
        if(redisLock.tryLock()){//獲取分散式鎖
            data = queryDataFromRedis(key); // 再次查詢快取
            if (data == null) {
                data = queryDataFromDB(key); // 查詢資料庫
                writeDataToRedis(data); // 將查詢到的資料寫入快取
            }
            redisLock.unlock();//釋放分散式鎖
        }
    }
    return data;}

具體分散式鎖的實現可以使用redis中強大的setnx命令:

/*
* 加鎖
* key-鍵;value-值
* nxxx-nx(只在key不存在時才可以set)|xx(只在key存在的時候set)
* expx--ex代表秒,px代表毫秒;time-過期時間,單位是expx所代表的單位。
* */jedis.set(key, value, nxxx, expx, time);//解鎖jedis.del(key);

通過在加鎖的同時設定過期時間,還可以防止執行緒掛掉仍然佔用鎖的情況。

快取雪崩

相親交友原始碼中的Redis快取雪崩是指快取中資料大批量到過期時間,引發的大部分快取突然同時不可用,而查詢資料量巨大,引起資料庫壓力過大甚至當機的情況。
需要注意相親交友原始碼中Redis快取擊穿和快取雪崩的不同之處快取擊穿指的是大量的併發請求去查詢同一條資料;而快取雪崩是大量快取同時過期,導致很多查詢請求都查不到快取資料從而查資料庫。

解決方案:

1、錯開快取的過期時間,可通過設定快取資料的過期時間為預設值基礎上加上一個隨機值,防止同一時間大量資料過期現象發生。
2、搭建高可用的redis叢集,避免出現快取伺服器當機引起的雪崩問題。
參照hystrix,進行熔斷降級。

總結:

隨著Redis的使用日漸普及,越來越多的相親交友原始碼開始使用快取技術,但伴隨著便利的同時也因為使用不當造成了很多問題。只有在相親交友原始碼設計時期考慮到這些問題並加以克服,系統才能夠更加健壯。

本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
原文連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2795779/,如需轉載,請註明出處,否則將追究法律責任。