spring boot 缓存 | 默认缓存

  • spring boot
  • 2020-06-07 16:10:33
  • 浏览 242
简介spring boot 默认使用 ConcurrentMapCache 作为缓存,其实是一个map,项目重启缓存会随之失效

JSR107规范

JSR107规范定义了一组接口:

CachingProvider:定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CacheManager。

CacheManager:定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。

Cache:临时存储以Key为索引的值。

Entry:存储在Cache中的Key-value对。

spring boot 缓存注解

spring boot 定义了一组注解用于在开发中快速实现缓存功能。

注解 说明
Cache 缓存接口,定义缓存操作。实现有 RedisCache、EhCacheCache、ConcurrentMapCache 等
CacheManager 缓存管理器,管理各种缓存(Cache)组件
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict 清空缓存
@CachePut 保证方法被调用,又希望被缓存
@EnableCaching 开启基于注解的缓存
keyGenerator 缓存数据时 key 生成策略
serialize 缓存数据时 value 序列化策略

缓存注解的 SpEL 表达式

名字 位置 描述 示例
methodName root object 当前被调用的方法名 #root.methodName
method root object 当前被调用的方法 #root.method.name
target root object 当前被调用的目标对象 #root.target
targetClass root object 当前被调用的目标对象类 #root.targetClass
args root object 当前被调用的方法的参数列表 #root.args[0]
caches root object 当前方法调用使用的缓存列表 #root.caches[0].name
argument name evaluation context 方法参数的名称,可以直接 #参数名或者 #索引 #id、#0
result evaluation context 方法执行后的返回值 #result

示例

搭建好 spring boot web 项目,在启动类加上注解开启缓存

@SpringBootApplication
@EnableCaching
public class CacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class, args);
    }

}

在 service 实现类中定义缓存名称,则该类的其它缓存方法将都使用该缓存名称

@CacheConfig(cacheNames = "user")
@Service
public class UserServiceImpl implements UserService {
}

查询结果缓存使用@Cacheable,定义 key 的规则和结果判断

    @Cacheable(key = "#id", unless = "#result == null")
    @Override
    public User detail(Integer id) {
        log.info("{}", "执行查询");
        return userDao.detail(id);
    }

更新缓存使用@CachePut,定义要更新的 key ,@CachePut在方法后执行,所以被注解的方法一定会执行

    @CachePut(key = "#result.id")
    @Override
    public User update(User user) {
        log.info("{}", "执行更新");
        userDao.update(user.getNickName(), user.getId());
        return user;
    }

删除缓存使用@CacheEvict,定义要删除的 key

    @CacheEvict(key = "#id")
    @Override
    public void delete(Integer id) {
        log.info("{}", "执行删除");
        userDao.delete(id);
    }

github

https://github.com/365D1/spring-boot-cache.git

文章评论