Springboot使用@Cacheable为方法添加缓存的简单例子
需求及要点
初次使用@Cacheable注解,目的是对相同参数频繁查询的方法返回结果进行缓存,提高接口效率。
一开始只添加注解后不生效,经过调试,需要注意以下几点:
- 在 application.yml / application.properties 中配置缓存,关键配置类型type(这里以redis为例)和缓存名称cache-names
- 为启动类添加 @EnableCaching 注解
- 在方法上方添加 @Cacheable 注解,指明缓存名称 cacheNames/value,与配置文件中的名称对应
- 方法需要声明为公共的
- 在服务类内部调用不生效,需要将方法写到单独的类中(即:在A服务类的a方法中调用b方法,给b方法加缓存注解是无效的;可在A类的a方法中调用B类里的加注解的b方法)
- 需要缓存多个方法时,缓存名称使用同一个就可以(如下面例子中的"redisCache")
代码示例
- application.yml
spring:
# 缓存配置
cache:
type: redis
redis:
time-to-live: 300000
# 缓存名称,与注解中的名称对应
cache-names: redisCache
# redis 配置
redis:
# 地址
host: xxx.xxx.xxx.xxx
# 端口
port: xxx
# 数据库索引
database: xxx
# 密码
password: xxx
timeout: 300s
jedis:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
- 启动类
@EnableCaching
public class Application {
}
- 存放不好归类的缓存方法的缓存工具类
@Component
public class CacheUtils {
@Resource
private AnylineService anylineService;
@Cacheable(cacheNames = "redisCache")
public DataSet anylineQueryIds(String tableName, String key, Object value){
String fields = "(ID," + key + ")";
return anylineService.querys(tableName + fields, key + ":" + value);
}
}