Cache Eviction in Spring Boot

1. Overview

In this short tutorial, we’re going to learn how we can perform cache eviction using Spring. We’ll be creating a small example to demonstrate this.

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

2. How to Evict a Cache?

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 these two cache eviction mechanisms can be implemented in code.

2.1. Using @CacheEvict

Let’s create an empty method with @CacheEvict annotation and provide the cache name which we want to clear as an argument of the annotation (in this case, we want to clear the cache with the name “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 possible to evict values based on a particular key.

For this, all we have to do is to 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 have a 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.

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

@Autowired
CacheManager cacheManager;

public void evictSingleCacheValue(String cacheName, String cacheKey) {
    cacheManager.getCache(cacheName).evict(cacheKey);
}

public void evictAllCacheValues(String cacheName) {
    cacheManager.getCache(cacheName).clear();
}

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

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

@RestController
public class CachingController {

    @Autowired
    CachingService cachingService;

    @GetMapping("clearAllCaches")
    public void clearAllCaches() {
        cachingService.evictAllCaches();
    }
}

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

public void evictAllCaches() {
    cacheManager.getCacheNames().stream()
      .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() {
    evictAllCaches();
}

4. Conclusion

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

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

Leave a Reply

Your email address will not be published.