EdsCache通用缓存框架——(2.8) Hash数据结构

达芬奇密码2018-06-22 17:02
场景需求
当多个key经常需要批量查询,或因为其他需求,需要使用Hash数据结构存储时。
使用Hash结构,对需要底层缓存的支持,如redis。
优点:
redis原生支持Hash的批量查询接口,因为一个Hash是在同一个节点中的,所以即使是分布式缓存,也可以批量查询;
可以一次性删除整个Hash。
缺点:
一个Hash是在同一个节点中的,容易造成缓存的单点瓶颈;
Hash中每一个item,都无法单独设置超时时间,占用空间会迟迟得不到释放。

EdsCache使用样例
通过添加@EdsCacheHash注解,表明使用Hash数据结构;
@EdsCacheKey指定的是整个Hash的外层key,@EdsCacheHashKey指定Hash内部的子key,如:
@EdsCache(key = “papaer_setting", expire = constants.EXPIRE_SECOND)
@EdsCacheHash
public String getPaperSetting(@EdsCacheKey Long paperId, @EdsCacheHashKey String settingKey){
    return paperSettingDao.getSetting(paperId, settingKey);
}
如上就能实现查询papaer_setting_{paperId}的Hash下,子key为{settingKey}的item,接口的返回值对应的是Hash中的一个item数据。
更新、删除等接口同理,在原有基础上添加@EdsCacheHash、 @EdsCacheHashKey就可以。

检查数据是否过期:
虽然Hash中的item,redis无法支持单独设置超时时间,但EdsCache框架,在查询出缓存数据后,还是会检查数据是否已经超时,
因为缓存框架真实往缓存中存的,是一个Wrapper类,除了包含业务数据外,还包括额外信息,如缓存的最近更新时间、超时时长等,可以判断出该数据是否已经超时,
如果框架发现数据已经过期,当做没有命中处理。

结合负载均衡
因为一个Hash是在同一个分布式缓存节点中,如果hash的key较多、查询次数较多等,很容易造成单点瓶颈影响性能,
所以可以与“负载均衡”的功能结合起来使用。

整个Hash也是同时在缓存中冗余N份,查询流程的外Key,是原始外key+随机后缀,subKey不变,
来达到先定位到其中一个Hash,再从该Hash中查找subKey的效果。

直接再加上@EdsCacheLoadBalance注解,开启负载均衡功能即可:
@EdsCache(key = “papaer_setting", expire = constants.EXPIRE_SECOND)
@EdsCacheHash
@EdsCacheLoadBalance(constants.BALANCE_COUNT)
public String getPaperSetting(@EdsCacheKey Long paperId, @EdsCacheHashKey String settingKey){
    return paperSettingDao.getSetting(paperId, settingKey);
}

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

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