缓存常用数据
假如要开发一个电子商务网站,商品的类别数据Category,是很少发生变化的,而几乎在每个网页,都需要显示商品类别。如果每次都要从mongoDB数据库中查询出商品类别,显然不是一个好主意。
bugu-mongo-cache模块,就是针对这种应用场景的:某个表的数据量很小,很少发生变化,但需要频繁的查询。这样的数据,我们希望能够“常驻内存”,既减少数据库的查询次数,又加快对用户的响应速度。
初始化
如果要在程序中使用bugu-mongo-cache,那么,在程序启动的时候,在创建数据库连接之后,需要先初始化BuguCache实例:
//连接到数据库
connectDB();
//初始化缓存
BuguCache cache = BuguCache.getInstance();
cache.init();
在应用程序退出的时候,记得销毁BuguCache:
//销毁缓存
BuguCache.getInstance().destroy();
//断开数据库连接
disconnectDB();
如果你的应用程序是运行在集群环境中,比如多个Tomcat的集群,那么需要指定ZooKeeper的连接信息,因为当mongoDB中的数据有变化的时候,bugu-mongo-cache需要依赖ZooKeeper来通知集群中的所有JAVA程序,把缓存的数据重新加载。
connectDB();
BuguCache cache = BuguCache.getInstance();
cache.setZkConnectString("127.0.0.1:2181");
cache.init();
CacheableDao
bugu-mongo-cache中提供了一个CacheableDao,它是BuguDao的子类。要使某个表的数据能够缓存起来,只需将其对应的DAO继承自CacheableDao即可。例如:
public class CategoryDao extends CacheableDao<Category> {
public CategoryDao() {
super(Category.class);
}
}
这样,CategoryDao会把Category表中的全部数据都加载到内存,可以通过getCacheData()方法,读取到缓存起来的数据:
CategoryDao dao = ......;
List<Category> list = dao.getCacheData();
如果不想缓存表中的全部数据,而是缓存部分数据,那么只需在构造函数中指定一个查询条件即可:
public class CategoryDao extends CacheableDao<Category> {
public CategoryDao() {
super(Category.class);
//只缓存符合查询条件的数据
BuguQuery q = this.query().is("valid", Boolean.TRUE).sort(SortUtil.aesc("order")).pageNumber(1).pageSize(50);
this.setCacheQuery(q);
}
}
没别的了。剩下的工作,bugu-mongo框架会自动帮你处理。如果通过bugu-mongo框架,对表中的数据进行了新增、修改、删除等操作,缓存会自动更新,你什么也不用做,即使是在集群环境中也是一样。如果想知道背后的原理,请看这里:扩展bugu-mongo
需要注意的是,CacheableDao会把数据长期放在内存,因此,对于没必要缓存的数据表,切记不要使用CacheableDao,否则容易把内存耗完。