PHP面試題 之 redis

2021-07-30 19:32:40 字數 1717 閱讀 9585

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

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

生存時間可以通過使用 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 。

可以對乙個已經帶有生存時間的 key 執行expire命令,新指定的生存時間會取代舊的生存時間。過期時間的精度已經被控制在1ms之內,主鍵失效的時間複雜度是o(1),

expire和ttl命令搭配使用,ttl可以檢視key的當前生存時間。設定成功返回 1;當 key 不存在或者不能為 key 設定生存時間時,返回 0 。

最大快取配置

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

server.maxmemory

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

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進行淘汰
原文請參見:

面試題 PHP面試題

建議 比如是系統配置,缺少了無法執行,自然使用 require 如果某一段程式少了,只是少了統計 訪問的,不是必不可少的。可以使用 include 而加不加 once 就是效率上的區別,雖然系統會幫你考慮只包含一次,但系統的判斷會降低效率,因此,更應該在開發之初,把目錄結構調整高好,盡量不使用 on...

PHP面試題之優化

php效能問題 1.php語法使用的不恰當 2.使用php語言做了它不擅長的事 3.使用php語言鏈結的服務不給力 4.php自身做不了的事情 php的效能問題的解決方向 1.php語言級的效能優化 優化 2.php周邊問題的效能優化 linux,mysql,磁碟等 3.php語言效能的優化 c層 ...

PHP面試題之優化

php效能問題 1.php語法使用的不恰當 2.使用php語言做了它不擅長的事 3.使用php語言鏈結的服務不給力 4.php自身做不了的事情 php的效能問題的解決方向 1.php語言級的效能優化 優化 2.php周邊問題的效能優化 linux,mysql,磁碟等 3.php語言效能的優化 c層 ...