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)前時間戳。