Redis的快取策略和主鍵失效機制

2022-07-06 20:00:19 字數 1796 閱讀 3615

作為快取系統都要定期清理無效資料,就需要乙個主鍵失效和淘汰策略.

在redis當中,有生存期的key被稱為volatile。在建立快取時,要為給定的key設定生存期,當key過期的時候(生存期為0),它可能會被刪除。

1、影響生存時間的一些操作

生存時間可以通過使用 del 命令來刪除整個 key 來移除,或者被 set 和 getset 命令覆蓋原來的資料,也就是說,修改key對應的value和使用另外相同的key和value來覆蓋以後,當前資料的生存時間不同。

比如說,對乙個 key 執行incr命令,對乙個列表進行lpush命令,或者對乙個雜湊表執行hset命令,這類操作都不會修改 key 本身的生存時間。另一方面,如果使用rename對乙個 key 進行改名,那麼改名後的 key 的生存時間和改名前一樣。

rename命令的另一種可能是,嘗試將乙個帶生存時間的 key 改名成另乙個帶生存時間的 another_key ,這時舊的 another_key (以及它的生存時間)會被刪除,然後舊的 key 會改名為 another_key ,因此,新的 another_key 的生存時間也和原本的 key 一樣。使用persist命令可以在不刪除 key 的情況下,移除 key 的生存時間,讓 key 重新成為乙個persistent key 。

2、如何更新生存時間

可以對乙個已經帶有生存時間的 key 執行expire命令,新指定的生存時間會取代舊的生存時間。過期時間的精度已經被控制在1ms之內,主鍵失效的時間複雜度是o(1),expire和ttl命令搭配使用,ttl可以檢視key的當前生存時間。設定成功返回 1;當 key 不存在或者不能為 key 設定生存時間時,返回 0 。

最大快取配置

在 redis 中,允許使用者設定最大使用記憶體大小

server.maxmemory

預設為0,沒有指定最大快取,如果有新的資料新增,超過最大記憶體,則會使redis崩潰,所以一定要設定。redis 記憶體資料集大小上公升到一定大小的時候,就會實行資料淘汰策略。

redis 提供 6種資料淘汰策略:

volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰

volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰

volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰

allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰

allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰

no-enviction(驅逐):禁止驅逐資料

注意這裡的6種機制,volatile和allkeys規定了是對已設定過期時間的資料集淘汰資料還是從全部資料集淘汰資料,後面的lru、ttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不**的策略。

使用策略規則:

1、如果資料呈現冪律分布,也就是一部分資料訪問頻率高,一部分資料訪問頻率低,則使用allkeys-lru

2、如果資料呈現平等分布,也就是所有的資料訪問頻率都相同,則使用allkeys-random

三種資料淘汰策略:

ttl和random比較容易理解,實現也會比較簡單。主要是lru最近最少使用淘汰策略,設計上會對key 按失效時間排序,然後取最先失效的key進行淘汰

原文請參見:

redis快取失效

redis快取的使用極大的提公升了應用程式的效能和效率,特別是資料查詢方面,但同時,它也帶來了一些問題。其中,最要害的問題,就是一些資料的一致性問題,從嚴格意義上講,這個問題不好解決。如果對資料的一致性要求很高,那麼不能是用快取。另外的問題就是快取穿透,快取雪崩和快取擊穿。快取穿透是指快取和資料庫中...

Redis快取失效問題

redis作為記憶體資料庫,其資料總會有失效的時候,資料失效引起的問題主要有三個 key對應的資料在資料來源並不存在,每次針對此key的請求從快取獲取不到,請求都會到資料來源,從而可能壓垮資料來源。比如用乙個不存在的使用者id獲取使用者資訊,不論快取還是資料庫都沒有,若黑客利用此漏洞進行攻擊可能壓垮...

Redis快取策略

redis快取一般使用cache aside pattern原則。什麼是 cache aside pattern cache aside pattern即為旁路快取方案的經驗實踐,分為讀實踐和寫實踐。那麼運算元據的時候先操作快取還是先運算元據庫?1.讀請求 先從快取中讀取所需資料,如果沒有則從資料庫...