У меня есть приложение, развернутое в AWS EC2, иногда (редко), я не могу подключиться и выполнить какую-либо команду в redis, я выясняю причину этой проблемы.
Я использую Springboot + Redis (Elasticcache).
Я использую оболочку для перехвата любых исключений, чтобы продолжить процесс запроса.
Моя оболочка:
class RedisCacheWrapper implements Cache {
private final Cache delegate;
public RedisCacheWrapper(Cache redisCache) {
Assert.notNull(redisCache, "delegate cache must not be null");
this.delegate = redisCache;
}
@Override
public String getName() {
try {
return delegate.getName();
} catch (Exception e) {
return handleException(e);
}
}
@Override
public Object getNativeCache() {
try {
return delegate.getNativeCache();
} catch (Exception e) {
return handleException(e);
}
}
@Override
public ValueWrapper get(Object key) {
try {
return delegate.get(key);
} catch (Exception e) {
return handleException(e);
}
}
@Override
public <T> T get(Object o, Class<T> type) {
try {
return delegate.get(o, type);
} catch (Exception e) {
return handleException(e);
}
}
@Override
public <T> T get(Object o, Callable<T> callable) {
try {
return delegate.get(o, callable);
} catch (Exception e) {
return handleException(e);
}
}
@Override
public void put(Object key, Object value) {
try {
delegate.put(key, value);
} catch (Exception e) {
handleException(e);
}
}
@Override
public ValueWrapper putIfAbsent(Object o, Object o1) {
try {
return delegate.putIfAbsent(o, o1);
} catch (Exception e) {
return handleException(e);
}
}
@Override
public void evict(Object o) {
try {
delegate.evict(o);
} catch (Exception e) {
handleException(e);
}
}
@Override
public void clear() {
try {
delegate.clear();
} catch (Exception e) {
handleException(e);
}
}
private <T> T handleException(Exception e) {
log.error("handleException", e);
return null;
}}
В моей конфигурации redisЯ установил тайм-аут на 1 с.Таким образом, когда команда connect / не выполняется через 1 с, redis создает исключение, подобное следующему:
Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out
Мои сомнения: есть хороший способ отключить временный кэш (без развертывания), в то время как redisнехорошо?Например: Использование разрыва цепи?
Я думаю, что сделайте это:
@Cacheable()
myMethodCached(){
myRealMethod();
}
myRealMethod(){}
Поместите «myMethodCached» в HystrixCommand, если выброшено время ожидания, тогда метод отката выполняется без использования redis.
Проблема этого подхода заключается в том, что мне нужно создать «запасной вариант» для всех методов, использующих кеш, я бы хотел «отключить» глобально (весь кеш будет пропущен).
Есть ли хорошее решение "отключить" redis на время?