Newsletter

How to Configure Cache in Spring Boot Applications

Spring-Boot-Tutorials » on Jul 29, 2018 { 3 Comments } By Sivateja

In this article, I will explain step by step how to configure cache in spring boot applications.Β  Caching helps to increase the performance of the application by reducing number of round trips between the database or any expensive resources. In real time we will face the scenarios like we have to execute heavy database query and lets say the data in the database will change very rarely, for this kind of scenarios its not a good idea to hit the database for every call, rather just cache the result at the first time when it hits the database and return the same data again for the other calls.

Steps to configure cache in spring boot applications..

  • In pom.xml add spring cache dependency spring-boot-starter-cache module
  • Enable cache in spring boot application by writing theΒ @EnableCaching annotation to the main class
  • AddΒ @Cacheable annotation to the method which you would like to cache the result

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.java4s</groupId>
  <artifactId>SpringBootCache</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  	<parent>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-parent</artifactId>
	    <version>1.5.6.RELEASE</version>
	</parent>
	
	<dependencies>
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-web</artifactId>
	    </dependency>
	    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
	</dependencies>
	
	<properties>
	   <java.version>1.8</java.version>
	</properties> 
  
</project>

SpringBootApp.java

package com.java4s.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class SpringBootApp {
	public static void main(String[] args) {

		 SpringApplication.run(SpringBootApp.class, args);

	}
}

SpringJava4sController.java

package com.java4s.app.controller;

import java.util.Arrays;
import java.util.List;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.java4s.model.Customer;

@RestController
public class SpringJava4sController {

	@RequestMapping("/get-cust-info")
	@Cacheable(value="cacheCustInfo")
	public List customerInformation() {
		
		System.out.println("I am from customerInformation");
		
		List custDetails =  Arrays.asList(
				
				/* 
				 * Here you can add your database logic/flow to get the customer details 
				 * For time being I am hard coding 2 values 
				 */
					
				 new Customer(100,"Bank Of America","USA"),
				 new Customer(101,"Bank Of India","India")
		    );
		    
		return custDetails;
	}
}

Customer.java

package com.java4s.model;

public class Customer {
	
	private int custNo;
	private String name;
	private String country;
	
	public Customer() {
		
	}
	
	public Customer(int custNumber, String name, String country) {
		this.custNo = custNumber;
		this.name = name;
		this.country = country;
	}

	public int getCustNo() {
		return custNo;
	}

	public void setCustNo(int custNo) {
		this.custNo = custNo;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}
	
}

Output

Run the application at..

http://localhost:8080/springbootcache/get-cust-info

I hit/refreshed the above URL several times and still its showing one system out message πŸ™‚ means the cached method executing once and storing its data in the cache with key name cacheCustInfo, and giving the same data back when we make the same service call again.

Note: Cached data will be available until you clear it off manually, spring will not clear the cache automatically after some time. You can integrate some cache providers like EhCache, Redis..or something, so that you can get better control on the cached data.

 

Ref.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html

 

Clear the Cache

Generally from our side we will clean or flush the cache after any update or delete operations, for that we useΒ @CacheEvict annotation on the required method.

@CacheEvict(value = "cacheCustInfo", allEntries=true) // @CacheEvict will clear the cache when delete any customer info from the database.
    public void removeEmployee(Id customerId) {
    
        //Database logic will go here to remove the particular customer from the DB.

    }

How to Disable cache

If we would like to disable the cache, no need to remove all the annotations πŸ™‚ just add the below line in the application.properties file, it takes care everything for you.

spring.cache.type=none

That’s all for now friends πŸ™‚ hope you enjoy the article, you can download and play with the code.

 

​ ​​

You Might Also Like

  ::. About the Author .::

Java4s_Author
Sivateja Kandula - Java/J2EE Full Stack Developer
Founder of Java4s - Get It Yourself, A popular Java/J2EE Programming Blog, Love Java and UI frameworks.
You can sign-up for the Email Newsletter for your daily dose of Java tutorials.

Comments

3 Responses to “How to Configure Cache in Spring Boot Applications”
  1. Mohit Sehra says:

    How spring cache works for mvc?
    If i send request first time spring caches the result in cacheCustInfo , but when i send request again does it use the same cache or creates new cacheCustInfo again?
    And what about request from multiple users?

    • Venkatesh says:

      It uses the same Cache until and unless it sense some change. Coming to multiple users question for each user it creates a proxy object

  2. mohiddin says:

    Hi,

    I'm using cache in my springboot code and @cacheable is applied for one of my get methods in restcontroller and even on the method having jdbctemplate.query for fetching the list from postgre database. but the cache is not working and there is no improvement in performance time.i had used loggers inside the method and i found that everytime its going inside the method instead of loading from cache.

    I had followed all the scenarios you had mentioned in the above tutorial.

Name*
Mail*
Website



By posting your answer, you agree to our comments policy.
Most Recent Posts from Top Categories
Spring Boot Hibernate Spring
Contact | About Us | Privacy Policy | Advertise With Us

© 2010 - 2024 Java4s - Get It Yourself.
The content is copyrighted to Sivateja Kandula and may not be reproduced on other websites.