Redis实现缓存添加,更新和删除的方法有很多.

1:较为笨拙的方法,也是最稳定的方法,也是一些自动化缓存更新的原理但是代码就多了点,在需要用到缓存的地方,去判断,

         先从缓存取,取不到,去数据库查找,找到返回该数据,并写入缓存

2:使用aop的思想,在需要用到缓存的地方左上标识(用注解实现即可,方法很多),剩下的原理同上,这是个一劳永逸的过程

3:就是这篇文章要讲的:使用spring自带的Cacheable注解处理Redis缓存,以下为具体的细节描述

1)使用maven项目管理

 

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.6.RELEASE</version>
</dependency>

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<String> 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,意思很明白了,就是连接字符串用的。

使用过程,或者有什么不明白的,我们可以互相讨论,共同进步!欢迎大家骚扰~~~