YYCache有多优秀,我就不多介绍了,关于它源码的分析网上一搜一大堆。
今天来聊一下YYCache里的ageLimit.因为我已经被这个属性坑了两次……
缓存超时时间设置,分为设置内存缓存超时时间和硬盘缓存超时时间
内存缓存过期时间
原理是:memoryCache初始化的时候,就开启了一个循环调用,每隔一段时间去检查缓存是否过期,是否超过限制等。
关于ageLimit。开始调用_trimToAge的时候,从链表尾部开始比较,如果过期就删掉,然后继续进行比较……。
这里要注意的是超时时间ageLimit的属性设置。因为源码内部,每次更新操作后,存的_now对应的时间是CACurrentMediaTime(),代码内部判断过期不过期是通过: 当前时间(CACurrentMediaTime()计算得到)- 链表元素记录的时间差值 与 ageLimit进行比较。那么我们设置10分钟缓存,应该这样设置: diskCache.ageLimit = 600;
硬盘缓存过期时间
原理和内存缓存是一样的。区别是每个硬盘缓存对象YYDiskCache,它是由单例持有的,不需要我们去担心对象是否被销毁。不用每次都去创建yydiskcache对象。yydiskCache对象初始化的时候开启循环调用,每隔一段时间去检查缓存,如果当前时间减去ageLimit后大于存的时间,就要去清除掉。那么如果我们设置硬盘缓存10分钟过期,就应该是 diskCache.ageLimit = 600
removeItemsEarlierThanTime: 方法内部,是通过下面的sql来去查找过期文件的
硬盘缓存,每次更新操作过数据后,表内的last_access_time字段存的是通过time(NULL)获取的当前时间戳。