EdsCache通用缓存框架——(2.11) Key构造规则&条件与表达式

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


EdsCache框架支持表达式的使用,目前默认提供了SpEL(Spring Expression Language)的支持。

一、缓存Key的构造规则
规则如下:
key = {namespace}:{函数注解@EdsCache中key属性表达式结果}_{参数注解@EdsCacheKey中的表达式计算结果}
其中,优先使用@EdsCache中的namespace属性值,若@EdsCache中没有指定namespace,则使用CacheConfig中的默认namespace。

样例:
当全局配置的namespace为”cacheDemo”时,如:
eds.cache.namespace = cacheDemo
1.不需要使用接口参数的样例:
@EdsCache(key = “paper")
public PaperDto getPaperByUser(Long scopeId, User user){
    return paperDao.getByUserId( scopeId,  user.getId());
}
如上,最终构造的缓存Key=cacheDemo:paper

2.使用接口参数的样例1:
@EdsCache(key = "'paper' + #args[0]+'_' + #args[1].getId()”)
public PaperDto getPaperByUser(Long scopeId, User user){
    return paperDao.getByUserId( scopeId,  user.getId());
}
如上,通过el表达式使用参数值,若scopeId=1001, user.getId()=4001234,最终key=cacheDemo:paper_1001_4001234

3.使用接口参数的样例2:
还可以通过@EdsCacheKey注解,使用接口入参,如:
@EdsCache(key = "paper”)
public PaperDto getPaperByUser(@EdsCacheKey Long scopeId, @EdsCacheKey("getId()") User user){
    return paperDao.getByUserId( scopeId,  user.getId());
}
可以的到与样例2相同的key。
注意:
当使用@EdsCacheKey来构造key时,框架是按参数顺序来拼装key的,如果参数顺序进行了调整,构造出来的key也会相应变化!

二、条件表达式
1.缓存条件
@EdsCache中的condition属性,可以用来实现条件缓存的需求。

比如当满足指定条件的时候,才使用缓存功能,如:
@EdsCache(key = “paper", condition = "!#isEmpty(#args[0])")
public PaperDto getPaperByUser(Long scopeId, User user){
    return paperDao.getByUserId( scopeId,  user.getId());
}
就能实现当scopeId入参不为空时,才去查询缓存的需求。

本地缓存与分布式缓存的条件是分开设置,相互独立的,
@EdsCache的condition是设置分布式缓存的条件,如果想设置本地缓存的条件,指定@EdsCacheLocal的condition即可。

2.exipre表达式
如果缓存的expire无法通过常量确定下来,而是需要动态计算,
比如一场考试的缓存,缓存时长与考试截止时间相关的时候,就无法通过设定expire为常量来解决。

EdsCache提供了expireExpression属性,可以利用表达式,动态获取expire,如:
@EdsCache(key = “paper”, expireExpression="#args[2]")
public PaperDto getPaperByUser(Long id, PaperDTO paper, Long expire){
    return paperDao.getByUserId( scopeId,  user.getId());
}
如上,el表达式如果写得太复杂可读性会不高,可以通过代码先计算好,通过入参的方式传入。

本地缓存也可以单独设置expire表达式,指定@EdsCacheLocal的expireExpression即可。

3.缓存删除条件
可以为是否执行缓存删除操作设置条件。
但@EdsCacheDelete与@EdsCache不同地方在于,@EdsCacheDelete的条件判断时机,是在接口执行完成后。
所以@EdsCacheDelete的条件表达式,可以使用接口的返回值,作为条件计算的一部分,如:
@EdsCacheDelete(key = constants.USER_CACHE_PREFIX, condition = "#retVal")
public boolean deleteUser(@EdsCacheKey Long id){
    boolean ret = userDao.delete(id);
    return ret;
}
如上,能实现返回值为true时,才删除缓存的需求。

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

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