spring cache 的一大缺陷是无法对集合缓存操作
例如:信箱功能
@Cacheable(value="mailCache",key="#uid+'list'")
public List<Mail> getMails(Integer uid);
@Cacheable(value = "mailCache", key = "#id")
public Mail getMail(Integer id);
@CacheEvict(value = "mailCache", key = "#mail.uid + 'list'")
@CachePut(value = "mailCache", key = "#mail.id")
public Mail update(Mail mail);
@CacheEvict(value = "mailCache", key = "#mail.uid + 'list'")
public Mail saveMail(Mail mail);
这4个接口是一个典型的数据操作接口,get、update、save、findList
其中的缓存的处理分为2部分:实体缓存(get、update、save)、集合缓存(findList)
1、执行get 方法把Mail实体缓存起来
2、执行getMail方法把Mail集合缓存起来
3、执行update更新Maill实体缓存并且清除Mail的集合缓存
4、执行save清除Mail的集合缓存
以上4点的问题所在:
1、save操作无法缓存Mail(因为缺少主键ID,Spring Cache限定了只能从参数中解析key)
2、save、update只能清除Mail的集合缓存,降低了集合缓存的利用率
为此,拓展Spring AOP Cache 添加annotation:@CacheUpdate、@CacheDelete、@CacheSave
1、在@CacheSave注解下,通过方法的返回值生成key,并且把返回值添加至集合Cache中。并且把返回值缓存起来
2、在@CahceUpdate注解下,通过参数生成key,并且把返回值更新至集合Cache中
3、在@CacheDelete注解下,通过参数生成key,并且从集合Cache中移除该实体
4、在@CacheDelete注解下,可以缓存住删除操作
以上3点做法的缺陷:
1、@CacheSave不保证顺序
2、@CacheUpdate需要自行考虑是否适用。例如:
@Cacheable(value="mailCache",key="#uid+'list'")
public List<Mail> getUnReadMails(Integer uid,boolean read){
return find("select * from Mail where uid = ? and read = ?",uid,read);
}
之前的getMail方法,参数只有uid,而uid是一个不变值。所以Mail实体update操作不会改变uid
而getUnReadMails多了一个参数read,Mail实体update是有可能update read从而影响getUnreadMails的缓存,导致不一致(这里的getUnreadMails方法就有可能多出/少一个实体,虽然@CacheUpdate有更新到最新的Mail,但是getUnreadMails的集合会多出这个)
解决办法是正确的使用@CacheDelete和@CacheUpdate
例如:上面这个例子应该在update方法上面加上一个@CacheDelete用于移除掉符合条件的实体
具体的代码因为还缺少同步、测试所以暂时不上传
分享到:
相关推荐
SpringCache与Redis集成,优雅的缓存解决方案 SpringCache是一种基于Java的缓存解决方案,它可以与Redis集成,提供了一种优雅的缓存解决方案。在本文中,我们将对SpringCache与Redis集成的优雅缓存解决方案进行详细...
Spring Cache是一个抽象层,它允许开发者在不关注具体缓存实现的情况下,轻松地在应用程序中添加缓存功能。本篇文章将详细探讨如何通过key值更新Spring Cache中的指定缓存,以及相关的缓存管理策略。 首先,让我们...
在这个项目中,"springcache+redis"的整合意味着我们要利用Spring Cache的特性,将缓存存储在Redis中,以提升应用的性能。 首先,Spring Cache提供了`@Cacheable`、`@CacheEvict`和`@Caching`等注解,允许我们在...
在本项目中,我们主要探讨的是如何将Spring Cache与memcached进行整合,以提升应用程序的性能和效率。Spring Cache是Spring框架的一部分,它提供了一种抽象的缓存管理机制,可以方便地集成到各种缓存解决方案中,如...
**Redis整合SpringCache实例** 在现代的Web应用中,数据缓存是提高系统性能的关键技术之一。本示例主要探讨如何将开源的内存数据结构存储系统Redis与Spring Cache框架结合,实现高效的分布式缓存解决方案。Redis以...
在Spring Boot应用中,Spring Cache是一个强大的工具,用于在应用程序中实现缓存抽象,它可以减少对数据库或远程服务的重复调用,从而提高性能。在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合...
此外,还需要掌握如何将Spring Cache与Redis整合,以便在应用中高效使用缓存机制。 一、Redis的主从配置 1. 准备工作: - 操作系统要求:Ubuntu 16.04。 - Redis版本:选择适合的稳定版本,例如redis-4.0.9.tar....
### Spring Cache核心知识点 #### 一、Spring Cache简介与特性 Spring Cache 是 Spring 3.1 版本引入的一项重要特性,它不是一种具体的缓存实现(如 EHCache 或 OSCache),而是一种缓存使用的抽象层。通过在现有...
Spring Cache 是 Spring 框架的一个重要组成部分,它提供了一种在应用程序中统一管理缓存的能力,无需依赖特定的缓存实现,如 Ehcache、Redis 或 Hibernate 二级缓存等。通过 Spring Cache,开发者可以方便地在方法...
在Spring Boot应用中,Spring Cache是一个强大的功能,它允许我们以声明式的方式管理应用程序的缓存,从而提高性能。Spring Cache抽象了缓存提供者的具体实现,如 EhCache、Redis 或 Hazelcast,使得开发者可以方便...
1、SpringCache是Spring提供的一个缓存框架,在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中,在4.1开始,缓存已支持JSR-107注释和更多自定义的选项 2、Spring Cache利用了AOP,实现了基于注解的缓存...
spring cacke spring cacke
Spring Cache是Spring框架提供的一种抽象层,允许开发者轻松地在应用程序中引入缓存机制,而无需关心具体的缓存实现。本项目"spring-cache-mongodb"正是一个针对Spring Cache的实现,它利用MongoDB作为底层的存储...
标题中的"spring-cache.xsd+spring-encache.xsd"提到了两个XML Schema定义文件,它们是Spring框架中用于缓存管理的配置规范。Spring框架是一个广泛应用的Java企业级应用开发框架,它提供了多种功能,包括但不限于...
《SpringCache深度解析与实战应用》 在Java开发领域,Spring框架因其强大的功能和灵活性而备受推崇。SpringCache是Spring框架的一部分,它提供了一种在应用程序中统一管理和使用缓存的解决方案,使得开发者能够轻松...
在Spring框架中,Spring Cache是用于提供统一的缓存抽象层的一个重要组件,它使得开发者能够在不修改代码的情况下,方便地在应用中引入缓存机制,以提高性能和响应速度。"Spring Cache 复合缓存管理器"指的是通过...
SpringCache是Spring框架提供的一种轻量级的缓存解决方案,旨在简化在应用程序中集成缓存的能力,以提高性能和响应速度。在这个“SpringCache缓存初探共5页.pdf.zip”压缩包中,很可能是对SpringCache的基础知识进行...
《SpringCache与Redis结合在Mybatis中的应用》 在当今的Web开发中,缓存技术是提高系统性能、减轻数据库压力的重要手段。本教程将详细探讨如何将SpringCache与Redis集成,结合Mybatis进行高效的数据缓存。我们将从...
综上所述,"redis-cluster和spring集成,基于cache注解" 的项目是一个使用 Spring Cache 集成 Redis 集群的实例,旨在通过注解的方式简化缓存管理,提高应用性能。开发者可以通过导入提供的项目,快速了解和实践这一...