Cache Eviction in Spring Boot – Spring Boot中的缓存驱逐

最后修改: 2018年 10月 8日

1. Overview


In this quick tutorial, we’ll learn how to perform cache eviction using Spring. To demonstrate this, we’ll create a small example.


Before proceeding, check out our article, Guide To Caching in Spring, to get familiar with how Spring caching works.

在继续之前,请查看我们的文章,Guide To Caching in Spring,以熟悉Spring缓存的工作方式。

2. How to Evict a Cache?

2.如何驱逐缓存? 2.如何驱逐缓存?

Spring provides two ways to evict a cache, either by using the @CacheEvict annotation on a method, or by auto-wiring the CacheManger and clearing it by calling the clear() method.


Here’s how we can implement these two cache eviction mechanisms in code.


2.1. Using @CacheEvict


Let’s create an empty method with the @CacheEvict annotation, and provide the cache name that we want to clear as an argument of the annotation. In this case, we want to clear the cache with the name “first”:

让我们创建一个带有@CacheEvict注解的空方法,并提供我们想要清除的缓存名称作为注解的参数。在这个例子中,我们想清除名字为 “first “的缓存。

@CacheEvict(value = "first", allEntries = true)
public void evictAllCacheValues() {}

Spring will intercept all the methods annotated with @CacheEvict and clear all the values based on the allEntries flag.


It’s also possible to evict values based on a particular key. For this, all we have to do is pass the cache key as an argument to the annotation, instead of the allEntries flag:


@CacheEvict(value = "first", key = "#cacheKey")
public void evictSingleCacheValue(String cacheKey) {}

Since the value of the key attribute is dynamic, we can either use Spring Expression Language, or a custom key generator by implementing KeyGenerator to pick the arguments of interest or the nested properties.


2.2. Using CacheManager


Next, let’s look at how we can evict the cache using the CacheManager provided by the Spring Cache module. First, we have to auto-wire the implemented CacheManager bean.

接下来,让我们看看如何使用Spring Cache模块提供的CacheManager来驱逐缓存。首先,我们必须自动连接已实现的CacheManager Bean。

Then we can clear the caches with it based on our needs:


CacheManager cacheManager;

public void evictSingleCacheValue(String cacheName, String cacheKey) {

public void evictAllCacheValues(String cacheName) {

As we can see in the code, the clear() method will clear all the cache entries, and the evict() method will clear values based on a key.


3. How to Evict All Caches?


Spring doesn’t provide an out of the box functionality to clear all the caches, but we can achieve this easily by using the getCacheNames() method of the cache manager.


3.1. Eviction on Demand


Now let’s see how we can clear all the caches on demand. In order to create a trigger point, we have to expose an endpoint first:


public class CachingController {
    CachingService cachingService;
    public void clearAllCaches() {

In the CachingService, we can then clear all the caches by iterating over the cache names obtained from the cache manager:


public void evictAllCaches() {
      .forEach(cacheName -> cacheManager.getCache(cacheName).clear());

3.2. Automatic Eviction


There are certain use cases where cache eviction should be performed automatically at certain intervals. In this case, we can make use of the Spring’s task scheduler:


@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {

4. Conclusion


In this article, we learned how to evict caches in different ways. One of the things worth noting about these mechanisms is that it’ll work with all of the various cache implementations, like eh-cache, infini-span, apache-ignite etc.


As always, all the examples mentioned in this article can be found over on Github.