本文不为Redis安装和使用范畴,有兴趣的朋友可以联系我,也可以自行百度:Redis安装和使用
Redis实现缓存添加,更新和删除的方法有很多.
1:较为笨拙的方法,也是最稳定的方法,也是一些自动化缓存更新的原理但是代码就多了点,在需要用到缓存的地方,去判断,
先从缓存取,取不到,去数据库查找,找到返回该数据,并写入缓存
2:使用aop的思想,在需要用到缓存的地方左上标识(用注解实现即可,方法很多),剩下的原理同上,这是个一劳永逸的过程
3:就是这篇文章要讲的:使用spring自带的Cacheable注解处理Redis缓存,以下为具体的细节描述
1)使用maven项目管理
org.springframework
spring-context
4.1.6.RELEASE
2)在需要使用到的地方加上Cacheable注解
cacheable能够实现自动缓存接口的返回结果,所以我们可以把注解直接加到我们需要缓存结果的接口上。
放的位置可以试service也可以是dao,以下是放到service和dao层的示例:
放到service层上:
@Cacheable(value="workDetailV150",key="'workDetailV150'.concat(#param.workId.toString()).concat(#param.userId.toString())")
public CliDresserWorkDetailV150 getWorkDetail(CliGetWorkDetailParam param) throws Exception {
return doGetWorkDetail(param);
}
放到dao层上:
@Cacheable(value="getWorkDetailPhotos",key="'getWorkDetailPhotos'.concat(#root.args[0])")
List getWorkDetailPhotos(Integer workId);
有没有看到,两者的不同,在dao层上,因为用了mybatis的缘故,这里只有接口,那么用workId放到key里面是存不到redis的,因为spring cache拿到的是null。所以这里必须用#root.args[x]的方式设置。
问题来了,那个这里有一个value还有一个key,他们分别代表了什么呢?
3)缓存的清除
如果我们缓存的实体更新了,怎么办?不能够get的还是旧的东西。这时候就需要强制清除相关联的缓存了。方法就是提供一个空的接口方法,在该方法上添加@CacheEvict的注解,如下:
@CacheEvict(value = "workDetailV150", allEntries=true)
public void evictWorkDetailCache(){
}
4)Cacheable注解key的说明
这个地方主要简单说明一下3个要素:1.字符串、2.接口参数、3.环境参数,以及一个函数
字符串很好说了用单引号括起来就可以了。
接口参数直接用#加参数名,如果是参数内的属性那么继续用.串联接好了。
环境参数:
属性名称 | 描述 | 示例 |
---|---|---|
methodName | 当前方法名 | root.methodName |
method | 当前方法 | root.method.name |
target | 当前被调用的对象 | root.target |
targetClass | 当前被调用的对象的class | root.targetClass |
args | 当前方法参数组成的数组 | root.args[0] |
caches | 当前被调用的方法使用的Cache | root.caches[0].name |
最后是关键函数concat,意思很明白了,就是连接字符串用的。
使用过程,或者有什么不明白的,我们可以互相讨论,共同进步!欢迎大家骚扰~~~