Redis資料已經過期了,為什麼還佔用記憶體?

@WLJ發表於2020-09-30

問題1:剛剛向redis中插入的資料怎麼沒了?

問題2:我插入redis的資料應該過期了,為什麼還佔用記憶體?

如果有以上問題說明你還不瞭解Redis的記憶體淘汰機制

問題1的解決:設定redis中key的過期時間

redis> SET cache_page "www.google.com"
OK
 
redis> EXPIRE cache_page 30  # 設定過期時間為 30 秒
(integer) 1

我們set key的時候,都可以給一個expire time,就是過期時間,指定這個key比如說只能存活1個小時?10分鐘?這個很有用,我們自己可以指定快取到期就失效。

如果假設你設定一個一批key只能存活1個小時,那麼接下來1小時後,redis是怎麼對這批key進行刪除的?

1.redis的過期策略

redis的過期策略:定期刪除+惰性刪除

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

可是有了定期刪除和惰性刪除就可以保證過期的key真的被刪掉嗎?

當然不能,問題2就是一個明顯的例子

問題2的解決:設定記憶體淘汰機制

2.redis中的記憶體淘汰機制

如果redis的記憶體佔用過多的時候,此時會進行記憶體淘汰,有如下一些策略:

1)noeviction:對於寫請求不再提供服務,直接返回錯誤

2)allkeys-lru:從鍵空間中,移除最近最少使用的key(這個是最常用的)

3)allkeys-random:從所有key中隨機淘汰資料

4)volatile-lru:從設定了過期時間的鍵空間中,移除最近最少使用的key(這個一般不太合適)

5)volatile-random:從設定了過期時間的鍵空間中,隨機移除某個key

6)volatile-ttl:從設定了過期時間的鍵空間中,有更早過期時間的key優先移除

配置

#獲取:
127.0.0.1:6379> config get maxmemory-policy
#設定:
maxmemory-policy allkeys-lru(通過redis.conf檔案)
#修改:
127.0.0.1:6379> config set maxmemory-policy allkeys-lru

相關文章