EdsCache通用缓存框架——(2.5) 本地缓存、二级缓存

达芬奇密码2018-06-22 16:32
场景需求
当接口响应时间要求很高、或存在热点key等,连分布式缓存也达不到要求,需要使用本地缓存时。

解决思路
本地缓存与分布式缓存结合使用,形成二级缓存,如:
先查询本地缓存,
本地缓存命中则直接返回;
本地缓存没命中,查询分布式缓存,分布式缓存命中,则回写本地,返回数据。
优点:
可以提高接口响应速度。
缺点:
分布式节点的本地缓存的同步较为复杂,需要引入额外的手段,目前缓存框架没有支持,用户可以自己实现,如数据更新时MQ广播更新的push方式、定时轮训分布式缓存的pull方式等。
总结:
适用于数据实时性要求不那么高的场景,本地缓存的超时时间可以较短,如1分钟等,
1分钟超时后穿透到分布式缓存获取,再回写本地缓存,而分布式缓存的数据更新是可以做到实时同步的。

EdsCache使用样例
通过添加@EdsCacheLocal注解,启用本地缓存,并单独指定本地缓存的超时时间为60秒,即可达到二级缓存的目的,如:
@EdsCache(key = constants.USER_CACHE_PREFIX, expire=60*60)
@EdsCacheLocal(expire = 60)
public RoleDTO getRole(@EdsCacheKey Long id){
    return userDao.getRole(id);
}
配置底层本地缓存:
以ehcahce作为底层本地缓存为例,框架提供了默认的ehcahce配置文件EdsCacheEhCacheAutoConfiguration类,可以直接引入:
@SpringBootApplication
@EnableAutoConfiguration
@Configuration
@Import({EdsCacheAutoConfiguration.class, EdsCacheRedisAutoConfiguration.class, EdsCacheEhCacheAutoConfiguration.class})
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

只使用本地缓存
如果只希望单纯的使用本地缓存,不需要与分布式缓存结合,可以通过condition关闭本接口的分布式缓存,如:
@EdsCache(key = constants.USER_CACHE_PREFIX, condition=“false”)
@EdsCacheLocal(expire = 60)
public RoleDTO getRole(@EdsCacheKey Long id){
    return userDao.getRole(id);
}
关于condition条件的详细说明,请参考"Key构造规则&条件与表达式"。

本文来自网易实践者社区,经作者陈婷授权发布。  

相关阅读:EdsCache通用缓存框架——(1)总览导航