1. 程式人生 > 其它 >redis的LRU快取清除演算法講解以及相關配置使用

redis的LRU快取清除演算法講解以及相關配置使用


之前給大家講解過,多級快取架構,快取資料生產服務,監聽各個資料來源服務的資料變更的訊息,得到訊息之後,然後呼叫介面拉去資料

將拉去到的資料,寫入本地ehcache快取一份,spring boot整合,演示過

資料寫入redis分散式快取中一份,你不斷的將資料寫入redis,寫入redis,然後redis的記憶體是有限的,每個redis例項最大一般也就是設定給10G

那如果你不斷的寫入資料,當資料寫入的量超過了redis能承受的範圍之後,改該怎麼玩兒呢???

redis是會在資料達到一定程度之後,超過了一個最大的限度之後,就會將資料進行一定的清理,從記憶體中清理掉一些資料

只有清理掉一些資料之後,才能將新的資料寫入記憶體中

1、LRU演算法概述

redis預設情況下就是使用LRU策略的,因為記憶體是有限的,但是如果你不斷地往redis裡面寫入資料,那肯定是沒法存放下所有的資料在記憶體的

所以redis預設情況下,當記憶體中寫入的資料很滿之後,就會使用LRU演算法清理掉部分記憶體中的資料,騰出一些空間來,然後讓新的資料寫入redis快取中

LRU:Least Recently Used,最近最少使用演算法

將最近一段時間內,最少使用的一些資料,給幹掉。比如說有一個key,在最近1個小時內,只被訪問了一次; 還有一個key在最近1個小時內,被訪問了1萬次

這個時候比如你要將部分資料給清理掉,你會選擇清理哪些資料啊?肯定是那個在最近小時內被訪問了1萬次的資料

2、快取清理設定

redis.conf

maxmemory,設定redis用來存放資料的最大的記憶體大小,一旦超出這個記憶體大小之後,就會立即使用LRU演算法清理掉部分資料

如果用LRU,那麼就是將最近最少使用的資料從快取中清除出去

對於64 bit的機器,如果maxmemory設定為0,那麼就預設不限制記憶體的使用,直到耗盡機器中所有的記憶體為止; 但是對於32 bit的機器,有一個隱式的閒置就是3GB

maxmemory-policy,可以設定記憶體達到最大閒置後,採取什麼策略來處理

(1)noeviction: 如果記憶體使用達到了maxmemory,client還要繼續寫入資料,那麼就直接報錯給客戶端
(2)allkeys-lru: 就是我們常說的LRU演算法,移除掉最近最少使用的那些keys對應的資料
(3)volatile-lru: 也是採取LRU演算法,但是僅僅針對那些設定了指定存活時間(TTL)的key才會清理掉
(4)allkeys-random: 隨機選擇一些key來刪除掉
(5)volatile-random: 隨機選擇一些設定了TTL的key來刪除掉
(6)volatile-ttl: 移除掉部分keys,選擇那些TTL時間比較短的keys

在redis裡面,寫入key-value對的時候,是可以設定TTL,存活時間,比如你設定了60s。那麼一個key-value對,在60s之後就會自動被刪除

redis的使用,各種資料結構,list,set,等等

allkeys-lru

這邊拓展一下思路,對技術的研究,一旦將一些技術研究的比較透徹之後,就喜歡橫向對比底層的一些原理

storm,科普一下

玩兒大資料的人搞得,領域,實時計算領域,storm

storm有很多的流分組的一些策略,按shuffle分組,global全域性分組,direct直接分組,fields按欄位值hash後分組

分組策略也很多,但是,真正公司裡99%的場景下,使用的也就是shuffle和fields,兩種策略

redis,給了這麼多種亂七八糟的快取清理的演算法,其實真正常用的可能也就那麼一兩種,allkeys-lru是最常用的

3、快取清理的流程

(1)客戶端執行資料寫入操作
(2)redis server接收到寫入操作之後,檢查maxmemory的限制,如果超過了限制,那麼就根據對應的policy清理掉部分資料
(3)寫入操作完成執行

4、redis的LRU近似演算法

科普一個相對來說稍微高階一丟丟的知識點

redis採取的是LRU近似演算法,也就是對keys進行取樣,然後在取樣結果中進行資料清理

redis 3.0開始,在LRU近似演算法中引入了pool機制,表現可以跟真正的LRU演算法相當,但是還是有所差距的,不過這樣可以減少記憶體的消耗

redis LRU演算法,是取樣之後再做LRU清理的,跟真正的、傳統、全量的LRU演算法是不太一樣的

maxmemory-samples,比如5,可以設定取樣的大小,如果設定為10,那麼效果會更好,不過也會耗費更多的CPU資源

本文來自部落格園,作者:三號小玩家,轉載請註明原文連結:https://www.cnblogs.com/q1359720840/p/15886077.html