Bird
Raised Fist0
Spring Bootframework~5 mins

Redis as cache provider in Spring Boot

Choose your learning style10 modes available
Introduction

Redis helps your Spring Boot app remember data quickly. It stores data in memory so your app can get it fast without waiting for slow databases.

You want to speed up repeated data requests in your app.
You need to reduce load on your main database by caching results.
You want to store session data or user preferences temporarily.
You want to share cached data between multiple app instances.
You want a simple way to improve app performance with minimal code changes.
Syntax
Spring Boot
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379

@EnableCaching
@Configuration
public class CacheConfig {

  @Bean
  public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
    return RedisCacheManager.builder(factory).build();
  }
}

Set Redis connection details in application.properties or application.yml.

Use @EnableCaching to activate caching in Spring Boot.

Examples
This caches the result of getBookById in Redis under the 'books' cache.
Spring Boot
@Cacheable("books")
public Book getBookById(Long id) {
  // method logic
}
This removes a specific book from the Redis cache when called.
Spring Boot
@CacheEvict(value = "books", key = "#id")
public void removeBookFromCache(Long id) {
  // method logic
}
This updates the cached book data after modifying it.
Spring Boot
@CachePut(value = "books", key = "#book.id")
public Book updateBook(Book book) {
  // method logic
  return book;
}
Sample Program

This Spring Boot app uses Redis to cache book titles. The first call to getBookTitleById waits 3 seconds, but later calls return instantly from cache.

Spring Boot
package com.example.cache;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.stereotype.Service;

@SpringBootApplication
@EnableCaching
public class CacheApplication {

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

  @Configuration
  static class CacheConfig {
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
      return RedisCacheManager.builder(factory).build();
    }
  }

  @Bean
  public CommandLineRunner demo(BookService bookService) {
    return args -> {
      System.out.println("Calling getBookTitleById(1) first time...");
      String result1 = bookService.getBookTitleById(1L);
      System.out.println("Result: " + result1);
      System.out.println("Calling getBookTitleById(1) second time...");
      String result2 = bookService.getBookTitleById(1L);
      System.out.println("Result: " + result2);
    };
  }

  @Service
  static class BookService {

    @Cacheable("books")
    public String getBookTitleById(Long id) {
      simulateSlowService();
      return "Book Title " + id;
    }

    private void simulateSlowService() {
      try {
        Thread.sleep(3000); // simulate delay
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      }
    }
  }
}
OutputSuccess
Important Notes

Make sure Redis server is running locally or update host/port accordingly.

Cached data stays in Redis until expired or evicted.

Use @Cacheable on methods that return data you want to cache.

Summary

Redis stores data in memory for fast access in Spring Boot apps.

Use @EnableCaching and RedisCacheManager to enable Redis caching.

Annotate methods with @Cacheable to cache their results automatically.

Practice

(1/5)
1. What is the main purpose of using Redis as a cache provider in a Spring Boot application?
easy
A. To store frequently accessed data in memory for faster retrieval
B. To replace the database completely
C. To handle user authentication
D. To serve static web pages

Solution

  1. Step 1: Understand Redis caching role

    Redis stores data in memory, which is much faster than disk storage.
  2. Step 2: Identify caching benefit in Spring Boot

    Caching reduces database calls by storing frequently used data temporarily.
  3. Final Answer:

    To store frequently accessed data in memory for faster retrieval -> Option A
  4. Quick Check:

    Redis cache = fast data access [OK]
Hint: Redis cache speeds up data access by storing in memory [OK]
Common Mistakes:
  • Thinking Redis replaces the database
  • Confusing caching with authentication
  • Assuming Redis serves static files
2. Which annotation is used in Spring Boot to enable caching support when using Redis?
easy
A. @RedisCache
B. @Cacheable
C. @EnableCaching
D. @CacheConfig

Solution

  1. Step 1: Identify the annotation to activate caching

    @EnableCaching is used on a configuration class to turn on caching support.
  2. Step 2: Differentiate from other annotations

    @Cacheable marks methods to cache results, but does not enable caching globally.
  3. Final Answer:

    @EnableCaching -> Option C
  4. Quick Check:

    Enable caching = @EnableCaching [OK]
Hint: Use @EnableCaching to activate caching in Spring Boot [OK]
Common Mistakes:
  • Confusing @Cacheable with enabling caching
  • Using non-existent @RedisCache annotation
  • Mistaking @CacheConfig for enabling caching
3. Given the following Spring Boot method with Redis caching:
@Cacheable("books")
public Book findBookById(Long id) {
    System.out.println("Fetching from DB");
    return bookRepository.findById(id).orElse(null);
}
What will be printed if findBookById(1L) is called twice in a row?
medium
A. Fetching from DB
B. No output
C. Fetching from DB Fetching from DB
D. Error at runtime

Solution

  1. Step 1: Understand @Cacheable behavior

    The first call caches the result and prints "Fetching from DB".
  2. Step 2: Analyze second call output

    The second call returns cached data without executing method body, so no print.
  3. Final Answer:

    Fetching from DB -> Option A
  4. Quick Check:

    Cache avoids repeated DB fetch print [OK]
Hint: First call prints, second uses cache silently [OK]
Common Mistakes:
  • Expecting print on every call
  • Thinking cache disables method
  • Assuming runtime error due to caching
4. Consider this Spring Boot Redis cache configuration snippet:
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
    return RedisCacheManager.builder(factory).build();
}
If the Redis server is down, what will happen when the application tries to cache data?
medium
A. Application falls back to file-based cache
B. Application throws a runtime exception and crashes
C. Data is cached in memory without Redis
D. Caching silently fails but application continues

Solution

  1. Step 1: Understand RedisCacheManager dependency

    RedisCacheManager requires a running Redis server to store cache data.
  2. Step 2: Analyze behavior if Redis is down

    Without Redis, cache operations typically fail silently and the application continues unless explicitly configured to fail.
  3. Final Answer:

    Caching silently fails but application continues -> Option D
  4. Quick Check:

    Redis down usually does not crash app by default [OK]
Hint: Redis down causes silent cache failure unless handled [OK]
Common Mistakes:
  • Assuming fallback to memory cache
  • Thinking caching silently fails
  • Expecting file-based fallback
5. You want to cache the result of a method that returns a list of users filtered by role. Which is the best way to use Redis caching in Spring Boot to avoid caching empty or null results?
public List<User> getUsersByRole(String role) {
    // fetch users
}
hard
A. Use @CachePut to always update cache
B. Use @Cacheable with condition = "#result != null && !#result.isEmpty()"
C. Manually check and cache inside the method
D. Use @Cacheable without any condition

Solution

  1. Step 1: Understand caching empty results issue

    Caching empty or null results wastes cache space and may cause stale data.
  2. Step 2: Use @Cacheable condition attribute

    Adding condition "#result != null && !#result.isEmpty()" caches only meaningful results.
  3. Final Answer:

    Use @Cacheable with condition = "#result != null && !#result.isEmpty()" -> Option B
  4. Quick Check:

    Condition filters empty cache entries [OK]
Hint: Use @Cacheable condition to skip empty results [OK]
Common Mistakes:
  • Caching all results including empty lists
  • Manually caching inside method instead of annotation
  • Using @CachePut which always updates cache
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard