实现对象缓存框架三、ZSYCacheQueue

ZSYCacheQueue作为一种实现队列存储对象的缓存方式。

  • ZSYCache依赖一个ZSYCacheHolder对象
  • ZSYCacheQueue创建对象时,使用ZSYCache对象持有的ZSYCacheHolder对象,完成对象持久化
  • 操作1: 将对象入队
  • 操作2: 将对象出队
  • ZSYCacheQueue对象.keysQueue: 这个数组保存依次入队的对象对应的key
  • ZSYCacheQueue对象.offSet:  这个属性是总便宜量

具体逻辑步骤:

  1. 传入一个缓存项【对象、key、超时时间间隔】
  2. 将【对象】和【超时时间间隔】包装成一个【ZSYCacheObject对象】
  3. 使用【ZSYCacheHolder对象】按照【key】保存这个【ZSYCacheObejct对象】-- 【ZSYCacheObejct对象用一个字典保存,并没有顺序】
  4. 检测当前keys队列是否满,如果满进行出队操作
  5. 将最新入队的key入keysQueue尾部

总结:

  1. keysQueue按队列顺序保存入队对象的key,而对象被封住成ZSYCacheObect,被ZSYCacheHolder对象使用字典保存。

  2. 找到这个原始对象,首先去keysQueue找到key,然后通过ZSYCacheHolder对象使用key去【字典对象】查询到ZSYCacheObject对象,再通过ZSYCacheObject的方法得到原始缓存对象。

开始贴代码:

//.h 

#import <Foundation/Foundation.h>

@class ZSYCacheHolder;

@interface ZSYCacheQueue : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger size;
@property (nonatomic, strong, readonly) NSMutableArray *keysQueue;

@property (nonatomic, copy) void (^onPop)(id popedObject);
@property (nonatomic, copy) void (^onExpirate)(id popedObject);

- (instancetype)initWithHolder:(ZSYCacheHolder *)holder;

//key入队
- (void)zsyPushObj:(id)obj;

//对象出队
- (id)zsyPopObj;

@end
//.m 

//init时候,使用ZSYCache对象的ZSYCacheHolder完成后续的持久化对象操作

- (instancetype)initWithHolder:(ZSYCacheHolder *)holder {
    self = [super init];
    if (self) {
        _holder = holder;
        _size = ZSYCACHE_DEFAULT_QUEUE_SIZE;
        _offset = 0;
        _keysQueue = [NSMutableArray array];
    }
    return self;
}
// 将要缓存的对象入队

- (void)zsyPushObj:(id)obj {

    //偏移量++
    self.offset++;

    //检测超时的缓存对象,一旦超时,从缓存队列删除对应的key,本地NSData文件
    [self _cleanExpirateObjects];

    //得到缓存对象在队列的对应的唯一key
    NSString *key = [NSString stringWithFormat:@"QUEUE_%@_%ld", self.name, self.offset];

    //使用唯一的key , 作为对象入队列的标识
    [_holder zsySetObject:obj ForKey:key Duration:0];

    //如果此时队列已经满,将队列头部对象出队列
    if (_keysQueue.count >= _size) {

        //找到key队列头部的key
        NSString *popKey = _keysQueue.firstObject;

        //找到key对应的ZSYCacheObject
        ZSYCacheObject *cachedObject = [_holder zsyGetObjectForKey:key];

        //执行对象在出队时的回调Block
        if (_onPop) {
            _onPop([cachedObject cacheObjectValue]);
        }

        //使用ZSYCacheHolder对象,删除本地缓存对象文件
        [_holder zsyRemoveObjectForKey:popKey];//本地移除

        //将当前队列头部的key,从key数组删除
        [_keysQueue removeObject:popKey];//内存key数组移除
    }

    //入队当前最新缓存对象的key
    [_keysQueue addObject:key];
}
时间: 2024-10-09 15:13:23

实现对象缓存框架三、ZSYCacheQueue的相关文章

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

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

实现对象缓存框架二、ZSYCache

ZSYCache作为给调用者暴露的主要Api方法,来实现对象的缓存. 思路: 1. 每一个ZSYCache对象,可以存在多个缓存队列.对个缓存池. 2. 每一个新创建的ZSYCache对象,他们的 缓存队列.缓存池,应该是互相独立. 3. 使用单例对象,应该提供默认的缓存队列.缓存池 4. 根据 名字--队列,名字--池, 保存多个队列.池 5. 在哪个时刻将内存队列.内存池的所有对象持久化到本地 6. 在哪个时刻将本地对象,恢复到内存队列.内存池 下面给出代码: //.h #import <F

数据库历险记(三) | 缓存框架的连环炮

文章首发于微信公众号「陈树义」,专注于 Java 技术分享的社区.点击链接扫描二维码,与500位小伙伴一起共同进步.微信公众号二维码 http://p3npq6ecr.bkt.clouddn.com/blog/chenshuyi_gongzhonghao_guide_full.jpg 最近在思考数据库以及缓存的问题,发现这些知识点其实是有一点关联的,于是这篇文章通过一个连环提问的方式将这些知识点串联起来. 问:为什么要用 Memcached.Redis,直接用 MySQL 这些数据库不好吗? 答

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缓存机制&amp;一个缓存框架推荐

1.先推荐一个轻量级缓存框架--ACache(ASimpleCache) ACache介绍: ACache类似于SharedPreferences,但是比SharedPreferences功能更加强大,SharedPreferences只能保存一些基本数据类型.Serializable.Bundle等数据, 而Acache可以缓存如下数据: 普通的字符串.JsonObject.JsonArray.Bitmap.Drawable.序列化的java对象,和 byte数据. 主要特色: 1:轻,轻到只

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&

Django—— 缓存框架

译者注:1.无用的,吹嘘的说辞不翻译:2.意译,很多地方不准确. 动态网站最为重要的一点就是好,网页是动态的.每一次用户请求页面,网站就要进行各种计算——从数据库查询,到render模板,到各种逻辑运算——生成页面所需的.这个过程是异常消耗资源的,远远比从硬盘读取一个文件然后显示出来的代价高昂. 对于大多数中小网站来说,这也许不是问题,因为他们的访问量不大,而对于大型网站而言,必须尽量减少不必要的服务器资源开支. 因此,有了缓存技术. 缓存就是把一些需要消耗很多资源的计算结果保存下来,当下次需要