关于YYCache的缓存过期时间的设置问题

YYCache有多优秀,我就不多介绍了,关于它源码的分析网上一搜一大堆。

今天来聊一下YYCache里的ageLimit.因为我已经被这个属性坑了两次……

缓存超时时间设置,分为设置内存缓存超时时间和硬盘缓存超时时间

内存缓存过期时间

原理是:memoryCache初始化的时候,就开启了一个循环调用,每隔一段时间去检查缓存是否过期,是否超过限制等。
关于ageLimit。开始调用_trimToAge的时候,从链表尾部开始比较,如果过期就删掉,然后继续进行比较……。

这里要注意的是超时时间ageLimit的属性设置。因为源码内部,每次更新操作后,存的_now对应的时间是CACurrentMediaTime(),代码内部判断过期不过期是通过: 当前时间(CACurrentMediaTime()计算得到)- 链表元素记录的时间差值 与 ageLimit进行比较。那么我们设置10分钟缓存,应该这样设置: diskCache.ageLimit = 600;

硬盘缓存过期时间

原理和内存缓存是一样的。区别是每个硬盘缓存对象YYDiskCache,它是由单例持有的,不需要我们去担心对象是否被销毁。不用每次都去创建yydiskcache对象。yydiskCache对象初始化的时候开启循环调用,每隔一段时间去检查缓存,如果当前时间减去ageLimit后大于存的时间,就要去清除掉。那么如果我们设置硬盘缓存10分钟过期,就应该是 diskCache.ageLimit = 600

555.png

removeItemsEarlierThanTime: 方法内部,是通过下面的sql来去查找过期文件的


444.png

硬盘缓存,每次更新操作过数据后,表内的last_access_time字段存的是通过time(NULL)获取的当前时间戳。

写在最后

个人不建议对内存缓存设置这个ageLimit。因为每次获取数据的时候,都会更新缓存的时间。比如你刚刚存了一个对象,设置了10分钟缓存时效,当你第9分钟的时候去获取使用了该缓存,这个缓存就立马被更新了,要到下个10分钟后才会过期。如果要控制一个缓存的时间,最好自己单独实现。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从 YYCache 源码 Get 到如何设计一个优秀的缓存 来源:Lision 前言 iOS 开发中总会用到各种缓...
    今天lgw阅读 6,084评论 1 22
  • 今天开始分析YYCache 包含的文件类 YYCache YYMemoryCache YYDiskCache YY...
    充满活力的早晨阅读 815评论 4 1
  • 第一章:低语 当我第一次看到那些东西时,我以为我是当晚喝的龙舌兰有点多造成的眼花,但走近距离后,我发现那些东西并不...
    宾夕法尼亚阅读 337评论 1 1
  • 出了小区走不几步,前面就是十字路口。现在正是上下班的高峰,红灯刚亮一会,路口就等满了行人车辆。不管在哪个路口,总有...
    善下归海阅读 306评论 5 8
  • 被月光漂白的门槛 祖母在里面喊我 我却怎么也听不清 古旧的风吹个不停 夏天比冬天还要寒冷 乡村被挡在外面 瘦弱的麦...
    渭北刀客阅读 228评论 0 2