Spring的缓存管理器
在spring项目中提供了CacheManager接口来定义缓存管理器,这样各个不同的缓存就可以实现它来提供管理器的功能了,在spring-boot-starter-data-redis.jar中自动配置了RedisCacheManager(实现了CacheManager接口),可以通过设置spring.cache.cache-names属性在启动时创建其缓存,并且可以使用spring.cache.redis.*属性配置缓存默认值。例如,以下配置创建的cache1和cache2缓存的生存时间为10分钟:
spring.cache.cache-names=cache1,cache2
spring.cache.redis.time-to-live=600000
也可以自己定义RedisCacheManager来完全控制配置。如果您要定制序列化策略,这可能很有用
@Configuration
@EnableCaching
public class RedisConfiguration {
@Bean
public CacheManager redisCacheManager(@Autowired RedisConnectionFactory redisConnectionFactory){
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMillis(10)))
.build();
}
}
@EnableCaching表示spring IoC容器启动了缓存机制。
缓存注解简介
配置了缓存管理器后,Spring就允许用注解的方式使用缓存了。使用的注解有4个
注解 |
描述 |
@Cachable |
表明在进入方法之前,Spring会先从缓存服务器中查找对应key的缓存值,如果找到缓存值,那么Spring将不再调用方法,而是将缓存值直接返回给调用者;如果没有找到缓存值,那么spring就会执行方法,将最后的结果通过key保存到缓存服务器中。 |
@CachePut |
Spring会将该方法的返回值缓存到缓存服务器中。spring不会事先去缓存服务器中查找,而是直接执行方法,然后缓存。 |
@CacheEvict |
移除缓存对应key的值 |
@Caching |
分组注解,能够同时应用与其它缓存 |
上述注解都可以标注在类或者方法上,如果放在类上,表示对所有的方法都有效;如果放在方法上,则只对该方法有效。在大部分情况下或放置在方法上。一般而言,对于查询,我们会考虑使用@Cacheabel,对于插入和修改,考虑使用@CachePut,对于删除操作,我们会考虑使用@CacheEvict。
注解@Cacheable和@CachePut
属性 |
配置类型 |
描述 |
value |
String[] |
缓存的名称,可以引用多个缓存管理器 |
condition |
String |
Spring表达式,true缓存,false不缓存 |
key |
String |
Spring表达式,计算对应缓存的key |
unless |
String |
Spring表达式,如果值为true,则不缓存结果 |
先了解一些Spring表达式和缓存注解之间的约定,通过这些约定去引用方法的参数和返回值的内容,使得其注入key所定义的Spring表达式的结果中。
表达式 |
描述 |
备注 |
#root.args |
定义传递给缓存方法的参数 |
不常用 |
#root.caches |
数组,该方法执行是对应的缓存名称 |
|
#root.target |
执行缓存的目标对象 |
|
#root.targetClass |
目标对象的类,同#root.target.class |
|
#root.method |
缓存方法 |
|
#root.methodName |
缓存方法的名称,同#root.method.name |
|
#result |
方法返回结果值,还可以使用Spring表达式进一步读取其属性 |
该表达式不能用于注解@Cacheable。因为该注解的方法可能不会被执行,这样返回值就无从谈起了 |
#Argument |
任意方法的参数,可以通过方法本身的名称或者下标去定义 |
比如get(Long id),想读取id这个参数,可以写为#id,或者#a0、#p0 |
案例
@Service
@Transactional
public class DepartmentServiceImpl implements DepartmentService {
@Autowired private DepartmentRepository repository;
/**
* 使用@CachePut表示无论如何都会执行方法,将方法返回值再保存到缓存中
* 使用在插入数据的地方,表示插入到数据库后会同步插入到Redis缓存中
* 通过value引用缓存管理器,通过key定义键
* @param department 部门对象
* @return 部门,主键回填
*/
@Override @CachePut(value="redisCacheManager",key="'redis_dept_' + #result.id")
public Department save(Department department) {
repository.save(department);
}
/**
* @CacheEvict删除缓存的key
*/
@Override @CacheEvict(value="redisCacheManager",key="'redis_dept_' + #id")
public void remove(Integer id) {
//repository.deleteById(id);
repository.remove(id);
}
/**
* 使用@Cacheable定义缓存策略
* 当缓存中有值,则返回缓存数据,否则访问方法得到数据
* 通过value引用缓存管理器,通过key定义键
* @param id 部门id
* @return 部门
*/
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Cacheable(value = "redisCacheManager",key = "'redis_dept_' + #id")
public Department find(Integer id) {
return repository.findById(id).orElse(null);
}
@Override @CachePut(value="redisCacheManager",key="'redis_dept_' + #department.id")
public Department edit(Department department) {
repository.saveAndFlush(department);
}
}
注解@CacheEvict
注解@CacheEvict主要是为了移除缓存对应的键值对,主要用于那些删除操作
属性 |
配置类型 |
描述 |
value |
String[] |
缓存的名称,可以引用多个缓存管理器 |
condition |
String |
Spring表达式,true缓存,false不缓存 |
key |
String |
Spring表达式,计算对应缓存的key |
allEntries |
boolean |
true删除特定缓存的所有键值对,默认为false【慎用】 |
beforeInvocation |
boolean |
在特定方法后移除缓存,true在方法前移除,false则在方法后移除,默认false |
不适用缓存的方法
适用缓存的前提是高命中率,如根据各种条件动态查询的方法返回值会根据查询条件而多样化,导致其不确定性和命中率低下,对于这样的场景,适用缓存并不能有效提高性能,故这样的场景就不再适用缓存了。
分享到:
相关推荐
本篇文章将深入探讨Spring缓存机制的基础知识,并通过一个入门实例来阐述其工作原理和使用方法。 Spring缓存抽象是自Spring 3.1版本引入的,它提供了一个统一的API,支持多种缓存解决方案,如EhCache、Guava Cache...
在“spring缓存机制-自定义缓存(五, 六)”中,我们将深入探讨如何扩展Spring的缓存功能,使其更加灵活且功能丰富。 一、Spring缓存抽象 Spring缓存抽象是基于Java的注解驱动的,它提供了声明式缓存管理。核心组件...
总结起来,`@CachePut`注解在Spring缓存机制中扮演着重要角色,它确保了方法的执行,并将结果存入缓存,即使缓存中已有对应键的条目。通过合理配置和使用,可以有效提升应用性能,同时保证数据的实时性。在实际项目...
在Spring框架中,缓存机制是一项重要的功能,它能够提高应用程序的性能,减少对数据库的访问,从而降低系统负载。本篇文章将详细讲解如何利用`condition`属性来控制哪些数据可以被缓存,以实现更加精细化的缓存策略...
Spring 缓存机制详解 Spring 缓存机制是 Spring 框架中的一种机制,用于提高应用程序的性能和效率。缓存机制可以将频繁访问的数据存储在内存中,以便快速地检索数据,减少数据库查询的次数,从而提高应用程序的性能...
Spring缓存机制是Spring框架提供的一种高级特性,用于在应用程序中实现数据的缓存,从而提高性能和减少数据库的负载。它允许开发者在不修改业务逻辑的情况下,轻松地在应用的不同层次引入缓存功能。本文将深入探讨...
其中,Spring缓存机制是提高应用程序性能的关键特性,尤其对于数据密集型应用而言。本篇将深入探讨Spring缓存实例,基于给出的博客链接(http://blog.csdn.net/maoyeqiu/article/details/50433934)和文件"20140527...
Spring框架提供了强大的缓存抽象,支持多种缓存机制,如 EhCache、Redis、Hazelcast 和 Infinispan 等。在Spring中实现缓存,通常涉及以下几个步骤: 1. **启用缓存**: 在Spring配置文件中,我们需要启用缓存管理...
为了实现分布式缓存,可以使用RMI、Terracotta或JGroups等通信机制。例如,使用Terracotta服务器进行集群配置,需要在`ehcache.xml`中配置`terracottaConfig`元素,并在服务器上部署Terracotta实例。 5. 测试用例 ...
在这个场景中,`cglib-2.2.jar`和`ehcache-spring-annotations-1.1.2.jar`是两个关键的库文件,它们在实现Spring缓存机制中扮演着重要角色。 **CGLIB(Code Generation Library)** 是一个强大的高性能的代码生成库...
在本节中,我们将深入探讨如何使用Spring Boot集成Redis来实现高效的缓存机制。Spring Boot是Java开发领域中一个流行的微服务框架,它简化了设置和配置过程,使得开发人员可以快速启动项目。Redis则是一种高性能的...
### Spring整合EhCache详细教程 #### Spring缓存抽象与核心思想 在开始Spring整合EhCache之前,首先需要理解...希望本教程能帮助开发者更好地理解和应用Spring缓存机制,尤其是在与EhCache这样的高级缓存系统集成时。
在Spring Boot应用中,自定义注解来实现缓存机制是一种常见的优化手段,尤其是在处理大量重复数据查询时,可以显著提升应用性能。本教程将详细解释如何利用Spring Boot结合Redis来实现这一功能。 首先,我们需要...
在Spring框架中,自动加载缓存是一个非常...总之,Spring自动加载缓存机制为开发者提供了便利,通过合理的设计和配置,能够有效地提升系统的性能和响应速度,但同时也需要注意其潜在的风险,确保系统的稳定性和可靠性。
【maven-spring-memcache】项目是一个关于如何在Spring框架中集成并使用Memcache...整合过程中涉及到Spring的依赖注入、配置管理,以及Memcache的客户端使用,这些知识点对于理解和实践Spring缓存机制具有重要意义。
- 利用Spring缓存机制(如EhCache、Redis)缓存常用数据,减少数据库访问。 - 调整Struts的拦截器链,优化请求处理流程。 在MongoTest这个文件中,可能包含了用于测试这种集成的代码,比如模拟MongoDB操作的测试...
缓存缓存缓存缓存缓存缓存缓存缓存
缓存机制不仅仅局限于ASP.NET,其他编程语言和框架如Java(使用Ehcache或Spring Cache)、PHP(使用APC或Memcached)等也有各自的缓存实现。理解并掌握缓存原理及实践,对于提升Web应用的性能至关重要。 总结起来,...
Spring框架的二级缓存机制是其企业级应用中提高数据访问效率的重要组成部分。在这个例子中,我们将探讨如何在Spring环境中实现二级缓存,主要涉及Spring与Hibernate集成使用EhCache的情况。 一级缓存是ORM框架(如...
spring boot redis 注解缓存是基于spring boot 框架和redis缓存机制的结合,实现了缓存机制的自动化管理。下面将详细介绍spring boot redis 注解缓存的实现机制和使用方法。 一、spring boot redis 依赖关系 在...