Java后端多级缓存写法

1、前言

在我们开发项目的过程中经常会遇到一些读多写少的接口,在这些接口中会有很大批量的查询操作,如果我们这些查询操作都需要查询数据库的话,会造成数据库承受不了,以及数据库的响应比较慢导致该接口无法在规定时间进行相应,所以我们要减少数据库的查询操作,使用多级缓存机制。

2、架构

多级缓存的架构如图所示:
Java后端多级缓存写法_第1张图片
这里面的Redis为分布式缓存,作为整个系统共用的缓存,而JVM本地则用的Eheache缓存。

3、写法

//根据ID查询应用
@Cacheable(value = "app", key = "#appId")
public App getAppByAppId(Integer appId) {
    String redisKey = "app:" + appId;
    //查询Redis
    String jsonStr = redisTemplate.opsForValue().get(redisKey);
    if (jsonStr == null) {
        //查询数据库
        App app = appDao.selectByPrimaryKey(appId);
        String value = JSON.toJSONString(app);
        //写到Redis
        redisTemplate.opsForValue().set(redisKey, value,
                6 * 60 + new Random().nextInt(30), TimeUnit.SECONDS);
        return app;
    }
    return JSON.parseObject(jsonStr, new TypeReference<App>() {
    });
}
  • 在方法前面添加@Cacheable注解,将Ehcache通过注解形式绑定到该方法上,该方法返回的内容会直接保存到Ehcache中。如果该缓存,则不进入方法直接返回。
  • 进入方法中,查询Redis,如果Redis不存在,通过appDao的selectByPrimaryKey方法查询数据库,并通过redisTemplate.opsForValue().set()方法重新写到Redis中。通过JSON.parseObject()方法将json格式的内容转成App类,并返回。
  • 其中为了避免有缓存击穿问题,在redis的过期时间设置的时候,要加上一个随机数。

你可能感兴趣的:(Java,Java并发)