Spring Boot Caching

Juhi Sinha
Last Updated: May 13, 2022

Introduction

A developer needs to take care of every second while building an application. Using Caching in Spring boot, developers can make their applications fast.

In this article, we will learn about Spring Boot Caching. So, without any further ado, let's get started!

What is Caching?

Caching is a technique for increasing the performance of any application. It works with a cache, a temporary rapid access software or hardware component that saves data to minimize its time to serve subsequent requests for the same data. Caching is challenging to grasp, but it is virtually unavoidable for any developer. 

Why do we need caching?

Caching frequently used data in applications is a popular strategy for improving application speed and is less expensive. We keep frequently used data in memory with caching to avoid accessing the expensive backends every time a user wants the data. Accessing data from memory is always faster than retrieving data from a database, file system, or other service calls.

What data should be cached?

We should use those data for caching that does not change regularly and often used read queries in which the results do not switch between calls, at least for a while.

Different Types of Cache

There are four types of caching that are given below:

 

  • In-memory caching

This is the most common area where caching is employed extensively to improve application performance. Because the data is kept in RAM, it is much faster than traditional databases that save data on the disc. Because RAM is restricted compared to disc, cache invalidation methods like least recently used (LRU) can help invalidate 'cold' entries while keeping 'hot' data in RAM.

Memcached and Redis are in-memory caches that act as key-value stores between our application and data storage. Memcached is an in-memory caching system, but Redis is a more advanced system that allows us to backup and restores data and manage caching in distributed clusters.

 

  • Database caching

Our database's default setup typically includes some level of caching, which is suited for a generic use case. These variables can be altered for individual usage patterns to improve performance. 

 

  • Web server caching

Varnish and other reverse proxies and caches may directly serve static and dynamic material. Web servers can also cached requests, returning results without contacting application servers. This technique is practical in today's API age if we wish to cache API responses at the webserver level.

 

  • CDN caching

The CDN stands for Content Delivery Network. It's a feature seen in many modern online applications. It enhances content delivery by replicating requested files over a worldwide network of cache computers. The CDN lowers the burden on an application's origin and enhances the user experience. It distributes a local copy of the material from a cache edge, also known as a Point of Presence.

Spring Boot Cache Annotations

Let us look at how we configure caching using annotations:

  • @EnableCaching

Spring's annotation-driven cache management feature is enabled. We must include it in the boot application class annotated with @SpringBootApplication in the spring boot project. Spring's default cache is a single concurrent hashmap, but we can easily modify CacheManager to register external cache providers.

  • @Cacheable

It's an annotation at the method level. It establishes a cache for the return value of a method. The Spring Framework takes care of the method's requests and answers to the cache defined in the annotation attribute. 

More possibilities are available with the @Cacheable annotation. We can, for example, specify the cache key from the method's request. If no key information is provided, spring will utilize all of the class fields as cache keys, but we may avoid this behavior by supplying key information.

The return value of the method courseAvailable() is stored in cacheCourseAvailable and id identifies each entry in the cache in the example given below:

 

@Cacheable(value="cachecourseAvailable", key="#id")  
public List courseAvailable() 
{  
//code..   
return courseDetails;  
}  

 

The condition attribute can also be used to apply a condition to an annotation. Conditional caching occurs when we apply the condition in the annotation.

For example, if the argument name is less than 10, the following procedure will be cached:

 

@Cacheable(value="course", condition="#name.length<10")  
public Course findCourse(String name)  
{  
//code..  
} 

 

  • @CachePut

We may need to manually adjust the caching to put cache before the method call on occasion. This will allow us to refresh the cache while also running the method. The method will always run, and the result will be cached.

Note: It is generally discouraged to use the @CachePut and @Cacheable annotations on the same method because they have different behaviors. While the latter uses the cache to avoid the method execution, the former forces the execution to perform a cache update.
  • @CacheEvict

It's used when we need to delete the master data cache that was previously loaded. The cache will be cleared when CacheEvict annotated methods are run.

To remove the cache, we can specify the key here; but, if we want to remove all cache entries, we must use allEntries=true. When an entire cache region needs to be wiped away, this option is useful because instead of evicting each entry individually, all entries are eliminated in one operation.

The @CacheEvict annotation can be used in the following ways:

  1. It will remove(evict) the cache:
@CacheEvict(allEntries=true)  

 

2.  It will remove(evict) an entry by key:

@CacheEvict(key="#course.course_name")  

 

The annotated method evicts all the data from the cache course_data in the example given below:

@CacheEvict(value="course_data", allEntries=true) /public String getNames(Course course)   
{  
//code  
} 

 

  • @Caching

When we need both CachePut and CacheEvict at the same time, this annotation is required.

Enable Caching in Spring Boot

To begin; we must add a dependency to Maven's pom.xml file.

 

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

 

Second, the application's cache must be enabled:

 

@EnableCaching
public class App { 
 //Spring Boot starter 
}

 

The annotation @EnableCaching triggers a lookup for a CacheManger bean to specify the cache provider. We're ready to use the cache now that we've enabled it. However, because no cache provider was defined, a Simple in-memory provider was used instead. This simple cache is fine for testing, but we utilize a "real" cache in production.

 

FAQs

  1. What is Spring Boot?
    Spring Boot is a Java-based open-source framework for developing microservices. Pivotal Team created it, and it is used to create stand-alone and production-ready spring applications.
     
  2. What is caching?
    Caching is a technique for increasing the performance of any application. It works with a cache, a temporary rapid access software or hardware component that saves data to minimize its time to serve subsequent requests for the same data. 
     
  3. What are the types of caching in Spring Boot?
    The types of caching in Spring Boot are as follows:
  • In-memory Caching
  • Database Caching
  • Web server Caching
  • CDN Caching

Key Takeaways

We’ve learned about Spring Boot Caching, different types of caching, and Spring Boot Annotations in this article. 

You can also check our previous blogs on Introduction to Spring BootSpring Boot Auto-configuration, Spring Boot Annotations, and Spring Boot CLI. If you are eager to learn advanced front-end web development, Coding Ninjas is here with one of the best courses available, which you can find here

 

Thank you for reading!

 

Was this article helpful ?
0 upvotes