1. 程式人生 > 其它 >高併發面試:執行緒池的七大引數?手寫一個執行緒池?

高併發面試:執行緒池的七大引數?手寫一個執行緒池?

一.Redis過期策略

1. 設定過期命令

expire設定生存時間
expireat設定過期時間點(時間戳)

2. key的3種過期策略

(1)定時刪除:在設定過期時間的同時,設定一個定時器,定時器的執行時間就是過期的時間點。
優點:對記憶體最友好,過期的鍵會以最快的被刪除,釋放記憶體。
缺點:對CPU時間最不友好,在大量鍵設定過期時間時,會建立大量的定時器,執行浪費CPU時間。
2)惰性刪除:不管鍵是否過期,只有每次取值的時候,才檢查是否過期,過期就刪除。 優點:對CPU時間最友好,取值時檢查,只對當前鍵操作,不影響其他。 缺點:對記憶體不友好,可能會存在大量過期的未被使用的鍵值沒有刪除,無用資料佔用了大量記憶體。
3)定期刪除:每隔一段時間,程式對資料庫進行一次檢查,過期的就刪除。 優點:前兩種方案的折中,通過減少執行頻率來減少對CPU時間的影響,通過定期刪除減少了對記憶體的浪費。 缺點:執行頻率需要掌握好,不然太頻繁則退化成定時刪除,太少則退化成惰性刪除。

3.Redis預設採用的是惰性刪除和定期刪除兩種策略

定期刪除:指的是redis預設是每隔100ms就隨機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就刪除
惰性刪除:在你獲取某個key的時候,redis會檢查一下 ,這個key如果設定了過期時間那麼是否過期了,如果過期了此時就會刪除,不會給你返回任何東西

4.持久化和主從複製對過期鍵的處理

(1)RDB持久化
寫入rdb檔案:程式會對過期鍵進行檢查, 過期鍵不寫入
載入rdb檔案:如果以主伺服器模式執行,程式會對檔案中儲存的鍵進行檢查,僅載入未過期的鍵,而過期鍵則會忽略;
           如果以從伺服器模式執行, 不會檢查是否過期,資料都會載入(過期鍵會通過與主伺服器同步而刪除)
2)AOF持久化 AOF檔案寫入時,鍵已過期但未刪除,不影響;鍵過期已刪除,則在AOF檔案後追加一條DEL命令。 AOF重寫過程中, 程式會對資料庫中的鍵進行檢查,過期的鍵會忽略, 不會被儲存到重寫後的aof檔案中。
3)主從複製 主從模式下,由主伺服器進行刪除過期鍵,並顯示的向從伺服器傳送DEL命令; 從伺服器自身不具備刪除過期鍵值行為, 它的過期刪除動作由主伺服器控制 (從伺服器只有在接到主伺服器發來的del命令後,才會刪除過期鍵)。

二.Redis記憶體淘汰機制

1. 概念

當Redis的記憶體使用達到設定的記憶體上限時就會觸發記憶體淘汰機制(使用者儲存的一些鍵被可以被Redis主動地從例項中刪除),按照特定的淘汰演算法進行資料清理,釋放記憶體

2. 配置方式

我們通過配置redis.conf中的maxmemory這個值來開啟記憶體淘汰功能(maxmemory為0的時候表示我們對Redis的記憶體使用沒有限制)
我們通過配置redis.conf中的maxmemory
-policy來指定淘汰策略(預設是noeviction策略)

3. 8種記憶體淘汰策略(預設noeviction)

noeviction: 不淘汰,在redis的記憶體超過限制之後,新的寫入會報錯, 讀操作正常執行
allkeys
-lru:LRU演算法,記憶體不足時,在所有key中淘汰最近最少使用的key allkeys-lfu: 記憶體不足時,在所有key中淘汰使用頻次最少的key allkeys-random:隨機,記憶體不足時,在所有key中隨機選擇一個key淘汰
volatile-lru:記憶體不足時,在設定了過期時間的key中,淘汰最近最少使用的key volatile-lfu: 記憶體不足時,在設定了過期時間的key中,淘汰使用頻次最少的key volatile-random:記憶體不足時,在設定了過期時間的key中,隨機選擇一個key淘汰 volatile-ttl:記憶體不足時,在設定了過期時間的key中,選擇即將要過期的key淘汰