<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redis 的過期策略和內(nèi)存淘汰機制有什么區(qū)別

          共 1951字,需瀏覽 4分鐘

           ·

          2021-08-22 02:00

          Redis 是如何處理過期數(shù)據(jù)的

          對于已經(jīng)過期的數(shù)據(jù),Redis 將使用兩種策略來刪除這些過期鍵,它們分別是惰性刪除和定期刪除。

          惰性刪除是指 Redis 服務器不主動刪除過期的鍵值,而是當訪問鍵值時,再檢查當前的鍵值是否過期,如果過期則執(zhí)行刪除并返回 null 給客戶端;如果沒過期則正常返回值信息給客戶端。

          它的優(yōu)點是不會浪費太多的系統(tǒng)資源,只是在每次訪問時才檢查鍵值是否過期。缺點是刪除過期鍵不及時,造成了一定的空間浪費。

          惰性刪除的執(zhí)行流程如下圖所示:


          定期刪除是指 Redis 服務器每隔一段時間會檢查一下數(shù)據(jù)庫,看看是否有過期鍵可以被清除。

          注意:定期刪除的掃描并不是遍歷所有的鍵值對,這樣的話比較費時且太消耗系統(tǒng)資源。Redis 服務器采用的是隨機抽取形式,每次從過期字典中,取出 20 個鍵進行過期檢測,過期字典中存儲的是所有設置了過期時間的鍵值對。如果這批隨機檢查的數(shù)據(jù)中有 25% 的比例過期,那么會再抽取 20 個隨機鍵值進行檢測和刪除,并且會循環(huán)執(zhí)行這個流程,直到抽取的這批數(shù)據(jù)中過期鍵值小于 25%,此次檢測才算完成。

          定期刪除的執(zhí)行流程,如下圖所示:


          當內(nèi)存不夠用時 Redis 又是如何處理的

          當 Redis 內(nèi)存不夠用時,Redis 服務器會根據(jù)服務器設置的淘汰策略,刪除一些不常用的數(shù)據(jù),以保證 Redis 服務器的順利運行。

          Redis 內(nèi)存淘汰策略有哪些

          我們可以使用 config get maxmemory-policy 命令,來查看當前 Redis 的內(nèi)存淘汰策略,示例代碼如下:

          127.0.0.1:6379> config get maxmemory-policy

          1) "maxmemory-policy"

          2) "noeviction"

          4.0之前內(nèi)存淘汰策略有如下6種

          1、noeviction:不淘汰任何數(shù)據(jù),當內(nèi)存不足時,執(zhí)行緩存新增操作會報錯,它是 Redis 默認內(nèi)存淘汰策略。

          2、allkeys-lru:淘汰整個鍵值中最久未使用的鍵值。

          3、allkeys-random:隨機淘汰任意鍵值。

          4、volatile-lru:淘汰所有設置了過期時間的鍵值中最久未使用的鍵值。

          5、volatile-random:隨機淘汰設置了過期時間的任意鍵值。

          6、volatile-ttl:優(yōu)先淘汰更早過期的鍵值。

          4.0 版本中又新增了 2 種淘汰策略

          1、volatile-lfu,淘汰所有設置了過期時間的鍵值中最少使用的鍵值;

          2、allkeys-lfu,淘汰整個鍵值中最少使用的鍵值。

          注意:從以上內(nèi)存淘汰策略中可以看出,allkeys-xxx 表示從所有的鍵值中淘汰數(shù)據(jù),而 volatile-xxx 表示從設置了過期鍵的鍵值中淘汰數(shù)據(jù)。

          這個內(nèi)存淘汰策略我們可以通過配置文件來修改,redis.conf 對應的配置項是“maxmemory-policy noeviction”,只需要把它修改成我們需要設置的類型即可

          需要注意的是,如果使用修改 redis.conf 的方式,當設置完成之后需要重啟 Redis 服務器才能生效。

          還有另一種簡單的修改內(nèi)存淘汰策略的方式,我們可以使用命令行工具輸入“config set maxmemory-policy noeviction”來修改內(nèi)存淘汰的策略,這種修改方式的好處是執(zhí)行成功之后就會生效,無需重啟 Redis 服務器。但它的壞處是不能持久化內(nèi)存淘汰策略,每次重啟 Redis 服務器之后設置的內(nèi)存淘汰策略就會丟失。

          Redis 有哪些內(nèi)存淘汰算法

          內(nèi)存淘汰算法主要包含兩種:LRU 淘汰算法和 LFU 淘汰算法。

          LRU( Least Recently Used,最近最少使用)淘汰算法:是一種常用的頁面置換算法,也就是說最久沒有使用的緩存將會被淘汰。

          LRU 是基于鏈表結構實現(xiàn)的,鏈表中的元素按照操作順序從前往后排列,最新操作的鍵會被移動到表頭,當需要進行內(nèi)存淘汰時,只需要刪除鏈表尾部的元素即可。

          LFU(Least Frequently Used,最不常用的)淘汰算法:最不常用的算法是根據(jù)總訪問次數(shù)來淘汰數(shù)據(jù)的,它的核心思想是“如果數(shù)據(jù)過去被訪問多次,那么將來被訪問的頻率也更高”。

          LFU 相對來說比 LRU 更“智能”,因為它解決了使用頻率很低的緩存,只是最近被訪問了一次就不會被刪除的問題。如果是使用 LRU 類似這種情況數(shù)據(jù)是不會被刪除的,而使用 LFU 的話,這個數(shù)據(jù)就會被刪除。


          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费视频一区二区三区四 | 亚洲成人免费网 | 亚洲天堂资源站 | 99re在线视频观看 | 老司机一区 |