实现对象缓存框架二、ZSYCache

  ZSYCache作为给调用者暴露的主要Api方法,来实现对象的缓存。

  思路:

    1. 每一个ZSYCache对象,可以存在多个缓存队列、对个缓存池。

    2. 每一个新创建的ZSYCache对象,他们的 缓存队列、缓存池,应该是互相独立。

    3. 使用单例对象,应该提供默认的缓存队列、缓存池

    4. 根据 名字--队列,名字--池, 保存多个队列、池

    5. 在哪个时刻将内存队列、内存池的所有对象持久化到本地

    6. 在哪个时刻将本地对象,恢复到内存队列、内存池

下面给出代码:

//.h
#import <Foundation/Foundation.h>
#import "ZSYCacheHolder.h"

@interface ZSYCache : NSObject

//ZSYCache名字
@property (nonatomic, copy , readonly) NSString *name;

//按key保存队列对象
@property (nonatomic, strong, readonly) NSMutableDictionary *queues;

//按key保存池对象
@property (nonatomic, strong, readonly) NSMutableDictionary *pools;

//依赖一个持久化工具对象
@property (nonatomic, strong, readonly) ZSYCacheHolder *holder;

+ (instancetype)sharedCache;

- (instancetype)initWithIdentifier:(NSString *)identifier;

//添加一个新的队列
- (void)addQueue:(NSString *)queueName Size:(NSInteger)size;

//添加一个新的池
- (void)addPool:(NSString *)poolName Size:(NSInteger)size;

//对象与队列的操作
- (void)zsyPushObject:(id)obj ToQueue:(NSString *)queueName;
- (id)zsyPopFromQueue:(NSString *)queueName;
- (NSArray *)objectsInQueue:(NSString *)queueName;

//获取当前ZSYCache对象在内存缓存的总大小
- (NSInteger)memorySize;

//对象的持久化
- (void)save;
- (void)load;

//对象的恢复
+ (void)save;
+ (void)load;

@end
//.m
//首先是init函数,初始化ZSYCache对象的参数

- (instancetype)initWithIdentifier:(NSString *)identifier {
    self = [super init];
    if (self) {
        _name = [identifier copy];

        //保存池的字典
        _pools = [NSMutableDictionary dictionary];

        //保存队列的字典
        _queues = [NSMutableDictionary dictionary];

        //保存设置的字典
        _options = [NSMutableDictionary dictionary];

        //依赖工具对象
        _holder = [[ZSYCacheHolder alloc] initWithIdentifier:_name];

        //添加默认的队列、池
        [self addQueue:nil Size:0];
        [self addPool:nil Size:0];
    }
    return self;
}
// 添加一个新的队列对象到ZSYCache对象

- (void)addQueue:(NSString *)queueName Size:(NSInteger)size  {
    if (!queueName || [queueName isEqualToString:@""]) {
        queueName = ZSYCACHE_DEFAULT_QUEUE_NAME;
    }
    if ([self.queues hasKey:queueName]) {
        return;
    }
    ZSYCacheQueue *queue = [[ZSYCacheQueue alloc] initWithHolder:_holder];
    queue.name  = queueName;
    if (size > 0) {
        queue.size = size;
    }

    [self.queues setObject:queue forKey:queueName];
}
//将对象缓存到队列

- (void)zsyPushObject:(id)obj ToQueue:(NSString *)queueName {
    if (!queueName || [queueName isEqualToString:@""]) {
        queueName = ZSYCACHE_DEFAULT_QUEUE_NAME;
    }
    ZSYCacheQueue *queue = self.queues[queueName];
    [queue zsyPushObj:obj];
}
//将缓存队列头部对象出队

- (id)zsyPopFromQueue:(NSString *)queueName {

    if (!queueName || [queueName isEqualToString:@""]) {
        queueName = ZSYCACHE_DEFAULT_QUEUE_NAME;
    }

    ZSYCacheQueue *queue = self.queues[queueName];
    id pop = [queue zsyPopObj];
    return pop;
}
//获取缓存队列中的所有缓存对象

- (NSArray *)objectsInQueue:(NSString *)queueName {

   if (!queueName || [queueName isEqualToString:@""]) {
        queueName = ZSYCACHE_DEFAULT_QUEUE_NAME;
    }

    ZSYCacheQueue *queue = self.queues[queueName];
    NSMutableArray *cacheList = [NSMutableArray array];

    //注意:ZSYCacheQueue只有key数组【每一个key找到缓存对象】,
    //每一个key对应一个 ZSYCacheObejct,并不是直接对应缓存对象
    for (int i = 0; i < [queue.keysQueue count]; i++) {
        NSString *key = queue.keysQueue[i];

        //通过key查找到 ZSYCacheObject的一个对象
        ZSYCacheObject *cacheObj = [_holder zsyGetObjectForKey:key];

        //从ZSYCacheObejct对象,获取到保存的原始对象
        if (cacheObj.cacheObjectValue) {
            [cacheList addObject:cacheObj.cacheObjectValue];
        }
    }
    return cacheList;
} 

