Spring Boot 2.0 基础案例(十三):基于 Cache 注解模式,管理 Redis 缓存

一、Cache缓存简介 

从Spring3开始定义Cache和CacheManager接口来统一不同的缓存技术;

Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;

Cache接口下Spring提供了各种缓存的实现;

如RedisCache,EhCacheCache ,ConcurrentMapCache等;

二、核心API说明 

1、Cache缓存接口

定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等

2、CacheManager

缓存管理器,管理各种缓存(cache)组件

3、@Cacheable

主要针对方法配置,能够根据方法的请求参数对其进行缓存

Cacheable 执行流程
1)方法运行之前,按照cacheNames指定的名字先去查询Cache 缓存组件
2)第一次获取缓存如果没有Cache组件会自动创建
3Cache中查找缓存的内容,使用一个key,默认就是方法的参数
4key是按照某种策略生成的;默认是使用keyGenerator生成的,这里使用自定义配置
5)没有查到缓存就调用目标方法;
6)将目标方法返回的结果,放进缓存中

Cacheable 注解属性
cacheNames/value:指定方法返回结果使用的缓存组件的名字,可以指定多个缓存
key:缓存数据使用的key
key/keyGenerator:key的生成器,可以自定义
cacheManager:指定缓存管理器
cacheResolver:指定缓存解析
condition:指定符合条件的数据才缓存
unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存
sync:是否使用异步模式

4、@CacheEvict

清除缓存

CacheEvict:缓存清除
key:指定要清除的数据
allEntries = true:指定清除这个缓存中所有的数据
beforeInvocation = false:方法之前执行清除缓存,出现异常不执行
beforeInvocation = true:代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除

5、@CachePut 

保证方法被调用,又希望结果被缓存。

与@Cacheable区别在于是否每次都调用方法,常用于更新,写入

CachePut:执行方法且缓存方法执行的结果
修改了数据库的某个数据,同时更新缓存;
执行流程
1)先调用目标方法
2)然后将目标方法的结果缓存起来

6、@EnableCaching

开启基于注解的缓存

7、keyGenerator 

缓存数据时key生成策略

8、@CacheConfig

统一配置本类的缓存注解的属性

三、与SpringBoot2.0整合 

1、核心依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、Cache缓存配置

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
@Configuration
public class CacheConfig {
/**
* 自定义 Cache 的 key 生成器
*/

@Bean("oneKeyGenerator")
public KeyGenerator getKeyGenerator (){
return new KeyGenerator() {
@Override
public Object generate(Object obj, Method method, Object... objects) {
return "KeyGenerator:"+method.getName();
}
} ;
}
}

3、启动类注解开启Cache

@EnableCaching            // 开启Cache 缓存注解
@SpringBootApplication
public class CacheApplication {
public static void main(String[] args) {
SpringApplication.run(CacheApplication.class,args) ;
}
}

4、Cache注解使用代码

1)封装增删改查接口

import com.boot.cache.entity.User;
public interface UserService {
// 增、改、查、删
User addUser (User user) ;
User updateUser (Integer id) ;
User selectUser (Integer id) ;
void deleteUser (Integer id);
}

2)Cache注解使用案例

import com.boot.cache.entity.User;
import com.boot.cache.service.UserService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
// 使用自定义的key生成策略
// 缓存结果key:addUser::KeyGenerator:addUser
@CachePut(value = "addUser",keyGenerator="oneKeyGenerator")
@Override
public User addUser(User user) {
return user ;
}
// 缓存结果key:updateUser::2
@CachePut(value = "updateUser",key = "#result.id")
@Override
public User updateUser(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("smile");
return user;
}
// 缓存结果key: selectUser::3
@Cacheable(cacheNames = "selectUser",key = "#id")
@Override
public User selectUser(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("cicadaSmile");
return user;
}
// 删除指定key: selectUser::3
@CacheEvict(value = "selectUser",key = "#id",beforeInvocation = true)
@Override
public void deleteUser(Integer id) {

}
}

5、测试代码块

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CacheApplication.class)
public class CacheTest {
@Resource
private UserService userService ;
// 分别测试:增、改、查、删,四个方法
@Test
public void testAdd (){
User user = new User() ;
user.setId(1);
user.setName("cicada");
userService.addUser(user) ;
}
@Test
public void testUpdate (){
userService.updateUser(2) ;
}
@Test
public void testSelect (){
userService.selectUser(3) ;
}
@Test
public void testDelete (){
userService.deleteUser(3) ;
}
}

四、源代码地址 

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base
地址:知了一笑
https://gitee.com/cicadasmile/spring-boot-base

Spring Boot 2.0 基础案例(十三):基于 Cache 注解模式,管理 Redis 缓存

原文 

https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247483863&idx=1&sn=3e392e81f0d5c387d42888a7918e3a13&chksm=fdf4556fca83dc793863653e69dccd2e3f65bf9f28240a15dbe1798b405261ba802a8def0357&token=273311973&lang=zh_CN

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring Boot 2.0 基础案例(十三):基于 Cache 注解模式,管理 Redis 缓存

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址