Scut 的缓存管理看起来还是蛮复杂的。

    redis 本身就有内存缓存+持久化的作用,Scut还是自己封装了一层内存缓存+Redis缓存+持久化。

这是一个缩略版本的结构图。

1. 上半部分是通用的缓存池结构,用来存放各类缓存数据。

  第一层Dictionary是按大类区分:Entity_{0}、Personal_(0),type.name 等;

    第二层Dictionary则是进一步细分,比如同样一个type下的 type.name +"UserID";

2. 下半部分则是应用层对缓存的操作器,包含数据取用+操作方法,应用层数据结构要按照一定的规则进行封装,才能直接使用Scut提供的“带数据修改事件”的各类组件。

CacheItemSet 的作用:

Cache 们都会用 CacheItemSet 容器 来装载具体的数据;

        private readonly CacheType _cacheItemType;  //标记了缓存的类型,不同类型的缓存在从redis加载时key的组装方式,释放缓存的规则都不相同
private readonly bool _isReadOnly;
private CachePeriod _period;          //缓存的核心:生命周期       
private IDataExpired _itemData; //具体的数据
     public bool HasChanged { get; private set; }

生命周期如何起作用?HasChanged 如何起作用?

在 CachePool 里的 DisposeCache 接口有统一处理,但没有发现哪里在定期有效调用?

ShareCacheStruct:

        public IEnumerable<T> Take()
{
return DataContainer.ToEntityEnumerable(false);
}
        public IEnumerable<T> ToEntityEnumerable(bool isLoad = false)
{
if (isLoad) CheckLoad();
return Container.GetEnumerable().Select(pari => pari.Value).OfType<CacheItemSet>().Select(itemSet => (T)itemSet.GetItem());
}

可以知道 ShareCache 从缓存加载数据时,是整块相应类型的数据全部加载出来,适合用来管理配置、处理公有数据。

PersonalCache:

        public IEnumerable<T> Take()
{
return DataContainer.ToGroupEnumerable();
} public T Take(params object[] keys)
{
string key = AbstractEntity.CreateKeyCode(keys);
return DataContainer.TakeEntityFromKey(key);
}

它可以单个或整体进行缓存加载,更适合处理单用户的某类型数据。

ShareEntity 比 BaseEntity 多了一个 API:GetIdentityId() 未来有什么作用再观察。

AbstractEntity:

        /// <summary>
/// 存储改变的属性集合
/// </summary>
private ConcurrentQueue<string> _changePropertys = new ConcurrentQueue<string>();
/// <summary>
/// 等待更新属性
/// </summary>
private readonly HashSet<string> _waitUpdateList = new HashSet<string>();

这两个属性,表示 abstracEntity 最重要的作用应该是“部分更新修改过的数据”

持续追踪,发现其作用是向数据库写入修改过的数据:

SqlDataSender.cs:

        public bool Send<T>(params T[] dataList) where T : AbstractEntity
{
return Send(dataList, GetPropertyValue, GetPostColumns);
}

那什么时候进行写入修改数据? AbstractEntity 下的 EntityChangeEvent : IItemChangeEvent 是如何起作用的?

IItemChangeEvent:

        [JsonIgnore]
public bool IsExpired { get; set; } [JsonIgnore]
public bool IsInCache { get; set; } /// <summary>
/// 是否有变更
/// </summary>
public abstract bool HasChanged { get; } /// <summary>
/// 绑定实体类的属性名(表的列名)
/// </summary>
internal abstract string PropertyName { get; set; } /// <summary>
/// 当前对象变更事件对象
/// </summary>
public abstract CacheItemChangeEvent ItemEvent { get; } /// <summary>
/// 当前对象的子类变更事件对象
/// </summary>
public abstract CacheItemChangeEvent ChildrenEvent { get; }

在 AbstractEntity 中,对本身数值进行“修改、删除进行封装的API”,都会调用事件通知 Notify。

AbstractEntity 重载的 Notify API:

        protected override void Notify(object sender, CacheItemEventArgs eventArgs)
{
if (_isReadOnly || CheckChnage()) return;
_hasChanged = true;
AddChangePropertys(eventArgs.PropertyName);
PutToChangeKeys(this);
}
        private void PutToChangeKeys(AbstractEntity entity)
{
if (!IsModifying)
{
//Auto trigger modify event
ProfileManager.ChangeEntityByAutoOfMessageQueueTimes(entity.GetType().FullName, entity.GetKeyCode());
DataSyncQueueManager.Send(entity);
}
}

可以看出这个位置并没有真正使用  EntityChangeEvent 机制,而是重写了 Notity(),在修改数据后,直接向底层队列压入修改队列。

