LRU 存储

根据 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 指定的数据。