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