一类数据多种存储
为提升系统访问性能,程序设计通常会考虑将频繁查询的数据加载到内存或者内存数据库。如果一类数据,即要在内存中存储一份,又要在数据库中存储一份。下面的代码是获取Article(文章)的实现。
public Article getArticle(int articleId) {
Article article = articleDaoMemcachedImpl.getArticle(articleId);
if (article == null) {
article = articleDaoMysqlImpl.getArticle(articleId);
if (article != null) {
articleDaoMemcachedImpl.addArticle(article);
}
}
return article;
}
通过上述代码我们可以看到,程序会先调用articleDaoMemcachedImpl.getArticle获取,如果获取不到,再调用articleDaoMysqlImpl.getArticle获取,然后再调用articleDaoMemcachedImpl.addArticle写入。上述articleDaoMemcachedImpl是Memcache实现,articleDaoMysqlImpl是mysql实现。
这种实现,代码臃肿且不易扩展。假设需要再增加一种实现的情况下,对代码改动很大。使用XXX框架提供的Dao标准Api,可以很方便的实现扩展且代码简洁。
public Article get(int articleId) {
return CacheLoader.get(articleDaoMemcachedImpl, articleDaoMysqlImpl,
articleId);
}
简单的一句调用,就完美实现了一类数据二类存储,如果需要再增加一层存储,只需要再增加一类实现传入就可以了。
XXXX Dao标准接口约定了当出现多种存储时,需要定义DaoCacaheImpl实现。上述例子的代码都是在DaoCacaheImpl里实现的。前面的共识里第三条也对此进行了说明。完整的文件结构如下:
ArticleDao(接口), ArticleDaoCacheImpl(cache实现ArticleDao接口), ArticleDaoMemcachedImpl(memcache实现ArticleDao接口), ArticleDaoMysqlImpl(mysql实现ArticleDao接口)。