高并发的场景下,DB前置缓存是常用的一种解决方案。
通常做法是将从DB查询出的值放入缓存(分布式缓存或者本地缓存都可以),下次请求时先从缓存取数据,如果获取不到,再从DB查询;但是如果查询结果本就为空,缓存里会落空值,这样会导致请求还是全部落到DB,这时候就需要在DB放置一个空对象。
我们可以使用guava的Optional类,也可以自己定义一个实现了Serializable接口的result类用来存放空对象,正好最近接触到了vavr,所以尝试使用了一下vavr中的Option类。
部分代码如下
public MyObject queryMyObjectById(String id) {
//根据主键id从缓存获取数据
Option<MyObject> option = (Option<MyObject>)cacheManager.getObject(id);
if (option != null) {
return option.getOrNull();
} else {
MyObject myObject = myObjectDAO.queryMyObjectById(id);
//如果查询为空,放入空对象,防止所有查询为空的结果落到DB上
cacheManager.put(id, Option.of(myObject));
return myObject;
}
}