寫入redis中的資料為什麼不見了

2021-09-08 02:06:34 字數 1127 閱讀 8356

我們有時候會遇到這樣的事情,當想redis寫入一些資料後,再次查詢發現資料不見了,這是怎麼回事呢?資料明明過期了,怎麼還占用著記憶體?

我們知道redis 主要是基於記憶體來進行高效能、高併發的讀寫操作的。然而記憶體是有限的,比如 redis 就只能用 10g,你要是往裡面寫了 20g 的資料,會咋辦?當然會乾掉 10g 的資料,然後就保留 10g 的資料了。那乾掉哪些資料?保留哪些資料?這就要根據設定的redis的淘汰機制來選擇了。

資料明明過期了,竟然還占用這記憶體,這些都是由 redis 的過期策略來決定。

redis的過期策略包括兩種,分別是定期刪除和惰性刪除:

定期刪除:指的是 redis 預設是每隔 100ms 就隨機抽取一些設定了過期時間的 key,檢查其是否過期,如果過期就刪除。(不能完全刪除)

惰性刪除:直接查詢資料的時候,redis會先檢視一些這個資料是否已經過期,如果過期,就進行刪除。(不能完全刪除資料)

記憶體淘汰機制包括以下幾種方式:

設定記憶體淘汰機制的方式:

在redis.conf中,maxmemory 100mb 最大記憶體設定,如果0 預設無限 ;maxmemory-policy: allkeys-lru

public class lrucacheextends linkedhashmap

/*** 如果map的尺寸大於設定的最大長度,返回true,再新加入物件時刪除最老的物件

* @param eldest - 在對映中的至少最近插入的條目,或者如果這是乙個訪問順序圖,

* 最近最少訪問的條目。這是將要被移除的將,此方法返回true。

* 如果對映是之前的認沽或呼叫的putall導致此呼叫空的,這將是剛插入的條目;換句話說,

* 如果對映中包含乙個條目,該條目eldest也是最新的。

* @return

*/@override

protected boolean removeeldestentry(map.entryeldest)

}

向Redis集群中寫入資料

在redis cli每次錄入 查詢鍵值,redis都會計算出該key應該送往的插槽,如果不是該客戶端對應伺服器插槽,redis會報錯,並告知應前往的redis例項位址和埠。redis cli客戶端提供了 c 引數實現自動重定向。如 redis cli c p 6379 登入後,再錄入 查詢鍵值對可以...

Redis的簡介 為什麼使用Redis

首先介紹一下我們為什麼要使用redis 首先對圖上內容進行一下解釋 資料庫中的資料儲存是通過,分塊的形式來儲存的 當我們進行資料查詢的時候,是通過全量的方式進行掃瞄的,就是要對所有的資料塊進行掃瞄,找到符合的資料在返回給使用者 所以資料庫又引用了索引的方式,索引的資料塊 使用者查詢資料時,先查詢索引...

scala中為什麼不建議用return

在scala中使用return的話,編譯的時候會提示the latest statement is method is automatically returned,use of th return keyword is redundant.這個警告是說最後乙個語句的結果會自動返回,不需要使用ret...