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博客搜索:标题关键字。以获取全部资料 ❤