YYKit-YYCache源码分析

2019-05-31  本文已影响0人  狗不理火锅

YYKit-YYCache源码分析

YYCache是一个高性能iOS缓存框架,是YYKit组件之一。

框架架构

YYCache API详解

YYMemeryCache

YYMemeryCache的缓存淘汰算法

LRU(least-recently-used) 最近最少使用算法

YYMemeryCache中LRU算法的具体实现:

在YYMemeryCache中LRU采用双向链表的方式实现,把添加或者使用的数据插入到链表最前面,删除数据是从链表最后面删除内存缓存。双向链表通过 _YYLinkedMapNode_YYLinkedMapNode来实现

YYMemeryCache缓存清理策略:

YYMemeryCache:监听UIApplicationDidReceiveMemoryWarningNotificationUIApplicationDidEnterBackgroundNotification两个通知,当收到通知时,删除所有内存缓存。

YYDiskCache

YYDiskCache是一个线程安全的磁盘缓存,它存储由SQLite支持的键值对和文件系统存储(类似于NSURLCache的磁盘缓存。

YYDiskCahce存储的具体实现是通过YYKVStroage来实现,在YYKVStorage有个枚举YYKVStorageType,这个是设置存储类型

typedef NS_ENUM(NSUInteger, YYKVStorageType) {
    
    /// 缓存数据value仅仅存储在文件系统
    YYKVStorageTypeFile = 0,
    
    /// 缓存数据value仅仅存储在sqlite中
    YYKVStorageTypeSQLite = 1,
    
    /// 根据缓存数据value大小存储在文件系统并且存储在sqlite中
    YYKVStorageTypeMixed = 2,
};

接下来,看下YYDiskCahce的初始化的方法,我们可以在里面看见存储类型的设置和其他方法的调用

- (instancetype)initWithPath:(NSString *)path {
    return [self initWithPath:path inlineThreshold:1024 * 20]; // 20KB
}

- (instancetype)initWithPath:(NSString *)path
             inlineThreshold:(NSUInteger)threshold {
    self = [super init];
    if (!self) return nil;
    
    YYDiskCache *globalCache = _YYDiskCacheGetGlobal(path);
    if (globalCache) return globalCache;
    
    YYKVStorageType type;
    if (threshold == 0) {
        type = YYKVStorageTypeFile;
    } else if (threshold == NSUIntegerMax) {
        type = YYKVStorageTypeSQLite;
    } else {
        type = YYKVStorageTypeMixed;
    }
    
    YYKVStorage *kv = [[YYKVStorage alloc] initWithPath:path type:type];
    if (!kv) return nil;
    
    _kv = kv;
    _path = path;
    _lock = dispatch_semaphore_create(1);
    _queue = dispatch_queue_create("com.ibireme.cache.disk", DISPATCH_QUEUE_CONCURRENT);
    _inlineThreshold = threshold;
    _countLimit = NSUIntegerMax;
    _costLimit = NSUIntegerMax;
    _ageLimit = DBL_MAX;
    _freeDiskSpaceLimit = 0;
    _autoTrimInterval = 60;
    
    [self _trimRecursively];
    _YYDiskCacheSetGlobal(self);
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_appWillBeTerminated) name:UIApplicationWillTerminateNotification object:nil];
    return self;
}

通过上面看到YYDiskCache是通过threshold(阈值)的大小来设置存储类型,threshold的默认值是1024 * 20,大小也就是20KB.为什么选择20KB?因为作者测试时,得到当单条数小于20k时,数据越小SQLite读取性能越高;单条数据大于20K时,直接写为文件速度会更快一些。

在YYDiskCache的存储中,YYKVStorage使用YYKVStorageItem存储键值对和元数据

@interface YYKVStorageItem : NSObject
@property (nonatomic, strong) NSString *key;                /// 键
@property (nonatomic, strong) NSData *value;                ///  值
@property (nullable, nonatomic, strong) NSString *filename; /// 文件名称
@property (nonatomic) int size;                             /// 大小
@property (nonatomic) int modTime;                          /// 修改时间戳
@property (nonatomic) int accessTime;                       /// 最后访问时间
@property (nullable, nonatomic, strong) NSData *extendedData; /// 扩展数据 存储对象之前设置
@end

YYDiskCache读写

YYCache提高高性能缓存的框架的其他操作

上一篇下一篇

猜你喜欢

热点阅读