首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring缓存的AbstractCacheInvoker doPut()方法错误地调用了RedisCache put()方法

Spring框架中的缓存抽象提供了一种声明式的方式来管理应用程序的缓存。AbstractCacheInvoker 是Spring缓存抽象中的一个关键组件,它负责调用具体的缓存实现方法。如果你遇到了 doPut() 方法错误地调用了 RedisCacheput() 方法的问题,这可能是由于配置错误或者代码逻辑问题导致的。

基础概念

  • Spring缓存抽象:Spring框架提供的一套缓存管理机制,允许开发者通过注解(如 @Cacheable, @CachePut, @CacheEvict)来声明缓存行为。
  • AbstractCacheInvoker:Spring缓存抽象中的一个类,负责调用具体的缓存实现方法。
  • RedisCache:Spring Data Redis模块中的一个类,实现了Spring缓存抽象,用于与Redis缓存服务器交互。

可能的原因

  1. 配置错误:Spring的缓存配置可能不正确,导致 AbstractCacheInvoker 调用了错误的缓存实现。
  2. 代码逻辑问题:自定义的缓存管理器或者缓存实现类中可能存在逻辑错误,导致 doPut() 方法调用了不应该调用的方法。
  3. 版本兼容性问题:Spring框架或者Spring Data Redis的版本之间可能存在兼容性问题。

解决方法

检查配置

确保你的Spring缓存配置正确无误。例如,如果你使用的是Java配置,确保你的配置类正确地声明了缓存管理器:

代码语言:txt
复制
@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(10)) // 设置缓存过期时间
            .disableCachingNullValues();

        return RedisCacheManager.builder(redisConnectionFactory)
            .cacheDefaults(config)
            .build();
    }
}

检查代码逻辑

如果你有自定义的缓存管理器或缓存实现类,确保它们的逻辑是正确的。例如,如果你重写了 doPut() 方法,确保它正确地调用了相应的方法:

代码语言:txt
复制
public class CustomCacheInvoker extends AbstractCacheInvoker {

    @Override
    protected void doPut(Object key, Object value) {
        // 确保这里调用的是正确的缓存实现方法
        getCache().put(key, value);
    }
}

版本兼容性

检查Spring框架和Spring Data Redis的版本是否兼容。如果不兼容,尝试升级或降级其中一个库的版本,以解决兼容性问题。

应用场景

Spring缓存抽象广泛应用于需要提高数据访问性能的应用程序中。例如,在Web应用程序中,可以使用缓存来存储频繁访问但不经常变化的数据,如用户信息、商品信息等。

示例代码

以下是一个简单的示例,展示了如何在Spring Boot应用程序中使用Redis缓存:

代码语言:txt
复制
@SpringBootApplication
@EnableCaching
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(10))
            .disableCachingNullValues();

        return RedisCacheManager.builder(redisConnectionFactory)
            .cacheDefaults(config)
            .build();
    }
}

@Service
public class UserService {

    @Cacheable(value = "users", key = "#userId")
    public User getUserById(String userId) {
        // 模拟从数据库中获取用户信息
        return new User(userId, "John Doe");
    }

    @CachePut(value = "users", key = "#user.userId")
    public User updateUser(User user) {
        // 模拟更新用户信息
        return user;
    }
}

在这个示例中,UserService 类中的 getUserById 方法使用了 @Cacheable 注解来声明缓存行为,而 updateUser 方法使用了 @CachePut 注解来更新缓存。

