根據 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 指定的數據。