我們有時候會遇到這樣的事情,當想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...