根据 LRU 淘汰规则,LRU 存储提供两种存储方法。
内存缓存(APLRUMemoryCache):提供内存 LRU 淘汰算法的缓存,缓存 ID 对象。APLRUMemoryCache 是线程安全的,同时 LRU 算法基于链表实现,效率较高。
磁盘缓存(APLRUDiskCache):提供持久化到数据库的 LRU 淘汰算法缓存,缓存支持 NSCoding 的对象。使用数据库相比文件会更容易维护,也使磁盘更整洁。
内存缓存
@property (nonatomic, assign) BOOL handleMemoryWarning; // default NO
设置是否处理系统内存警告,默认为 NO。如果设置为 YES,当有内存警告时会清空缓存。
(id)initWithCapacity:(NSInteger)capacity;
初始化,指定容量。
(void)setObject:(id)object forKey:(NSString*)key;
将对象存入缓存,如果 object 为 nil,会删除对象。
(void)setObject:(id)object forKey:(NSString*)key expire:(NSTimeInterval)expire;
将对象存入缓存,并指定一个过期时间戳。
(id)objectForKey:(NSString*)key;
取对象。
(void)removeObjectForKey:(NSString*)key;
删除对象。
(void)removeAllObjects;
删除所有对象。
(void)addObjects:(NSDictionary*)objects;
批量添加数据,无法单独设置每个对象的 expire 时间,默认都是永不过期的对象。
(void)removeObjectsWithRegex:(NSString*)regex;
批量删除数据,数据的 key 匹配 regex 的正则表达式。
(void)removeObjectsWithPrefix:(NSString*)prefix;
批量删除具有某个前缀的所有数据。
(void)removeObjectsWithSuffix:(NSString*)suffix;
批量删除具有某个后缀的所有数据。
(void)removeObjectsWithKeys:(NSSet*)keys;
批量删除所有 keys 指定的数据。
(NSArray*)peekObjects:(NSInteger)count fromHead:(BOOL)fromHead;
将缓存对象读取到一个数组里,但不做 LRU 缓存策略处理。fromHead 为 YES 时,从头开始遍历,否则对尾开始遍历。
(BOOL)objectExistsForKey:(NSString*)key;
快速判断某个 key 的对象是否存在,不会影响 LRU。
(void)resetCapacity:(NSInteger)capacity;
更新容量,如果新容量比原先的小,会删除部分缓存。
磁盘缓存
(id)initWithName:(NSString*)name capacity:(NSInteger)capacity userDependent:(BOOL)userDependent crypted:(BOOL)crypted;
创建一个持久化的 LRU 缓存,存入的对象需要支持 NSCoding 协议。
参数如下表:
参数
说明
name
缓存的名字,用做数据库的表名。
capacity
容量,实际容量会比这个大一些,解决缓存满时添加数据的性能问题。
userDependent
是否与用户相关,如果与用户相关,当
APDataCenter.currentUserId
为空时缓存无法操作;当切换用户后,缓存会自动指向当前用户的表,业务无须关心这个事件。crypted
数据是否加密。
返回值:缓存实例,业务需要持有。
(void)setObject:(id)object forKey:(NSString*)key;
缓存一个对象,expire 默认为 0,也就是永不过期。
(void)setObject:(id)object forKey:(NSString*)key expire:(NSTimeInterval)expire;
缓存一个对象,并指定过期的时间戳。
参数如下表:
参数
说明
object
对象,如果为 nil 会删除指定 key 的对象。
key
-
expire
过期时间戳,指定一个相对于 1970 的绝对时间戳。可以使用 [date timeIntervalSince1970]。
(id)objectForKey:(NSString*)key;
取对象,如果对象读取出来时,指定的 expire 时间戳已经达到,会返回 nil,并删除对象。如果调用 objectForKey 前,有其它 setObject 操作写数据库未完成,会等待。
(void)removeObjectForKey:(NSString*)key;
删除对象。
(void)removeAllObjects;
删除所有对象。
(void)addObjects:(NSDictionary*)objects;
批量添加数据。
(void)removeObjectsWithSqlLike:(NSString*)like;
批量删除数据,数据的 key 使用 sqlite 的 like 语句匹配。
(void)removeObjectsWithKeys:(NSSet*)keys;
批量删除所有 keys 指定的数据。