其他的暂未实现,后续实现后再加上来。

时间: 2024-09-29 21:03:05

实现对象缓存框架二、ZSYCache的相关文章

实现对象缓存框架一、框架的大体架构

在github看了很久关于缓存的一些框架,也积累了一些基础,想自己试试写一写神秘的缓存框架. 首先,我们分析一下如何开始? 框架的大体架构是什么? 下面给出示意图: 那么框架结构出来了: 1. ZSYCache提供一些Api给调用者使用关于缓存的所有方法 2. ZSYCacheQueue.ZSYCachePool作为缓存数据的结构 3. ZSYCacheHolder持久化对象 4. ZSYCacheObject包装被持久化的对象相关附加属性: 保存对象的NSData.记录对象过期的时间 注:对象

实现对象缓存框架三、ZSYCacheQueue

ZSYCacheQueue作为一种实现队列存储对象的缓存方式. ZSYCache依赖一个ZSYCacheHolder对象 ZSYCacheQueue创建对象时,使用ZSYCache对象持有的ZSYCacheHolder对象,完成对象持久化 操作1: 将对象入队 操作2: 将对象出队 ZSYCacheQueue对象.keysQueue: 这个数组保存依次入队的对象对应的key ZSYCacheQueue对象.offSet:  这个属性是总便宜量 具体逻辑步骤: 传入一个缓存项[对象.key.超时时

android图片缓存框架Android-Universal-Image-Loader(二)

这篇打算直接告诉大家怎么用吧,其实这个也不是很难的框架,大致使用过程如下: // 获取缓存图片目录 File cacheDir = StorageUtils.getOwnCacheDirectory(activity, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( activity).memoryCacheExtraOptions(800, 76

ASimpleCache(ACache)源码分析(android轻量级开源缓存框架)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46379055 ASimpleCache框架源码链接 https://github.com/yangfuhai/ASimpleCache 杨神作品,大家最熟悉他的应该是afinal框架吧 官方介绍 ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简而来). 1.它可以缓存什么东西? 普通的字符串.JsonObj

Ehcache缓存框架具体解释

一.前言 ehcache是一个比較成熟的java缓存框架.它提供了用内存,磁盘文件存储.以及分布式存储方式等多种灵活的cache管理方案.ehcache最早从hibernate发展而来. 因为3.x的版本号和2.x的版本号API差异比較大.这里直接学习最新版本号的了,可是最后整合spring的时候还是有2.x. 二.安装 因为我的项目是使用maven管理的,因此仅仅要在pom文件里加入例如以下代码就可以. <dependency> <groupId>javax.cache</

android轻量级缓存框架ASimpleCache分析

框架地址 https://github.com/yangfuhai/ASimpleCache  此框架作者为大名鼎鼎的afinal作者 官方简介: ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简而来). (有个问题是作者所说的自动失效,其实是在获取数据时判断存入缓存的数据是否过期,如果过期,则删除数据缓存,返回null.当然,如果真正的自动删除,应该只能开启服务,不断判断是否过期来删除吧,也没有必要) ---------

Ehcache缓存框架详解

一.前言 ehcache是一个比较成熟的java缓存框架,它提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案.ehcache最早从hibernate发展而来.由于3.x的版本和2.x的版本API差异比较大.这里直接学习最新版本的了,但是最后整合spring的时候还是有2.x. 二.安装 由于我的项目是使用maven管理的,因此只要在pom文件中添加如下代码即可. <dependency> <groupId>javax.cache</groupId&

Android实战——RxJava2解锁图片三级缓存框架

RxJava2解锁图片三级缓存框架 本篇文章包括以下内容 前言 图片三级缓存的介绍 框架结构目录的介绍 构建项目整体框架 实现图片三级缓存 演示效果 源码下载 结语 前言 RxJava2作为如今那么主流的技术,不学习学习都不行了,本篇文章需要你有RxJava2的基础,如果需要对RxJava2学习的同学,可以关注我的博客,查看Android实战--RxJava2+Retrofit+RxBinding解锁各种新姿势 .项目代码实现模仿Picasso,大伙们可以看下最后的代码效果,那么废话不多说,He

ACache【轻量级的开源缓存框架】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 官方介绍 ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简而来). 1.它可以缓存什么东西? 普通的字符串.JsonObject.JsonArray.Bitmap.Drawable.序列化的java对象,和 byte数据. 2.它有什么特色? 特色主要是: 1:轻,轻到只有一个JAVA文件. 2:可配置,可以配置缓存路径,缓存大小,缓存数量等. 3:可以设置缓存超