本想给出类图的。建模工具不争气 总是死,所以就用文字描述吧。shiftone 是什么呢 ,是一个缓存框架 ,主要支持 fifo lru lfu策略,并提供 sysn stat miss cluster soft 等装饰,在reaper中 提供定期回收过期元素功能。
主要分为三层结构,最上层就是CacheConfiguration 它和config包提供服务, 将配置文件内容读成一颗文件树,并将书中factory的delegate通过BeanWrapper包中反射将其delegate属性Set到其中。CacheCongiguration 提供借口 供外界创建Cache ,我又在它上面添加了CacheManger。
中间层就是AbstractDecoratorCacheFactory AbstractPolicyCacheFactory AbstractPolicyCache ,最下层则是实现层,其中 decorator的***factory方法都继承了
AbstractDecoratorCacheFactory 方法除了cluster,因为cluster提供了集群同步服务,它是不可能被wrapper的,所以不需要继承。 而policy 的***factory 都继承了
AbstractPolicyCacheFactory。
主要应用的设计模式是decorator模式 ,CacheFactory,AbstractPolicyCacheFactory,AbstractDecoratorCacheFactory 都包含newInstance方法, AbstractDecoratorCacheFactory 中通过delegate 包含一个对CacheFactory的聚集,其下的decorator 是抽象类的实现, policy则是AbstractPolicyCacheFactory 实现,也是被包装的最内层对象。 reapableCache 接口继承了Cache接口 ,AbstractPolicyCache实现了reaperableCache接口的部分,***cache中则完全实现了reaperableCache。而
AbstractPolicyCacheFactory的newInstance方法返回一个被sysn包装的cache 所以当你运行测试用例的时候 发现 无论创建什么cache 都会被sysn装饰。softCache主要是提供对对象的弱引用,当系统内存不足的时候,缓存的空间可以被回收。 cluster主要是通过jgroups 提供集群节点间的同步通知机制,其中delete和clear 方法都被通知,add方法并不会被通知。 下面引申一点,当需要使用缓存缓存有状态信息的时候,比如用户登录信息,则需要进行通知处理,因为如果第一次用户登录并由节点机A服务 ,那下次如果他被节点B提供服务,如AB间不进行同步则他需要重新登录。 当有状态信息很大的时候,就需要引入分布式缓存了,下面再说一下分布式缓存吧。 分布式缓存主要是由一群分布式缓存服务器组成,他们提供缓存服务并形成一个缓存池。下面再用用户信息举例,比如说当用户登陆时 无论由节点机ab服务都需要将它命中到缓存了它信息的缓存服务器,所以可以采取hash算法,但是hash算法在应对扩展的时候比较差 会有很多缓存失效,所以 可以用一致性hash算法 ,可以最大限度的减少失效的缓存量。 有点跑题了哈哈。。。。。。 下面继续回到shiftone 中 ,shiftone 中soft涉及到了java中的reference ,我这里转载了一篇大家可以看看哈。reaperable 主要是提供了一个额外的接口removeExpiredElements reaperCache提供rigister 服务,注册收割服务,ReaperTask中有对cache的弱引用 ,如果是强引用则会导致该对象不会被垃圾回收。soft,sysn实现了reapableCache,而其他装饰器没有,其他装饰器都是为了打印出,缓存状态,不是对操作进行包装。adaptor模式主要是为了像是提供一个统一接口 ,就不仔细说了 ,包括具体类的实现也不说了都没什么难度 。现在 再说下config这个包吧 ,node 和propretiesTree主要提供基础服务 ,configInternals 通过addfactory 和addfactoryproperties 初始化树。 beanWrapper 通过反射将delegate 属性set到 factory 中。