Introduction
In the previous post Redis Caching, we saw how to use Redis caching with all default settings. We didn’t have any Cache Manager or anything, but we were able to cache data. In this post, we will show how to use RedisCacheManager to cache the data. This manager can further be extended to customize the caching configuration even more. But we will not be looking into customization in this post particularly.
Implement CacheManager for RedisCacheManager
Most of the code for this post will be similar to what we implemented in the previous post. We will just show how to use CacheManager
.
To implement CacheManager
first we remove @EnableCaching
annotation from the main class SpringAppCacheApplication
. Now we add a new CacheConfig
class to configure our cache manager.
Basically, this CacheConfig
will define CacheManager
which build a redisTemplate
to get JedisConnectionFactory
which will be our java client to connect to our Redis server. This JedisConnectionFactory will get server host and port properties from application.properties
file. The source code will look like below:
package com.betterjavacode.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @Configuration @EnableCaching @ComponentScan("com.betterjavacode.config") @PropertySource("classpath:/application.properties") public class CacheConfig extends CachingConfigurerSupport { private static final Logger LOGGER = LoggerFactory.getLogger(CacheConfig.class); private @Value("${spring.redis.host}") String redisHost; private @Value("${spring.redis.port}") int redisPort; @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } @Bean public JedisConnectionFactory redisConnectionFactory() { LOGGER.info(" Inside redisConnectionFactory()..."); JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(); redisConnectionFactory.setHostName(redisHost); redisConnectionFactory.setPort(redisPort); redisConnectionFactory.setUsePool(true); return redisConnectionFactory; } @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory rf) { LOGGER.info(" Inside redisTemplate()..."); RedisTemplate<String, String> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); return redisTemplate; } @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { LOGGER.info(" Inside cacheManager()..."); RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); cacheManager.setDefaultExpiration(300); return cacheManager; } }
Now if we build our application and run it, Spring boot console will show the following output
2018-02-28 20:31:41.913 INFO 9856 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2018-02-28 20:31:42.034 INFO 9856 --- [ main] o.s.j.d.DriverManagerDataSource : Loaded JDBC driver:com.mysql.jdbc.Driver 2018-02-28 20:31:42.244 INFO 9856 --- [ main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default' 2018-02-28 20:31:42.288 INFO 9856 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [ name: default ...] 2018-02-28 20:31:42.495 INFO 9856 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {5.2.13.Final} 2018-02-28 20:31:42.499 INFO 9856 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate .properties not found 2018-02-28 20:31:42.599 INFO 9856 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hiberna te Commons Annotations {5.0.1.Final} 2018-02-28 20:31:43.688 INFO 9856 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dia lect: org.hibernate.dialect.MySQL5Dialect 2018-02-28 20:31:43.764 INFO 9856 --- [ main] o.h.e.j.e.i.LobCreatorBuilderImpl : HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4 2018-02-28 20:31:44.684 INFO 9856 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA Enti tyManagerFactory for persistence unit 'default' 2018-02-28 20:31:45.184 INFO 9856 --- [ main] com.betterjavacode.config.CacheConfig : Inside redisConnectionFactory()... 2018-02-28 20:31:45.288 INFO 9856 --- [ main] com.betterjavacode.config.CacheConfig : Inside redisTemplate()... 2018-02-28 20:31:45.346 INFO 9856 --- [ main] com.betterjavacode.config.CacheConfig : Inside cacheManager()... 2018-02-28 20:31:45.985 INFO 9856 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@30946e09: startup dat e [Wed Feb 28 20:31:37 CST 2018]; root of context hierarchy 2018-02-28 20:31:46.214 INFO 9856 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/cachedemo/v1/companies/{id}/],methods=[GET],produces=[application/json]}" onto public com.betterjavacode.models.Company com.bette rjavacode.resources.CompanyController.getCompany(int) 2018-02-28 20:31:46.217 INFO 9856 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/cachedemo/v1/companies],methods=[GET],produces=[application/json]}" onto public java.util.List<com.betterjavacode.models.Company> com.betterjavacode.resources.CompanyController.getAllCompanies() 2018-02-28 20:31:46.222 INFO 9856 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}"onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframewo rk.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2018-02-28 20:31:46.223 INFO 9856 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web .BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2018-02-28 20:31:46.300 INFO 9856 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-02-28 20:31:46.301 INFO 9856 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-02-28 20:31:46.377 INFO 9856 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-02-28 20:31:47.071 INFO 9856 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2018-02-28 20:31:47.184 INFO 9856 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2018-02-28 20:31:47.195 INFO 9856 --- [ main] c.b.S.SpringAppCacheApplication : Started SpringAppCacheApplication in 10.626 seconds (JVM running for 11.552)
In this console output, we will see our log statements Inside redisConnectionFactory
, Inside redisTemplate
, Inside cacheManager
.
Conclusion
In this short post, we showed how to use RedisCacheManager to configure Redis for a spring boot application.
References
- Redis Cache – Redis