java進階篇--Redis 的過期策略和內存淘汰機制有什麼區別?

Redis 和 MySQL 是面試繞不過的兩座大山,他們一個是關係型數據庫的代表(MySQL),一個是鍵值數據庫以及緩存中間件的一哥。尤其 Redis 幾乎是所有互聯網公司都在用的技術,比如國內的 BATJ、新浪、360、小米等公司;國外的微軟、Twitter、Stack Overflow、GitHub、暴雪等公司。我從業了十幾年,就職過 4、5 家公司,有的公司用 MySQL、有的用 SQL Server、甚至還有的用 Oracle 和 DB2,但緩存無一例外使用的都是 Redis,從某種程度上來講 Redis 是普及率最高的技術,沒有之一。

我們本課時的面試題是,Redis 是如何處理過期數據的?當內存不夠用時 Redis 又是如何處理的?

回答:

我們在新增 Redis 緩存時可以設置緩存的過期時間,該時間保證了數據在規定的時間內失效,可以藉助這個特性來實現很多功能。比如,存儲一定天數的用戶(登錄)會話信息,這樣在一定範圍內用戶不用重複登錄了,但爲了安全性,需要在一定時間之後重新驗證用戶的信息。因此,我們可以使用 Redis 設置過期時間來存儲用戶的會話信息。

對於已經過期的數據,Redis 將使用兩種策略來刪除這些過期鍵,它們分別是惰性刪除和定期刪除。

惰性刪除是指 Redis 服務器不主動刪除過期的鍵值,而是當訪問鍵值時,再檢查當前的鍵值是否過期,如果過期則執行刪除並返回 null 給客戶端;如果沒過期則正常返回值信息給客戶端。

它的優點是不會浪費太多的系統資源,只是在每次訪問時才檢查鍵值是否過期。缺點是刪除過期鍵不及時,造成了一定的空間浪費。

惰性刪除的源碼位於 src/db.c 文件的 expireIfNeeded 方法中,如下所示:
int expireIfNeeded(redisDb *db, robj *key) {
    // 判斷鍵是否過期
    if (!keyIsExpired(db,key)) return 0;
    if (server.masterhost != NULL) return 1;
    /* 刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章