缓存常用数据

优质
小牛编辑
126浏览
2023-12-01

假如要开发一个电子商务网站,商品的类别数据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,否则容易把内存耗完。