Spring Cache是Spring框架提供的一种缓存抽象,可以方便地实现缓存功能,并支持多种缓存实现,如Ehcache、Redis、Caffeine等。
Spring Cache Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
配置文件
spring:
cache:
# 指定缓存名称,
cache-names: myCache
# 指定缓存种类,可选redis,IDEA会提示你的
type: simple
SpringCache 注解说明
@EnableCaching
此注解一般添加在启动类上,开启缓存注解
@Cacheable注解表示使用缓存
指定一个或多个Cache名字. 不允许在Controller层使用,只允许在ServiceImpl层使用
Cacheable注解的参数
- value 等价于 cacheNames,如果Cacheable的类上有@Cacheconfig指定cacheNames,就不需要了。
- key 一般由“入参”决定。使用方式 "#变量名",如果多个参数,你可以写成:"#A" + "_" + "#B"
@Cacheable格式:
@Cacheable(cacheNames = "myCache", key = "#变量名")
@Cacheable使用示例
@Cacheable(value = "user:cache", key = "#id")
public User getUserById(int id) {
System.out.println("Get user from database");
return userRepository.findById(id).orElse(null);
}
@CacheEvict注解表示删除缓存
@CacheEvict参数:
- value等价于cacheNames
- allEntries:标记是否删除命名空间下所有缓存,默认为false
@CacheEvict格式
@CacheEvict(cacheNames = "user:cache", key = "#id") // 删除key=user:cache Value = #id的内容
@CacheEvict(cacheNames = "user:cache", allEntries = true) // 删除key=user:cache 下所有内容
清楚mockData下面的所有缓存。
@CacheEvict(cacheNames = "mockData", allEntries = true)
@CachePut注解表示更新缓存
如果缓存中不存在对应的key,则创建一个新的缓存项。
参数:
- value 等价于 cacheNames,如果Cacheable的类上有@Cacheconfig指定cacheNames,就不需要了。
- key 一般由“入参”决定。使用方式 "#变量名",如果多个参数,你可以写成:"#A" + "_" + "#B"
@CachePut格式
@CachePut(value = "XXX", key = "YYY", cacheNames = {"XXX", "ZZZ"})
// 讲解:更新一个key = XXX,然后存储的值是YYY。同时cacheNames有XXX、ZZZ,当下次来的时候key=XXX没有,可以在key=ZZZ找存储的值。
更常见的用法是:@CachePut(value = "XXX", key = "YYY")
@CachePut使用示例:
@CachePut(value = "user:cache", key = "#user.id")
public User updateUser(User user) {
System.out.println("Update user in database");
return userRepository.save(user);
}
@Caching
白话:存放多个SpringCache相关的注解
用于在一个方法或者类上同时指定多个Spring Cache相关的注解
@Caching(cacheable = {},put = {},evict = {})
@CacheConfig
同一个类中共享一些基础的cache配置的,通常用在配置类上。
@Service
@CacheConfig(cacheNames = "user:cache")
public class DemoService {
@Cacheable(key = "#id") // 这里会默认指定cacheNames = user:cache
public User getUserById(int id) {
System.out.println("Get user from database");
return userRepository.findById(id).orElse(null);
}
}
SpringTask定时清除Cache
// todo 用于定时(15秒)清理Cache。上线环境将此代码移除
@Scheduled(cron = "0/15 * * * * ?")
@CacheEvict(cacheNames = "mockData", allEntries = true)
public void cleanCache(){
}
全局案例
注意相关直接是@Service哦,不得使用在@Controller下!
@Service
@CacheConfig(cacheNames = "user:cache")
public class DemoService {
@Autowired
private UserRepository userRepository;
@Cacheable(key = "#id")
public User getUserById(int id) {
System.out.println("Get user from database");
return userRepository.findById(id).orElse(null);
}
@CachePut(key = "#user.id")
public User updateUser(User user) {
System.out.println("Update user in database");
return userRepository.save(user);
}
@CacheEvict(key = "#id")
public void deleteUserById(int id) {
System.out.println("Delete user from database");
userRepository.deleteById(id);
}
@CacheEvict(allEntries = true)
public void clearCache() {
System.out.println("Clear cache");
}
}
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