<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的過期和淘汰是兩回事兒

          共 2090字,需瀏覽 5分鐘

           ·

          2022-06-11 19:04

          早期文章


          ? ? ? ? 做程序員的競爭越來越大,有一種三百六十行,行行轉程序員的感覺。當程序員的想著轉行做送外賣逃離 007、996,送外賣的卻想著轉行當程序員。看到群里小伙伴發(fā)的照片,想起以前一個阿姨在地鐵上學 Java Web 的照片,真的是太卷了……不,是太勵志了!


          ? ? ? ? 今天整理一下關于 Redis 的過期策略和淘汰機制,這兩個東西看著很像,其實不是一回事兒。


          過期策略

          ? ? ? ? 我們在使用 Redis 當作緩存時,通常會給 Redis 的 Key 設置一個過期時間,被設置過期時間的 Key 在未過期時可以對其進行讀取或更新操作,也可以主動將其刪除。當其超過設置的時間后,它將失效。通過它的過期機制,可以完成很多功能,比如計數(shù)器復位、token 過期等。


          ? ? ????那么,Redis 對已經過期的數(shù)據(jù)是進行如何處理,或者說是如何刪除呢?在 Redis 中有兩種策略來刪除過期的 Key,分別是 主動刪除 被動刪除?兩種方式,也有資料稱為 定期刪除?和?惰性刪除


          被動刪除(惰性刪除)

          ? ? ? ??動刪除也被稱為惰性刪除,是 Redis 中的 Key 已經過期,但是 Redis 不會主動將其刪除,當有客戶端訪問該過期 Key 時,Redis 對其進行檢查,發(fā)現(xiàn)其過期則將其刪除,并返回 null 給客戶端。


          主動刪除(定期刪除)

          ? ? ? ? 惰性刪除有它的優(yōu)點,不會浪費太多的系統(tǒng)資源,但是也存在相應的問題,就是已經過期的 Key 如果不再被訪問,就不會被刪除了,這樣會浪費不必要的存儲空間。因此 Redis 存在一種主動刪除過期 Key 的策略。


          ? ? ? ??主動刪除也被稱為定期刪除,Redis 會定期掃描已經設置了過期時間的 Key,然后從中刪除已經過期的 Key。Redis 默認一秒鐘完成 10 次這樣的掃描,它大概的流程如下:

          • 從設定了過期的 Key 中隨機抽取 20 個 Key?進行過期檢測

          • 刪除所有已經過期的 Key

          • 如果有本次刪除的 Key?超過 25%,那么重復第一步

          ? ? ? ? 如果有大量的 Key 過期,這樣的掃描可能會導致線程卡頓,因此每次掃描的時長最長為 25ms。


          ? ? ? ? 以上是 Redis 處理過期 Key 的方案,當 Redis 服務器占用的內存空間超過最大允許內存之后,會觸發(fā)內存的淘汰策略。


          淘汰策略

          ? ? ? ? 內存淘汰策略是指 Redis 使用的內存達到或超過其配置的最大內存時觸發(fā)的一種保護策略,它根據(jù)具體的策略來淘汰一些 Key 使得 Redis 可以繼續(xù)運行。在 Redis 4.0 之后的版本中,Redis 的內存淘汰策略共有 8 種。

          • noeviction:內存達到配置的最大內存時,不再接受新增 Key 的操作,它是默認配置

          • allkeys-lru:在所有 Key 中,保留最近使用的 Key,刪除最近最少使用的 Key

          • allkeys-lfu:在所有 Key 中,保留常用的 Key,刪除最不常用的 Key

          • allkeys-random:在所有 Key 中,隨機刪除一些 Key

          • volatile-lru:在設置了過期時間的 Key 中,刪除最近最少使用的 Key

          • volatile-lfu:在設置了過期時間的 Key 中,刪除最不常用的 Key

          • volatile-random:在設置了過期時間的 Key 中,隨機刪除一些 Key

          • volatile-ttl:在設置了過期時間的 Key 中,刪除最短剩余生存時間中最不常用的 Key


          ? ? ? ? 從上面的策略中可以看出,大體分為兩類,分別是 allkeys 和 volatile 兩種。allkeys 是所有的 Key,volatile 是設置了過期時間的 Key。在 allkeys 和 volatile 中使用兩個淘汰策略是 LRU 和 LFU,即 最近最少使用(確切的是 近似 LRU 算法) 和 最不常用 兩種。


          小結

          ? ? ? ??過期和淘汰是兩回事,過期是對設置過期時間的 Key 進行刪除的一種機制,而淘汰是當使用內存超過設置最大內存時觸發(fā)的一種保護機制,雖然它也會刪除一些 Key。上面整理的是關于 Redis 的過期和淘汰的知識點,具體應該怎么設置淘汰策略,官網給出了建議。需要了解 LRU 和 LFU 算法也可以在官網得到具體的說明。


          公眾號內回復?【mongo】 下載 SpringBoot 整合操作 MongoDB 的文檔。

          公眾號內回復?【cisp知識整理】 下載 CISP 讀書筆記。

          公眾號內回復【java開發(fā)手冊】獲取《Java開發(fā)手冊》黃山版。



          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  日韩黄色三级片 | 欧洲A级成人淫片免费看 | 玖玖成人电影 | 日韩乱轮视频 | 99成人免费视频 |