關(guān)于YYCache的緩存過期時間的設(shè)置問題

YYCache有多優(yōu)秀,我就不多介紹了,關(guān)于它源碼的分析網(wǎng)上一搜一大堆。

今天來聊一下YYCache里的ageLimit.因為我已經(jīng)被這個屬性坑了兩次……

緩存超時時間設(shè)置,分為設(shè)置內(nèi)存緩存超時時間和硬盤緩存超時時間

內(nèi)存緩存過期時間

原理是:memoryCache初始化的時候,就開啟了一個循環(huán)調(diào)用,每隔一段時間去檢查緩存是否過期,是否超過限制等。
關(guān)于ageLimit。開始調(diào)用_trimToAge的時候,從鏈表尾部開始比較,如果過期就刪掉,然后繼續(xù)進(jìn)行比較……。

這里要注意的是超時時間ageLimit的屬性設(shè)置。因為源碼內(nèi)部,每次更新操作后,存的_now對應(yīng)的時間是CACurrentMediaTime(),代碼內(nèi)部判斷過期不過期是通過: 當(dāng)前時間(CACurrentMediaTime()計算得到)- 鏈表元素記錄的時間差值 與 ageLimit進(jìn)行比較。那么我們設(shè)置10分鐘緩存,應(yīng)該這樣設(shè)置: diskCache.ageLimit = 600;

硬盤緩存過期時間

原理和內(nèi)存緩存是一樣的。區(qū)別是每個硬盤緩存對象YYDiskCache,它是由單例持有的,不需要我們?nèi)?dān)心對象是否被銷毀。不用每次都去創(chuàng)建yydiskcache對象。yydiskCache對象初始化的時候開啟循環(huán)調(diào)用,每隔一段時間去檢查緩存,如果當(dāng)前時間減去ageLimit后大于存的時間,就要去清除掉。那么如果我們設(shè)置硬盤緩存10分鐘過期,就應(yīng)該是 diskCache.ageLimit = 600

555.png

removeItemsEarlierThanTime: 方法內(nèi)部,是通過下面的sql來去查找過期文件的


444.png

硬盤緩存,每次更新操作過數(shù)據(jù)后,表內(nèi)的last_access_time字段存的是通過time(NULL)獲取的當(dāng)前時間戳。

寫在最后

個人不建議對內(nèi)存緩存設(shè)置這個ageLimit。因為每次獲取數(shù)據(jù)的時候,都會更新緩存的時間。比如你剛剛存了一個對象,設(shè)置了10分鐘緩存時效,當(dāng)你第9分鐘的時候去獲取使用了該緩存,這個緩存就立馬被更新了,要到下個10分鐘后才會過期。如果要控制一個緩存的時間,最好自己單獨(dú)實現(xiàn)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從 YYCache 源碼 Get 到如何設(shè)計一個優(yōu)秀的緩存 來源:Lision 前言 iOS 開發(fā)中總會用到各種緩...
    今天lgw閱讀 6,258評論 1 22
  • 今天開始分析YYCache 包含的文件類 YYCache YYMemoryCache YYDiskCache YY...
    充滿活力的早晨閱讀 902評論 4 1
  • 第一章:低語 當(dāng)我第一次看到那些東西時,我以為我是當(dāng)晚喝的龍舌蘭有點(diǎn)多造成的眼花,但走近距離后,我發(fā)現(xiàn)那些東西并不...
    賓夕法尼亞閱讀 372評論 1 1
  • 出了小區(qū)走不幾步,前面就是十字路口?,F(xiàn)在正是上下班的高峰,紅燈剛亮一會,路口就等滿了行人車輛。不管在哪個路口,總有...
    善下歸海閱讀 334評論 5 8
  • 被月光漂白的門檻 祖母在里面喊我 我卻怎么也聽不清 古舊的風(fēng)吹個不停 夏天比冬天還要寒冷 鄉(xiāng)村被擋在外面 瘦弱的麥...
    渭北刀客閱讀 239評論 0 2

友情鏈接更多精彩內(nèi)容