zoukankan      html  css  js  c++  java
  • iOS数据缓存及YYCache的实现分析

    1. 什么是cache

    cache就是缓存的意思.

    计算机上的cache就是高速缓存,计算机组成课程里的定义是,存在于主存和CPU之间,主要用于解决CPU处理数据的速度远远大于读取主存数据的速度.

    手机上也有cache,主要作用是保存一些软件生成的临时文件,避免每次都要重复地向服务器请求相同的数据,既浪费用户流量,也影响APP响应速度.

    2. 缓存的实现

    手机缓存一般有两种方式,内存缓存和硬盘缓存.

    客户端每次请求数据,首先检测内存缓存是否有数据,若没有则检测硬盘,还是没有才请求服务器.

    请求数据成功后,把数据存入内存和硬盘中.

    看起来很容易,不过实现起来就需要考虑一些策略:

          1.和以前学习cache时遇到的问题一样,内存是有限的,清空内存时采用什么算法

          2.硬盘缓存有两种方式,一种存文件中,一种存数据库中,怎么实现效率才高

    3. 各种缓存库

    现在的缓存库很多,官方自带的NSCache

    比较常见的开源缓存库SDWebImage、FastImageCache

    比较常见的闭源缓存库NSURLCache、Facebook的FBDiskCache

    这里有YYCache作者对于各种缓存库的评测,和以上缓存库的实现思路,很值得学习:

    http://blog.ibireme.com/2015/10/26/yycache

    4. YYCache的实现

    YYCache代码清晰,注释详细,很值得学习思考.

    1. 内存缓存(YYMemoryCache)

    存储的单元是_YYLinkedMapNode,除了key和value外,还存储了它的前后Node的地址_prev,_next.

    整个实现基于_YYLinkedMap,它是一个双向链表,除了存储了字典_dic外,还存储了头结点和尾节点.它实现的功能很简单,就是:有新数据了插入链表头部,访问过的数据结点移到头部,内存紧张时把尾部的结点移除.就这样实现了淘汰算法.

    因为内存访问速度很快,锁占用的时间少,所以用的速度最快的OSSpinLockLock

    2. 硬盘缓存(YYDiskCache)

    采用的是文件和数据库相互配合的方式.

    有一个参数inlineThreshold,默认20KB,小于它存数据库,大于它存文件.能获得效率的提高.

    key:path,value:cache存储在NSMapTable里.根据path获得cache,进行一系列的set,get,remove操作

    更底层的是YYKVStorage,它能直接对sqlite和文件系统进行读写.

    每次内存超过限制时,select key, filename, size from manifest order by last_access_time desc limit ?1

    会根据时间排序来删除最近不常用的数据.

    硬盘访问的时间比较长,如果用OSSpinLockLock锁会造成CPU消耗过大,所以用的dispatch_semaphore_wait来做.

    我把整个源码仔细地学习了下,大致思路是懂了,有些细节的处理的小技巧很赞,不过还有些地方感觉理解有问题,如果大家有兴趣的话也去学习下吧,一起继续学习交流.

  • 相关阅读:
    解决了Excel的一个貌似很奇怪的问题~~~
    关闭子页面,刷新父页面
    动态控制DataGrid中的TextBox的状态及输入值!!
    C#对Oracle BLOB字段的写入读取方法
    谈恋爱,好累...
    可移植,可扩展高效Proactor模式
    When are asynchronous file writes not asynchronous...
    [转]How to support 10,000 or more concurrent TCP connections
    [转]Creating a forwarding dll
    [转]非金钱激励员工的108种手段
  • 原文地址:https://www.cnblogs.com/stevenfukua/p/5102817.html
Copyright © 2011-2022 走看看