EdsCache通用缓存框架——(2.10) 空值缓存

达芬奇密码2018-06-22 17:12


场景需求
当接口会被频繁调用,但有可能DB查询可能返回空时,会造成缓存一直没有命中,持续穿透到DB的问题。

解决思路
如果DB查询返回空,将空值也写到缓存中。
如果只对查询接口(查缓存->查DB->写缓存)使用缓存,没有额外的更新、删除缓存的流程,最好为空值指定一个单独的expire,一般比非空值要短的时长。
由于框架的实现,在缓存中实际存的是一个wrapper对象,空值的时候,直接往缓存中存data属性为空的wrapper对象即可,所以框架天然支持。

EdsCache使用样例
空值缓存不是默认开启的,需要用户在接口中添加@EdsCacheNull显式启用空值缓存功能,如:
@EdsCache(key = constants.PAPER_SETTING_CACHE_PREFIX, expire = 120)
@EdsCacheNull(expire = 30)
public UserDTO getUserById(@EdsCacheKey Long id){
    return paperDao.getById(paperId);
}

结合本地缓存
本地缓存、分布式缓存,是否开启空值缓存功能,是独立的开关,如果希望使用本地缓存时,也开启空值缓存功能,需要额外再叠加@EdsCacheLocalNull:
@EdsCache(key = constants.USER_CACHE_PREFIX, expire=60*60)
@EdsCacheNull(expire = 60)
@EdsCacheLocal(expire = 120)
@EdsCacheLocalNull(expire = 30)
public RoleDTO getRoleNull(@EdsCacheKey Long id){
    return userDao.getRole(id);
}

结合Hash数据结构
如果使用Hash数据结构,也可以结合空值缓存使用,会将空值wrapper存早Hash下subKey对应的数据中,
直接在原有基础上叠加空值注解即可,如:
@EdsCache(key = “papaer_setting", expire = constants.EXPIRE_SECOND)
@EdsCacheHash
@EdsCacheNull(expire = 60)
public String getPaperSetting(@EdsCacheKey Long paperId, @EdsCacheHashKey String settingKey){
    return paperSettingDao.getSetting(paperId, settingKey);
}


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

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