EdsCache通用缓存框架——(2.3)场景应用举例: 更新场景、及不同操作类型介绍

达芬奇密码2018-06-22 15:22
场景需求
另一个简单的场景,希望数据被查询后,能缓存一段时间,
但数据被更新后,不希望删除缓存增加DB穿透次数,希望能立即更新缓存。

解决思路
查询时,仍然按照“先查缓存-没命中则加载数据-回写缓存”的流程;
数据变更时,更新缓存。
优点:
方案简单,能及时更新缓存数据。
缺点:
可能出现缓存与DB数据不一致,具体问题描述请参考缓存一致性功能。
总结:
能适用于大部分常见场景,
能容忍较低概率的db与缓存数据一定时间内存在不一致的场景。可以通过启用EdsCache提供的缓存一致性功能解决。

EdsCache使用样例
查询流程:
@EdsCache(key = “user_prefix”, expire = 120)
public UserDTO getUser(@EdsCacheKey Long id){
    return userDao.getUser(id);
}
更新流程:
@EdsCache(key = “user_prefix”, opType = CacheOpEnum.WRITE, expire = 120)
public UserDTO saveUserWithCache(@EdsCacheKey Long id, UserDTO update){
    UserDTO ret = userDao.updateUser(id, update);
    return ret;
}
通过opType=CacheOpEnum.WRITE,指定操作类型为“写”模式,即不读取缓存,直接调用业务代码加载最新的数据,并写入缓存。

EdsCache支持的操作类型
目前缓存框架支持如下操作类型:
public enum CacheOpEnum {
    /**
     * 读写缓存,如果缓存中有数据,则使用缓存中的数据,如果缓存中没有数据,则加载数据,并写入缓存。
     * 只有READ_WRITE模式,才能启用自动加载功能。
     */
    READ_WRITE,

    /**
     * 不读取缓存,直接从数据源中加载最新的数据,并写入缓存。
     */
    WRITE,

    /**
     * 从缓存中读取,空则进行数据加载,但不回写到缓存中。
     */
    READ_ONLY,

    /**
     * 只从数据源加载数据,不读取缓存中的数据,也不写入缓存。
     */
    LOAD,

    /**
     * 只尝试从缓存查询,空也不进行数据加载
     */
    READ_CACHE_ONLY,
    ;
}
其中READ_WRITE为默认类型。


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

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