可复用、扩展的缓存设计方案

背景:
为网站有大量的查询数据做缓存。

方案使用第三方组件oscache.jar,如何能合理的集成这个组件,使得需要缓存的对象和缓存的算法隔离开来,使得两者能够独立演化,而不是相互耦合,看下面的设计图:
可复用、扩展的缓存设计方案_第1张图片

见上图,可以看出设计方案采用了策略模式和代理模式

我们将缓存算法使用CacheFacade 接口进行了抽象,使得需要缓存的对象和缓存算法相互独立,需要缓存的对象可以方便的更换缓存算法,本案中我们使用了oscache。

Cacheable接口抽象了需要缓存的对象。

假定以前代码已经写好,service--->dao

现在需要加入缓存,怎么实施?

从上图可以看出CachedTopVideosContributedDaoImpl实现了dao接口和Cacheable接口,这样service层无需作任何改动,CachedTopVideosContributedDaoImpl实例是一个代理对象,对原先的dao实例进行了封装,并在其中加入缓存方案。就是这么简单,说白了就是在service和dao之间加了一个代理层。

但是本设计方案有些缺陷:
如果大量的dao需要缓存,因为本设计采用了静态代理的方式,所以需要大量的代理类,也可以采用一个缓存代理多个dao,但是随着系统越来越大,这种方式会难以维护。能否采用AOP的方式实现?这是一个值得思考的地方

你可能感兴趣的:(DAO,设计模式,AOP,算法)