在系统中使用缓存,可以加快获取数据的速度,提高系统的效率,是提升系统性能的“银弹”。
在spring boot中使用缓存也比较简单,下面以redis作为系统的缓存来进行演示。
- 配置RedisCacheManager对象。RedisCacheManager用于告诉spring boot将使用redis作为系统的缓存。
@Bean
RedisCacheManager redisCacheManager(RedisTemplate<String, Object> objRedisTemplate) {
return new RedisCacheManager(objRedisTemplate);
}
- 配置KeyGenerator。缓存以key-value的形式保存在redis中。可以实现
org.springframework.cache.interceptor.KeyGenerator接口,来规定想要保存的key的格式。
例如下面的例子用系统时间和传递的参数来生成key。
@Component
public class CustomKeyGenerator implements KeyGenerator {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Object generate(Object target, Method method, Object... params) {
key=sdf.format(new Date())+params[0];
return key;
}
}
- CacheConfig用于表示关于缓存的配置,可以用来指定使用的缓存和key的生成规则。
@CacheConfig(cacheNames = "redisCacheManager", keyGenerator = "customKeyGenerator")
- 使用@Cacheable注解
@Cacheable注解主要有两个作用 1)如果用户请求的数据已经被缓存,使用@Cacheable可以直接返回缓存数据 2)如果用户请求的数据没有被缓存,将执行Controller的方法,将查询结果保存在缓存中。例如在下面的例子中,以user.account作为查询缓存的key值。
假设我们查询account=001的用户,如果在缓存中已经存在key=001的值,将会直接返回,不执行userSetService.queryUserInfo(user.getAccount())方法。如果在缓存不存在这个值,则会执行queryUserInfo的方法,并且将return的值保存在缓存中,下次再查询account=001时会直接返回。
@Cacheable(key="#user.account")
@PostMapping(value = "queryUser")
public Object queryUser(@RequestBody User user) {
return userSetService.queryUserInfo(user.getAccount());
}
- 使用@CacheEvict注解
@CacheEvict注解表示如果用户查询的数据已经保存在缓存中时则清空缓存,往往用于修改用户数据时使用。
例如下面的例子,如果account=001的用户数据在缓存中已经存在了,就会清空key=001的缓存,如果没有则不做处理。
@CacheEvict(key="#user.account")
@PostMapping(value = "updateUser")
public Object updateUser(@RequestBody User user) {
userSetService.updateUserInfo(user);
return "success";
}
参考资料:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html