skip to Main Content

I am using spring boot with Redis.Redis is running as Docker container

spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379 

Redis is a memory DB, if it finds data in Redis based on the key, it retrieved from Redis otherwise go into actual db call.
when Redis is running, code works fine. but sometimes for any reason, if Redis is down, I am getting exception RedisConnectionException: Unable to connect to localhost:6379

I want to make it optional. if it gets down, code should work as it is, by calling actual DB data(sql service repositories).

is there any way to make Redis call as optional.

if running, work with Redis, 
if down, can to actual DB without exception.

my code

@Cacheable(cacheNames = CACHE_USER_DETAILS)
    public User getUserDetails(String username) {
      //call data from sql serever via repositories.
}

2

Answers


  1. Chosen as BEST ANSWER

    I fixed the problem by creating own error handler and overried the spring cache error handler

    package com.crif.credity.tenancy;
    
    import org.springframework.cache.Cache;
    import org.springframework.cache.annotation.CachingConfigurerSupport;
    import org.springframework.cache.interceptor.CacheErrorHandler;
    import org.springframework.cache.interceptor.KeyGenerator;
    import org.springframework.context.annotation.Configuration;
    
    import com.crif.credity.config.CredityKeyGenerator;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Configuration
    public class CachingConfiguration extends CachingConfigurerSupport {
        
        @Override
        public KeyGenerator keyGenerator() {
            return new CredityKeyGenerator();
        }
        
        @Override
        public CacheErrorHandler errorHandler() {
            return new CredityRedisCacheErrorHandler();
        }
    
        
        @Slf4j
        public static class CredityRedisCacheErrorHandler implements CacheErrorHandler {
    
            @Override
            public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
                log.info("Unable to get from cache " + cache.getName() + " : " + exception.getMessage());
            }
    
            @Override
            public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
                log.info("Unable to put into cache " + cache.getName() + " : " + exception.getMessage());
            }
    
            @Override
            public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
                log.info("Unable to evict from cache " + cache.getName() + " : " + exception.getMessage());
            }
    
            @Override
            public void handleCacheClearError(RuntimeException exception, Cache cache) {
                log.info("Unable to clean cache " + cache.getName() + " : " + exception.getMessage());
            }
        }
        
        
    }
    

  2. Since you are using @Cachaeble spring abstraction for caching, Write a class which implements CacheErrorHandler interface.You can override it’s methods and do your logic side(For example log the error).

    If the redis is down, getUserDetails(String username ) will be done automatically.

    Check out this question

    Hope this helps.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search