在项目中有一个需求:
为了提升读取数据的效率,往往会利用guava来做本地缓存,下面举一个场景:
每一个用户进来,都需要取到用户自己的信息,那么我们该如何做才能让用户更快的拿到自己的信息而又不影响服务器的性能呢?没错,是缓存;那么缓存也有很多种,有本地缓存,也有远程缓存,更有关系型数据库保存的,那我们该如何才可以让性能达到最优呢?
首先,我们调用guava相关API看看guava里面有没有缓存了用户对应的信息,如果有,那么直接返回给用户,这样子效率是最高的,因为这是直接从本地内存里面取得的;假如说,没有呢?那么我们就该去远程缓存里面取了,redis也保存一份用户的数据,拿出来后,跟着返回给用户,并保存一份在guava里面,这动作是自动的;如果redis里面依然没有,那么我们就该往关系型数据库里面去拿了,拿出来之后,会直接保存一份在guava的,这样子,当用户第二次来拿的时候,就不需要去查询redis和关系型数据库了;
当然,肯定有人会问,假如说修改了数据之后,那么redis如何更新,guava如何更新,从而保证数据的一致性呢??方法是有的,但是这个方法也并不是实时的保证一致性,总之是最终一致性,更新的顺序是,先把redis的数据删除掉,然后更新关系型数据库的数据,再插入redis,这样子就保证了非关系跟关系型的数据库保证了一致性了,那怎么更新guava数据呢?既然是缓存了,肯定就是热数据了,不轻易改变的数据,所以说迟一点点没有关系的,那么我们就利用了guava自带的API在定时的刷新缓存,会执行road的方法,从redis或者数据库中把最新的值拿过来,然后更新到guava中。
guava
public class GlobalBank3RdInfoCache {
public static Cache<String,Mapping3trInfoRequest> cache = CacheBuilder.newBuilder().refreshAfterWrite(1, TimeUnit.HOURS).maximumSize(100).build();
}
如何使用:
mapping3trInfoRequest = GlobalBank3RdInfoCache.cache.get(key, () -> {
String info = baseDictServiceRedis.get(key);
if(StringUtils.isNotBlank(info)){
Mapping3trInfo mapping3trInfo = JsonUtil.fromJson(info,Mapping3trInfo.class);
Mapping3trInfoRequest mapping3trInfoRequest1 = new Mapping3trInfoRequest();
if(mapping3trInfo != null){
mapping3trInfoRequest1.setCity(mapping3trInfo.getCity());
mapping3trInfoRequest1.setThreeBankName(mapping3trInfo.getThreeBankName());
mapping3trInfoRequest1.setGwType(mapping3trInfo.getGwType());
mapping3trInfoRequest1.setBankId(mapping3trInfo.getBankId());
mapping3trInfoRequest1.setBranchBankId(mapping3trInfo.getBranchBankId());
mapping3trInfoRequest1.setThreeBankId(mapping3trInfo.getThreeBankId());
mapping3trInfoRequest1.setBranchBankName(mapping3trInfo.getBranchBankName());
mapping3trInfoRequest1.setCityName(mapping3trInfo.getCityName());
mapping3trInfoRequest1.setProvince(mapping3trInfo.getProvince());
mapping3trInfoRequest1.setProvinceName(mapping3trInfo.getProvinceName());
return mapping3trInfoRequest1;
}
}
Mapping3trInfoKey mapping3trInfoKey = new Mapping3trInfoKey();
mapping3trInfoKey.setBranchBankId(branchBankId);
mapping3trInfoKey.setCity(city);
mapping3trInfoKey.setBankId(bankId);
mapping3trInfoKey.setGwType(gwType);
return getSession().selectOne("selectOne3rd",mapping3trInfoKey);