全部产品
云市场

LRU 存储

更新时间:2019-09-09 15:08:00

根据 LRU 淘汰规则,LRU 存储提供两种存储方法:

  • 内存缓存(APLRUMemoryCache): 提供内存 LRU 淘汰算法的缓存,缓存 id 对象。APLRUMemoryCache 是线程安全的,同时 LRU 算法基于链表实现,效率较高。
  • 磁盘缓存(APLRUDiskCache): 提供持久化到数据库的 LRU 淘汰算法缓存,缓存支持 NSCoding 的对象。使用数据库相比文件会更容易维护,也使磁盘更整洁。

内存缓存

  • @property (nonatomic, assign) BOOL handleMemoryWarning; // default NO

    1. 设置是否处理系统内存警告,默认为 NO。如果设置为 YES,当有内存警告时会清空缓存。
  • (id)initWithCapacity:(NSInteger)capacity;

    1. 初始化,指定容量
  • (void)setObject:(id)object forKey:(NSString*)key;

    1. 将对象存入缓存,如果 object nil,会删除对象
  • (void)setObject:(id)object forKey:(NSString*)key expire:(NSTimeInterval)expire;

    1. 将对象存入缓存,并指定一个过期时间戳
  • (id)objectForKey:(NSString*)key;

    1. 取对象
  • (void)removeObjectForKey:(NSString*)key;

    1. 删除对象
  • (void)removeAllObjects;

    1. 删除所有对象
  • (void)addObjects:(NSDictionary*)objects;

    1. 批量添加数据,无法单独设置每个对象的 expire 时间,默认都是永不过期的对象。
  • (void)removeObjectsWithRegex:(NSString*)regex;

    1. 批量删除数据,数据的 key 匹配 regex 的正则表达式。
  • (void)removeObjectsWithPrefix:(NSString*)prefix;

    1. 批量删除具有某个前缀的所有数据
  • (void)removeObjectsWithSuffix:(NSString*)suffix;

    1. 批量删除具有某个后缀的所有数据
  • (void)removeObjectsWithKeys:(NSSet*)keys;

    1. 批量删除所有 keys 指定的数据
  • (NSArray*)peekObjects:(NSInteger)count fromHead:(BOOL)fromHead;

    1. 将缓存对象读取到一个数组里,但不做 LRU 缓存策略处理。fromHead YES 时,从头开始遍历,否则对尾开始遍历。
  • (BOOL)objectExistsForKey:(NSString*)key;

    1. 快速判断某个 key 的对象是否存在,不会影响 LRU
  • (void)resetCapacity:(NSInteger)capacity;

    1. 更新容量,如果新容量比原先的小,会删除部分缓存。

磁盘缓存

  • (id)initWithName:(NSString*)name capacity:(NSInteger)capacity userDependent:(BOOL)userDependent crypted:(BOOL)crypted;

    1. 创建一个持久化的 LRU 缓存,存入的对象需要支持 NSCoding 协议。
    2. * @param name 缓存的名字,用做数据库的表名
    3. * @param capacity 容量,实际容量会比这个大一些,解决缓存满时添加数据的性能问题
    4. * @param userDependent 是否与用户相关,如果与用户相关,当 APDataCenter.currentUserId 为空时缓存无法操作;
    5. 当切换用户后,缓存会自动指向当前用户的表,业务无须关心这个事件。
    6. * @param crypted 数据是否加密
    7. * @return 缓存实例,业务需要持有
  • (void)setObject:(id)object forKey:(NSString*)key;

    1. 缓存一个对象,expire 默认为 0,也就是永不过期
  • (void)setObject:(id)object forKey:(NSString*)key expire:(NSTimeInterval)expire;

    1. 缓存一个对象,并指定过期的时间戳
    2. * @param object 对象,如果为 nil 会删除指定 key 的对象
    3. * @param key key
    4. * @param expire 过期时间戳,指定一个相对于 1970 的绝对时间戳。可以使用[date timeIntervalSince1970]。
  • (id)objectForKey:(NSString*)key;

    1. 取对象,如果对象读取出来时,指定的 expire 时间戳已经达到,会返回 nil,并删除对象。如果调用 objectForKey 前,有其它 setObject 操作写数据库未完成,会等待。
  • (void)removeObjectForKey:(NSString*)key;

    1. 删除对象
  • (void)removeAllObjects;

    1. 删除所有对象
  • (void)addObjects:(NSDictionary*)objects;

    1. 批量添加数据
  • (void)removeObjectsWithSqlLike:(NSString*)like;

    1. 批量删除数据,数据的 key 使用 sqlite like 语句匹配
  • (void)removeObjectsWithKeys:(NSSet*)keys;

    1. 批量删除所有 keys 指定的数据