Using @CacheEvict for Cache Invalidation in Spring Boot
📖 Scenario: You are building a simple Spring Boot service that manages user profiles. To improve performance, you cache user data. When a user profile is updated, you need to clear the cached data to keep it fresh.
🎯 Goal: Build a Spring Boot service with a method to cache user profiles and another method to update profiles that uses @CacheEvict to clear the cache for the updated user.
📋 What You'll Learn
Create a simple UserService class with a method getUserById that returns a user name string.
Add a cache configuration to cache the result of getUserById.
Create an updateUserName method that updates the user name and uses @CacheEvict to clear the cache for that user ID.
Ensure the cache is cleared only for the specific user ID when updateUserName is called.
💡 Why This Matters
🌍 Real World
Caching user data improves performance by avoiding repeated database calls. Clearing cache on updates ensures users see fresh data.
💼 Career
Understanding cache invalidation with <code>@CacheEvict</code> is essential for backend developers working with Spring Boot to build efficient and consistent applications.
Progress0 / 4 steps
1
Create UserService with getUserById method
Create a class called UserService with a method getUserById that takes a Long userId parameter and returns a String user name. For now, return the string "User" + userId.
Spring Boot
Hint
Define a public class UserService. Inside it, create a public method getUserById that returns a string combining "User" and the userId.
2
Enable caching and add @Cacheable to getUserById
Add the @Cacheable annotation to the getUserById method with cache name "users". Also, add the @Service annotation to the UserService class to make it a Spring service.
Spring Boot
Hint
Use @Service on the class and @Cacheable("users") on the getUserById method to enable caching.
3
Add updateUserName method with @CacheEvict
Add a method updateUserName that takes Long userId and String newName parameters. Annotate it with @CacheEvict(cacheNames = "users", key = "#userId") to clear the cache for that user ID. Inside the method, simulate updating by returning newName.
Spring Boot
Hint
Create updateUserName method annotated with @CacheEvict to clear cache for the given userId.
4
Add @EnableCaching to application configuration
Create a configuration class called CacheConfig annotated with @Configuration and @EnableCaching to enable Spring caching support.
Spring Boot
Hint
Create a class CacheConfig with @Configuration and @EnableCaching annotations to activate caching.
Practice
(1/5)
1. What is the primary purpose of the @CacheEvict annotation in Spring Boot?
easy
A. To remove or invalidate cache entries after data changes
B. To add new entries to the cache
C. To configure cache storage location
D. To read data from the cache without modification
Solution
Step 1: Understand cache behavior
Cache stores data to speed up repeated access, but stale data can cause issues.
Step 2: Role of @CacheEvict
@CacheEvict is used to remove outdated cache entries after data changes to keep cache fresh.
Final Answer:
To remove or invalidate cache entries after data changes -> Option A
Quick Check:
@CacheEvict removes cache entries [OK]
Hint: Remember: @CacheEvict clears cache after updates [OK]
Common Mistakes:
Confusing @CacheEvict with @CachePut or @Cacheable
Thinking it adds cache entries instead of removing
Assuming it configures cache storage
2. Which of the following is the correct way to use @CacheEvict to clear a cache named "users" after a method executes?
easy
A. @CacheEvict(cacheNames = "users", allEntries = true)
B. @CacheEvict(cacheName = "users", clearAll = true)
C. @CacheEvict(value = "users", removeAll = true)
D. @CacheEvict(cache = "users", evictAll = true)
Solution
Step 1: Identify correct attribute names
The correct attribute to specify cache names is cacheNames or value. To clear all entries, use allEntries = true.
Step 2: Match correct syntax
@CacheEvict(cacheNames = "users", allEntries = true) uses @CacheEvict(cacheNames = "users", allEntries = true), which is valid syntax.
Final Answer:
@CacheEvict(cacheNames = "users", allEntries = true) -> Option A
Quick Check:
cacheNames + allEntries = true [OK]
Hint: Use cacheNames and allEntries=true to clear all cache keys [OK]
Common Mistakes:
Using wrong attribute names like cacheName or cache
Why might the cache eviction not work as expected?
medium
A. The key expression should be #orderId instead of #order.id
B. The method parameter 'order' is not accessible in SpEL key expression
C. The key expression #order.id requires the 'order' object to be non-null and have a valid id
D. @CacheEvict cannot use complex key expressions
Solution
Step 1: Understand SpEL key expression
The key expression #order.id accesses the id property of the 'order' parameter. This requires 'order' to be non-null and have a valid id.
Step 2: Identify why eviction might fail
If 'order' is null or its id is null, the cache key cannot be resolved, so eviction won't work as expected.
Final Answer:
The key expression #order.id requires the 'order' object to be non-null and have a valid id -> Option C
Quick Check:
SpEL key needs valid object and property [OK]
Hint: Ensure key objects are non-null with valid properties [OK]
Common Mistakes:
Assuming key expressions cannot use object properties
Using wrong parameter names in key expression
Believing @CacheEvict cannot handle complex keys
5. You have a Spring Boot service with two caches: "users" and "sessions". You want to clear all entries in "sessions" cache whenever a user is deleted, but keep "users" cache intact. Which @CacheEvict usage correctly achieves this in the deleteUser method?
public void deleteUser(Long userId) {
userRepository.deleteById(userId);
// cache eviction here
}
hard
A. @CacheEvict(cacheNames = "sessions", key = "#userId") on deleteUser method
B. @CacheEvict(cacheNames = {"users", "sessions"}, allEntries = true) on deleteUser method
C. @CacheEvict(cacheNames = "users", key = "#userId") on deleteUser method
D. @CacheEvict(cacheNames = "sessions", allEntries = true) on deleteUser method
Solution
Step 1: Understand requirement
We want to clear all entries in "sessions" cache only, not affect "users" cache.
Step 2: Analyze options
@CacheEvict(cacheNames = "sessions", allEntries = true) on deleteUser method clears all entries in "sessions" cache, matching requirement. @CacheEvict(cacheNames = {"users", "sessions"}, allEntries = true) on deleteUser method clears both caches, which is incorrect. @CacheEvict(cacheNames = "users", key = "#userId") on deleteUser method clears only one user key in "users" cache, not sessions. @CacheEvict(cacheNames = "sessions", key = "#userId") on deleteUser method clears one key in "sessions" cache, not all.
Final Answer:
@CacheEvict(cacheNames = "sessions", allEntries = true) on deleteUser method -> Option D
Quick Check:
allEntries=true clears entire cache [OK]
Hint: Use allEntries=true on target cache to clear all keys [OK]
Common Mistakes:
Clearing wrong cache or multiple caches unintentionally
Using key instead of allEntries to clear entire cache
Assuming deleting user clears user cache automatically
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.