使redis成为可选的

roqulrg3  于 2021-06-08  发布在  Redis
关注(0)|答案(2)|浏览(313)

我将springboot与redis一起使用。redis作为docker容器运行

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

redis是一个内存db,如果根据key在redis中找到数据,则从redis中取出来,否则进入实际的db调用。当redis运行时,代码工作正常。但有时由于任何原因,如果redis倒下了,我会得到一个例外 RedisConnectionException: Unable to connect to localhost:6379 我想让它成为可选的。如果出现故障,代码应该按原样工作,方法是调用实际的db数据(sql服务存储库)。
有没有办法让redis调用成为可选的。

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

我的代码

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

sigwle7e1#

我通过创建自己的错误处理程序修复了这个问题,并对spring缓存错误处理程序进行了过度评估

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());
        }
    }

}
rkue9o1l

rkue9o1l2#

因为您正在使用@cachaeble spring抽象进行缓存,所以请编写一个实现cacheerrorhandler接口的类。您可以重写它的方法并执行逻辑操作(例如记录错误)。
如果redis关闭,getuserdetails(stringusername)将自动完成。
看看这个问题
希望这有帮助。

相关问题