通过以上步骤,你应该能够诊断并解决 AbstractCacheInvoker doPut() 方法错误地调用了 RedisCache put() 方法的问题。如果问题仍然存在,建议查看具体的错误日志和堆栈跟踪信息,以便进一步定位问题所在。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 第一篇:SpringBoot高级-缓存入门

    ;并支持使用JCache(JSR-107)注解简化我们开发; Cache接口为缓存的组件规范定义,包含缓存的各种操作集合; Cache接口下Spring提供了各种xxxCache的实现;如RedisCache...,EhCacheCache , ConcurrentMapCache等; 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果...使用Spring缓存抽象时我们需要关注以下两点; 确定方法需要被缓存以及他们的缓存策略 从缓存中读取之前缓存存储的数据 重要概念和缓存注解 Cache 缓存接口,定义缓存操作。...实现有:RedisCache、EhCacheCache、ConcurrentMapCache等 CacheManager 缓存管理器,管理各种缓存(Cache)组件 @Cacheable 主要针对方法配置...; 4、将目标方法返回的结果,放进缓存中ConcurrentMapCache.put(); ​ @Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,

    65140

    玩转Spring Cache --- @Cacheable@CachePut@CacheEvict注解的原理深度剖析和使用【享学Spring】

    前言 上篇文章介绍了@EnableCaching,用它来开启Spring对缓存注解的支持。本篇文章将继续分析Spring Cache,并且讲解的是我们最为关心的:缓存注解实操方面的原理支持和使用。...开发过程中因注解的优雅、使用简单使得这种方式广泛被大家所接受和使用,本文将按照先原理,再实操的步骤,一步步解惑Spring缓存注解的原理 缓存注解 关于Spring的缓存注解,一共有如下5个: @Cacheable...处理缓存注解的步骤总结 Spring Cache是Spring框架的核心模块之一,不可谓不重要。用了好几篇文章专门来讲解使用、分析原理。...执行对应的doPut / doGet / doEvict / doClear 等等。...大多数情况下我们都不需要特别的指定缓存注解使用的管理器,因为它自己会去容器里找。 但是,但是,但是当你使用了多套缓存时,我还是建议显示的指定的。

    11.7K51

    maven+springmvc+mybatis+redis 缓存查询实例,附有源码地址,使用redis注解和hash数据格式set,get两种方式讲解

    redis配置文件对应的缓存管理器的id值 key = "'insertUser'":是你要缓存到redis中的值,下次spring会直接通过key获取结果。...注意key的值中还有个单引号。 @Cacheable:适合查询,有返回值的方法上。因为,每次请求在进入方法之前,spring会先从缓存服务器中查找对应的key,如果有,就直接返回。...因为spring不会事先去缓存服务器中查询数据,而是直接执行方法,然后将结果通过key保存到缓存中。这样是防止数据不一致。 以上都写好后可以启动服务器,然后运行。...为了明显,我在serviceImpl中查询方法中有个输出,你可以先注释掉缓存注解运行,发现每次都会输入。当你启动注解时,没有输入。说明spring每次回自动到缓存中查找数据。...,并且步骤下面的方法,这里我是没看懂是什么原理,所以我这里又写了第二种方法,在系统启动时把需要缓存的表数据以hash的数据机构加载到redis中。

    63520

    玩转Spring Cache --- @Cacheable@CachePut@CacheEvict缓存注解相关基础类打点【享学Spring】

    若我们需要扩展缓存注解的能力,对这些抽象是非常有必要深入了解的~ Spring内置的三大注解缓存是: Cacheable:缓存 CacheEvict:删除缓存 CachePut:更新缓存 CacheOperation...,就是获取标注在方法上的缓存注解们。...Nullable protected abstract CacheOperationSource getCacheOperationSource(); } CacheErrorHandler 处理缓存发生错误时的策略接口...在大多数情况下,提供者抛出的任何异常都应该简单地被抛出到客户机上,但是在某些情况下,基础结构可能需要以不同的方式处理缓存提供者异常。...总结 本篇文章为讲解缓存注解的深入原理分析进行铺垫,所以密切关注这篇文章: 【小家Spring】玩转Spring Cache — @Cacheable/@CachePut/@CacheEvict注解的使用以及原理深度剖析

    5.1K31

    玩转Spring Cache --- 整合分布式缓存Redis Cache(使用Lettuce、使用Spring Data Redis)【享学Spring】

    前言 最近都在聊Spring的缓存抽象Spring Cache,上篇文章深入介绍了Spring Cache集成进程缓存的第三方组件如Caffeine、Ehcache,若对此篇文章感兴趣,可移步观看...:【小家Spring】玩转Spring Cache — 整合进程缓存之王Caffeine Cache和Ehcache3.x 我们知道现在的应用大都以微服务的方式进行分布式部署,因此如果仅仅使用本地缓存是...so,本文就以大伙最关心、最熟悉的Redis这个缓存产品为例,让它和Spring Cache集成,达到分布式中心缓存的效果(支持缓存直接直接操作)。...方法,都是带有TTL的,因为Redis是支持过期时间的嘛 // 多疑依托于此方法,我们其实最终可以定义出支持TTL的缓存注解,下篇博文见 void put(String name, byte[] key...、unlock处理,有兴趣的可以看看此类,因为不是本文重点,所以此处不说明了 // 其余方法,都是调用了execute方法 @Override public void put(String name

    5.9K31

    Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

    至此,我们已经成功地在项目中集成了Mybatis,增添了与数据库交互的能力。但是这还不够,一个现代化的Web项目,肯定会上缓存加速我们的数据库查询。...接下来,将介绍如何科学地将Redis集成到Mybatis的二级缓存中,实现数据库查询的自动缓存。 集成Redis 配置Redis 同访问数据库一样,我们需要配置Redis的连接信息。...该接口共有以下五个方法: String getId():mybatis缓存操作对象的标识符。一个mapper对应一个mybatis的缓存操作对象。...如果获取到老的对象,说明缓存失效的代码执行失败,代码存在错误,反之则说明我们代码是OK的。 书写单元测试是一个良好的编程习惯。...总结 本篇文章介绍了如何通过Spring Boot、Mybatis以及Redis快速搭建一个现代化的Web项目,并且同时介绍了如何在Spring Boot下优雅地书写单元测试来保证我们的代码质量。

    1K20

    从Spring缓存源码看大神编程思想

    从Spring缓存源码看大神编程思想 随着用户的增长我们,数据库承受的压力越来越大,此时我们就需要使用Spring中的缓存,减少用户的操作直击数据库带来的风险。...在使用Spring缓存的时候我们通常会使用org.springframework.cache包下的一些注解,但是这篇文章并不是介绍这几个注解的使用方式,而是通过解读该包下的源代码,透过代码看看Spring...initializeCaches 这是这个类的初始化缓存的方法: public void initializeCaches() { //实际存储缓存的map private final...,初始化时先从loadCaches()方法加载以前的缓存,经过处理将缓存的key放进set中,将从redis取出的缓存载入内存中。...来看看初始化方法中调用的方法: loadCaches @Override protected CollectionRedisCache> loadCaches() { List

    70160

    7min到40s:SpringBoot启动优化实践

    至此基本可以断定,高耗时的原因就是在初始化 Spring 的 context,然而这个方法依然十分复杂,好在 refresh 方法也将初始化 Spring 的 context 的过程做了整理,并详细注释了各个步骤的作用...该组件接入方式与上文描述的接入方式类似,通过添加扫描服务的根路径"com.xxx.ad.rediscache",注入对应的 Bean 对象;查看该缓存组件项目的源码,发现该路径下有一个 config 类注入了一个缓存管理对象...CacheManager,其实现类是 RedisCacheManager: 缓存组件代码片段: 本次优化中,我是通过 每次删除一条扫描路径,启动服务后根据启动日志中 Bean 缺失错误的信息,来逐个梳理...配置类,根据现有条件推断,尽可能地为我们配置需要的 Bean。...jar 中的 spring.factotries 文件,将 XxxAdCacheConfiguration 配置类自动引入,而不需要扫描"com.xxx.ad.rediscache"整个路径了: #

    23310

    Shiro 集成 Spring 之授权缓存

    本章我们就来讲讲如何将 Shiro 中的授权数据缓存到 Redis 中。 API Shiro 为授权数据的缓存提供了两个借口,一个是 CacheManager,一个是 Cache。...return redisCache; } } 这里在 createCache() 方法中返回我们的自定义 RedisCache 对象即可。...> Test 然后我们分别在 Realm 的 doGetAuthorizationInfo 方法和 RedisCache 的 get 方法中分别打印一条日志,看何时会访问数据库,何时会访问 Redis...缓存的数据。...但使用这种缓存还有一个比较重要的事情,就是当数据库中的授权数据发生修改时,也要记得刷新缓存中的数据,不然会出现数据错乱,实现方式可以通过直接覆盖缓存,消息队列通知等方式,需要根据不同项目来选区不同方式,

    65730

    3 Springboot中使用redis,redis自动缓存异常处理

    在上一篇中,提到了使用配置文件来定义连接信息,由于前面讲的都是框架自动使用redis缓存数据,那么如果出现了异常又该怎么处理?...打开AbstractCacheInvoker类,看到里面有put,get,evict等方法,就是对应在repository的注解,还有个无参的构造方法里初始化了一个SimpleCacheErrorHandler...这个类就是处理redis缓存异常的类,发现里面只是简单的在异常时throw Exception,这也导致了如果redis异常,那么程序就会抛出异常,像query时,如果redis异常,那程序就不再往下进行...RuntimeException e, Cache cache) { } }; return cacheErrorHandler; } } 然后就可以在对应的方法上加自己的处理...再试一下save或者get操作,发现系统已经不报错了,进入了我们自定义的errorHandler方法中。 下一篇继续探讨redis的其他使用方法。

    2K40

    7min到40s:SpringBoot启动优化实践

    至此基本可以断定,高耗时的原因就是在初始化 Spring 的 context,然而这个方法依然十分复杂,好在 refresh 方法也将初始化 Spring 的 context 的过程做了整理,并详细注释了各个步骤的作用...该组件接入方式与上文描述的接入方式类似,通过添加扫描服务的根路径"com.xxx.ad.rediscache",注入对应的 Bean 对象;查看该缓存组件项目的源码,发现该路径下有一个 config 类注入了一个缓存管理对象...CacheManager,其实现类是 RedisCacheManager: 缓存组件代码片段: 本次优化中,我是通过 每次删除一条扫描路径,启动服务后根据启动日志中 Bean 缺失错误的信息,来逐个梳理...配置类,根据现有条件推断,尽可能地为我们配置需要的 Bean。...3.2 使用 starter 机制,开箱即用了解缓存失效的原因后,就有解决的办法了,因为是自己团队的组件,就没必要通过 JavaConfig 显式手动导入的方式改造,而是通过 SpringBoot 的

    3.3K12

    Spring 整合 Redis

    -- spring自己的缓存管理器,这里定义了缓存位置名称 ,即注解中的value --> <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager...注释介绍 @Cacheable 作用和配置方法 @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 主要的参数 value 缓存的名称...@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用 @CachePut 主要的参数 value...////////////////////////////// @CacheEvict 作用和配置方法 @CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 @CacheEvict...主要的参数 value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个例如: @CachEvict(value=”mycache”) 或者 @CachEvict(value={”

    52220

    Spring Boot + Mybatis + Redis二级缓存开发指南

    但是这还不够,一个现代化的Web项目,肯定会上缓存加速我们的数据库查询。接下来,将介绍如何科学地将Redis集成到Mybatis的二级缓存中,实现数据库查询的自动缓存。...该接口共有以下五个方法: String getId():mybatis缓存操作对象的标识符。一个mapper对应一个mybatis的缓存操作对象。...需要注意的是,这里不能通过autowire的方式引用redisTemplate,因为RedisCache并不是Spring容器里的bean。...这样在更新product信息时,能够自动失效缓存(本质上调用的是clear方法)。...如果获取到老的对象,说明缓存失效的代码执行失败,代码存在错误,反之则说明我们代码是OK的。 书写单元测试是一个良好的编程习惯。

    1.2K30

    SpringBoot集成Redis实现缓存处理(Spring AOP技术)

    学过Spring框架的都知识,Spring框架难以避免地需要配置不少XMl,而使用SpringBoot框架的话,就可以使用注解开发,极大地简化基于Spring框架的开发。...SpringBoot充分利用了JavaConfig的配置模式以及“约定优于配置”的理念,能够极大的简化基于SpringMVC的Web应用和REST服务开发。...基于这个,我们可以实现自定义的元注解 我们设置RedisCache基于Method方法级别引用。...AOP实现监控所有被@RedisCache注解的方法缓存 先从Redis里获取缓存,查询不到,就查询MySQL数据库,然后再保存到Redis缓存里,下次查询时直接调用Redis缓存 package org.muses.jeeplatform.cache...注解的方法都会实现Redis缓存处理 ?

    1.4K10

    玩转Spring Cache --- 扩展缓存注解支持失效时间TTL【享学Spring】

    :Spring Cache抽象本省是并不支持Expire失效时间的设定的,我粗暴的把它归为了Spring Cache抽象的一个设计上的bug,可参考文章:【小家Spring】玩转Spring Cache...、Redis等几乎所有第三方实现都支持) xxxCacheManager管理的xxxCache必须扩展了Expire的实现 因为缓存的k-v键值对具有自动失效的特性实在太重要和太实用了,所以虽然org.springframework.cache.Cache...它没有实现Expire,但好在第三方产品对Spring缓存标准实现的时候,大都实现了这个重要的失效策略,比如典型例子:RedisCache。...里配置的为准 若多个方法里配置了同一个CacheName,TTL以第一个执行的生成Cache的方法配置的为准 总之一个原则:TTL是和Cache绑定的,且是在Cache在首次被初始化的时候就被指定好了...另外关于Spring缓存其实还有一个重要知识点:缓存即将过期时主动刷新缓存: 因为缓存失效后,就会有一些请求会打到DB上,这段时间如果是高并发的话DB压力就很大(sync=true可以有一定的缓解作用

    8.9K102

    扩展spring cache 支持缓存多租户及其自动过期

    spring cache 的概念 Spring 支持基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象...,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。...默认的spring cache 根据入参来区分 不能满足多租户系统的设计需求,不能实现根据租户隔离。 区分缓存增加租户标识 ?...创建缓存的方法,通过截取 value 中设置的过期时间,赋值给你RedisCacheConfiguration public class RedisAutoCacheManager extends RedisCacheManager...cache 操作缓存时 获取到上步设置的ttl 赋值给key @Override public void put(Object key, @Nullable Object value) {

    1.7K10

    Spring Boot+Mybatis+Redis二级缓存开发指南

    接下来,将介绍如何科学地将Redis集成到Mybatis的二级缓存中,实现数据库查询的自动缓存。 集成Redis 配置Redis 同访问数据库一样,我们需要配置Redis的连接信息。...用于实现原子性的缓存操作。 接下来,我们新建 RedisCache 类,实现 Cache 接口: 讲解一下上述代码中一些关键点: 自己实现的二级缓存,必须要有一个带id的构造函数,否则会报错。...需要注意的是,这里不能通过autowire的方式引用redisTemplate,因为RedisCache并不是Spring容器里的bean。...product信息时,能够自动失效缓存(本质上调用的是clear方法)。...如果获取到老的对象,说明缓存失效的代码执行失败,代码存在错误,反之则说明我们代码是OK的。 书写单元测试是一个良好的编程习惯。

    1.8K100
    领券