当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring缓存处理redis异常?

穆毅然
2023-03-14

我目前正在从事一个项目,该项目同时包含spring data redis和spring Cache。在spring data redis中,我使用redis模板调用redis。我在try-catch块中处理redis模板引发的所有异常,如下所示:

   try{
       // execute some operation with redis template
    }
    catch(RedisCommandTimeoutException ex){

    }
    catch(RedisBusyException ex){

    }
    catch(RedisConnectionFailureException ex){

    }
    catch(Exception ex){

    }

我可以使用一个类似的try块来处理来自@cacheable的异常吗?如何处理可缓存中的redis引发的异常?

共有1个答案

严俊彦
2023-03-14

我相信您想要定义自己的CacheErrorHandler,它将处理@Cachable@CachePut,以及@cacheexecute

您将定义CacheErrorHandler

import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.cache.interceptor.CacheErrorHandler;

@Slf4j
public class CustomCacheErrorHandler implements CacheErrorHandler {
    @Override
    public void handleCacheGetError(RuntimeException e, Cache cache, Object o) {
        log.error(e.getMessage(), e);
    }

    @Override
    public void handleCachePutError(RuntimeException e, Cache cache, Object o, Object o1) {
        log.error(e.getMessage(), e);
    }

    @Override
    public void handleCacheEvictError(RuntimeException e, Cache cache, Object o) {
        log.error(e.getMessage(), e);
    }

    @Override
    public void handleCacheClearError(RuntimeException e, Cache cache) {
        log.error(e.getMessage(), e);
    }
}

然后注册它:

import org.springframework.cache.annotation.CachingConfigurerSupport;  
import org.springframework.cache.interceptor.CacheErrorHandler;  
import org.springframework.context.annotation.Configuration;

@Configuration
public class CachingConfiguration extends CachingConfigurerSupport {  
    @Override
    public CacheErrorHandler errorHandler() {
        return new CustomCacheErrorHandler();
    }
}
 类似资料:
  • 在定义缓存时,不管提供程序是什么(对于intance Caffeine来说),我们通常将它们定义为bean,然后通过Spring Boot的自动配置将bean解析为。例如 不幸的是,这在Redis中是不可能的,因为它的实现不是公共的。 我们喜欢做的另一件事是定义bean,例如使用咖啡因 因此,目前唯一的解决方案是创建我们自己的RedisCacheManager,但这会阻止的使用。 所以这是我的问题

  • 问题内容: 当redis达到“最大内存”条件时,它将允许客户端进行读取,但不能进行写入。 当然,这将导致致命错误……有什么方法可以使Rails处理缓存的读或写错误,因此,如果缓存发生问题(可用性,读取,写入等),它将继续以如果缓存设置为“关闭”? 问题答案: 您可以告诉redis在内存已满时要遵守的不同行为。 默认是 也许最好的选择是’volatile-ttl’,并确保所有缓存都包括:expire

  • 本文向大家介绍Spring Cache手动清理Redis缓存,包括了Spring Cache手动清理Redis缓存的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 注册cacheRedisTemplate 将 cache 的 RedisTemp

  • 1. 前言 在MyBatis 缓存一节中,我们介绍了 MyBatis 的多级缓存。MyBatis 的二级缓存可在多个会话中共享缓存,但是这也加大了内存的使用空间,如果二级缓存空间占有量过多势必会导致程序运行空间的不足,因此我们需要将二级缓存转移到专业的缓存服务器上。 Redis 是一个高性能的 kv 数据库,被广泛的使用在缓存服务上,MyBatis 项目开发者提供了 Redis 缓存的实现。本小节

  • 如果在记录的初始过期时间之前访问记录,则需要重置过期时间。我使用Spring数据redis API使用Redis作为缓存。我正在使用RediscacheManager的setDefaultEx的(5000)设置默认过期。无法找到有关重置到期时间的任何解决方案或留档。感谢任何指导。 此外,我想知道,为什么这不能成为Redis缓存的一个自然功能,毕竟,它应该从缓存中获取最常用的记录。

  • 我们在我们的项目中实现了Moya,RxSwift和Alamofire作为pod。 有人知道你是如何使用这种技术来控制每个url请求的缓存策略的吗? 我已经阅读了Moya的GitHub页面上的许多问题,但仍然没有发现任何问题。还尝试使用存储为sampleData文件的实际json响应,如下所示: null