<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系列:對過期數(shù)據(jù)揮刀問斬

          共 2363字,需瀏覽 5分鐘

           ·

          2024-04-18 16:27

          歡迎關(guān)注微信公眾號:互聯(lián)網(wǎng)全棧架構(gòu)

          號外:今天刷新公眾號后臺,竟然發(fā)現(xiàn)有了留言功能,這個功能可是盼望了好幾年了,現(xiàn)在終于擁有了,真是喜出望外,歡迎大家留言討論啊,感謝!

          在Redis中,我們可以設(shè)置key的過期時間,比如兩個小時,那么在兩個小時以后,這些key通過什么方式進行刪除?

          另外,如果占用的內(nèi)存達到最大限制以后,Redis如何進行處理?關(guān)于這兩個問題,本文嘗試把它們講清楚。在面試中,這也是經(jīng)常會被問到的問題。文章主要包括以下幾個部分:

          一、設(shè)置過期時間

          二、過期數(shù)據(jù)的刪除策略

          三、內(nèi)存淘汰策略

          四、小結(jié)

          設(shè)置過期時間


          在Redis中,有些命令在創(chuàng)建key的時候可以同時設(shè)置它的過期時間,比如SET、SETEX:

          # 創(chuàng)建key value,并設(shè)置key的過期時間
          SET key value EX [過期時間]
          SETEX key [過期時間] value

          同時,所有數(shù)據(jù)類型的key都可以設(shè)置過期時間,通過下面的這幾個命令來實現(xiàn):

          EXPIRE key seconds:設(shè)置key的過期時間,單位為秒
          PEXPIRE key milliseconds:設(shè)置key的過期時間,單位為毫秒
          EXPIREAT key unix-time-seconds:設(shè)置key的過期時間,參數(shù)為UNIX時間戳,以秒為單位
          PEXPIREAT key unix-time-milliseconds:設(shè)置key的過期時間,參數(shù)為UNIX時間戳,以毫秒為單位
          我們也可以使用ttl命令來查看key的剩余過期時間,它以秒為單位,而pttl也是同樣的功能,只不過它以毫秒為單位。

          過期數(shù)據(jù)刪除策略


          Redis對于過期數(shù)據(jù)的刪除策略有兩種:
          1. 惰性刪除:到了過期時間也不做任何處理,只有在訪問這個key的時候才對它進行過期檢查,如果沒有過期,則返回數(shù)據(jù);否則刪除這個key。配置項lazyfree-lazy-eviction=yes開啟惰性刪除。
          2定期刪除:每隔一段時間就對一些key進行檢查,如果已過期就把它刪除,Redis還會限制刪除操作的執(zhí)行時間和頻率,從而減少對于CPU的影響。通過參數(shù)hz可以設(shè)置操作的頻率,比如配置hz 10,表示每秒會進行10次掃描,官方建議不要超過100,否則會對CPU造成較大壓力。

          可以看出,惰性刪除對于CPU比較友好,但內(nèi)存中可能殘留了很多已經(jīng)過期的key,而定期刪除對于內(nèi)存友好。采用惰性刪除+定期刪除相結(jié)合的方式,在合理使用CPU和內(nèi)存之間達到一個平衡。

          內(nèi)存淘汰策略


          不管是惰性刪除還是定期刪除,都會有很多漏網(wǎng)之魚,這時候就需要引入內(nèi)存淘汰機制了,當內(nèi)存超過一定的限度,需要按照規(guī)則清除一些數(shù)據(jù),從而騰出更多的使用空間。
          在Redis的配置文件中有一個配置項:maxmemory,它用于設(shè)置Redis實例能夠使用的最大內(nèi)存,當Redis占用的內(nèi)存達到maxmemory設(shè)定的值以后,Redis會根據(jù)一定的策略來釋放內(nèi)存,它一共提供了8種內(nèi)存淘汰策略:

          這些策略的命名也有一定的規(guī)律,以單詞volatile開頭的,針對的是設(shè)置了過期時間的key,而allkeys針對的是所有的key。lru是Least Recently Used的縮寫,表示最近最少使用,而lfu是Least Frequently Used的縮寫,表示最不經(jīng)常使用。以這樣的方式記憶和理解,就簡單方便多了。

          小結(jié)


          本文介紹了Redis刪除過期數(shù)據(jù)的策略,然而,不管是什么樣的策略,內(nèi)存中都可能還會有一些本該刪除但還沒有刪除的數(shù)據(jù),這時候,內(nèi)存淘汰的機制就登場了,而且,Redis對于內(nèi)存的使用也不能是無限制的,所以需要設(shè)置maxmemory且按照策略淘汰數(shù)據(jù)。

          創(chuàng)作不易,煩請點贊分享!

          歡迎留言討論,非常感謝!

          推薦閱讀:

          吃透Redis系列:高可用的哨兵模式

          吃透Redis系列:數(shù)據(jù)持久化

          吃透Redis系列:琳瑯滿目的數(shù)據(jù)類型(下篇,文末彩蛋)

          吃透Redis系列:琳瑯滿目的數(shù)據(jù)類型(上篇)

          吃透Redis系列:總體介紹

          瀏覽 144
          10點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  大香蕉欧美伊人 | 亚洲无码在线中文字幕 | 99er在线 | 成人欧美视频 | 国产女人18毛片水18精 |