Scut:缓存管理的更多相关文章

  1. HTML5 离线缓存管理库

    一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionsto ...

  2. Spring自定义缓存管理及配置Ehcache缓存

    spring自带缓存.自建缓存管理器等都可解决项目部分性能问题.结合Ehcache后性能更优,使用也比较简单. 在进行Ehcache学习之前,最好对Spring自带的缓存管理有一个总体的认识. 这篇文 ...

  3. 基于吉日嘎拉的通用权限管理WebForm版扩展:字典选项管理和缓存管理

    关于字典管理,其实就是2个表,一个表记录字典和对应表,另一个表记录字典内容.我这里改名为字典选项,其实是一个意思.直接上图: 这里的字典选项是分子系统的,每个子系统可以有自己的单独字典,方便管理.但是 ...

  4. [js开源组件开发]localStorage-cache本地存储的缓存管理

    localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 ...

  5. Magicodes.WeiChat——缓存管理

    本框架支持缓存管理,内部机制使用开源库CacheManager.支持全局缓存.租户缓存,默认使用的系统缓存实现,可以在Web.config将其配置为其他缓存类型,比如支持Redis.内存等. 开源库地 ...

  6. c# web 缓存管理

    using System; using System.Collections; using System.Text.RegularExpressions; using System.Web; usin ...

  7. Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理

    上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...

  8. 【web性能】 JS、CSS的合并、压缩、缓存管理

    本篇文章主要讨论下目前JS,CSS 合并.压缩.缓存管理存在的一些问题,然后分享下自己项目中用到的1个处理方案,并提供1个实例下载.   存在的问题: 合并.压缩文件主要有2方面的问题: 1. 每次发 ...

  9. 01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理

    http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionF ...

随机推荐

  1. (转)【C++ STL】细数C++ STL 的那些事 -- priority_queue(优先队列)

    装载自http://blog.csdn.net/tianshuai1111/article/details/7652553 一,概述 priority_queue是拥有权值观念的queue,它允许加入 ...

  2. MySQL的InnoDB表如何设计主键索引-转自淘宝MySQL经典案例

    创建a表 id主键 CREATE TABLE `a` (`id` bigint(20) NOT NULL AUTO_INCREMENT ,`message_id` int(11) NOT NULL,` ...

  3. PL/SQL Developer 与tnsnames.ora

    PL/SQL Developer 是一款流行的oracle开发与管理的IDE. 在登录PL/SQL Developer时所选择的数据库依赖于tnsnames.ora文件中的信息. 如果我们安装了多个o ...

  4. Hibernate二 映射 注解 一级缓存

    Hibernate映射1.@Entity 被该注解修饰的POJO类是一个实体,可以用name属性指定该实体类的名称,系统默认以该类的类名作为实体类的名称.2.@Table 指定持久化类所映射的表,它的 ...

  5. Struts2.xml中result type属性说明

    在struts2配置XML里,result中type属性有以下几种: 1.dispatcher:服务器跳转到前台,后面跟着可以是JSP.htm等等前台页面,默认是这种. 2.redirect:客户端跳 ...

  6. iOS 开发 入门:使用Ad Hoc 进行用户测试

    在完成iOS开发,准备进行发布之前,我们都希望App能在周围的朋友之间先进行测 试,提提意见,修改完善之后再发布到App Store上.Apple考虑到这一点,因此通过Ad Hoc来实现发布前的用户测 ...

  7. __block的作用

    __block 的标记告诉编译器,这个变量在 block 里面需要做特殊处理. 一般来说,在 block 中用的变量值是被复制过来的,所以对于变量本身的修改并不会影响这个变量的真实值.而当我们用 __ ...

  8. autoIT 自动化上传/下载文件图文详解【python selenium】

    情景: 在用selenium进行web页面自动化时,时不时会遇到上传附件的情况,常见的情况就是一个上传按钮,点击后弹出windows窗口,选择文件后上传,如下图1所示 图1 这种情况超出了seleni ...

  9. iOS仿喜马拉雅FM做的毕业设计及总结(含新手福利源码)

    其实仿喜马拉雅FM很早就开始了,从我刚接触iOS开始,就开始仿做了一部分,眼尖的人都从我的github找到了那个项目.随着找到实习iOS工作,仿写就落下了,但唯一的收获就是给过去打了一个响亮的耳光,因 ...

  10. 自定义控件(视图)2期笔记08:自定义控件之 9patch图说明

    1. 何为 9patch图 ?     它是一个对png图片做处理的一个工具,能够为我们生成一个"*.9.png"的图片:所谓"*.9.png"这是Androi ...