【二十二】redis之內存淘汰策略和過期策略

一、內存淘汰策略

1.場景

redis的數據會在內存裏面,並且有配置設置redis最多能佔用多少內存,那就一定存在一個情況:當redis能佔用的內存已滿,但redis還需要再存新的數據在內存中,那怎麼辦?

這個就是內存淘汰策略解決的問題

2.配置redis最大佔用內存

1.通過配置文件設置

redis.conf配置文件中添加以下配置,設置Redis最大佔用內存大小爲多少,比如

maxmemory 100mb

 2.通過命令修改

設置Redis最大佔用內存大小爲100M

127.0.0.1:6379> config set maxmemory 100mb

獲取配置的Redis能使用的最大內存大小

127.0.0.1:6379> config get maxmemory

如果設置爲0表示沒有限制 

3.redis支持的內存淘汰策略

在配置文件redis.conf中

# maxmemory <bytes>
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# The default is:
# maxmemory-policy noeviction
 

redis3.0開始支持6種策略

1. volatile-lru

volatile表示:從設置了過期時間的數據集中根據某個算法(LRU)選出數據來淘汰。

lru表示:使用LRU(最近最少使用)算法進行淘汰

連起來就是:從設置過期時間的數據集(鍵值對過期時間的表,即 redisDb.expires)中挑選出最近最少使用的數據淘汰。

注意:沒有設置過期時間的key不會被淘汰。

特點:在增加內存空間的同時保證需要持久化的數據不會丟失。

2. volatile-ttl

volatile表示:從設置了過期時間的數據集中根據某個算法(ttl)選出數據來淘汰。

ttl表示:過期時間,即使越快過期的約先被淘汰。

注意:沒有設置過期時間的key不會被淘汰。

特點:在增加內存空間的同時保證需要持久化的數據不會丟失。

3. volatile-random

volatile表示:從設置了過期時間的數據集中根據某個算法(random)選出數據來淘汰。

random表示:隨機。從設置了過期時間的數據集中隨機選出數據來淘汰

注意:沒有設置過期時間的key不會被淘汰。

特點:在增加內存空間的同時保證需要持久化的數據不會丟失。

4. allkeys-lru

allkey表示:從所有的數據集中根據某個算法(lru)選出數據來淘汰。

lru表示:使用LRU(最近最少使用)算法進行淘汰

5. allkeys-random

allkey表示:從所有的數據集中根據某個算法(random)選出數據來淘汰。

random表示:隨機。從所有的數據集中隨機選出數據來淘汰

6. no-enviction

默認的淘汰策略

no表示:不淘汰

此時,當內存不足以容納新入數據時,新寫入操作就會報錯(DEL請求和部分特殊請求除外)

二、key過期策略

Redis的過期策略就是指當Redis中緩存的key過期了,Redis如何處理

Redis中同時使用了惰性過期定期過期

常見的過期策略有以下三種:

1.定時過期

每個設置過期時間的key都需要創建一個定時器,到過期時間就會立即清除。

優點:可以立即清除過期的數據,對內存很友好。

缺點:會佔用大量的CPU資源去處理過期的數據,從而影響緩存的響應時間和吞吐量。

2.惰性過期

只有當訪問一個key時,纔會判斷該key是否已過期,過期則清除

優點:不過多佔用CPU資源去做過期處理

缺點:該策略可以最大化地節省CPU資源,卻對內存非常不友好。極端情況可能出現大量的過期key沒有再次被訪問,從而不會被清除,佔用大量內存。

3.定期過期

首先:redis中,每個庫(0-15)都有一個expires字典,它會保存所有設置了過期時間的key的過期時間數據。

定期過期是說的:每隔一定的時間,會掃描一定數量的庫(比如0-15號庫其中幾個庫)的expires字典中一定數量的key,並清除其中已過期的key。

該策略是前兩者的一個折中方案。通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和內存資源達到最優的平衡效果。

 

 

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