基于spring 方法级缓存的多种实现

方案实施

1、 spring和ehcache集成

主要获取ehcache作为操作ehcache的对象。

spring.xml中注入ehcacheManager和ehCache对象,ehcacheManager是需要加载ehcache.xml配置信息,创建ehcache.xml中配置不同策略的cache。

<!-- ehCache 配置管理器 -->
<bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml" />
<!--true:单例,一个cacheManager对象共享;false:多个对象独立 -->
<property name="shared" value="true" />
<property name="cacheManagerName" value="ehcacheManager" />
</bean> <!-- ehCache 操作对象 -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcacheManager"/>
</bean>
<!-- 启用缓存注解功能(请将其配置在Spring主配置文件中) -->
<cache:annotation-driven cache-manager="cacheManager"/>

2、 spring和自带的缓存支持

<!-- Spring自己的基于java.util.concurrent.ConcurrentHashMap实现的缓存管理器(该功能是从Spring3.1开始提供的) -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean name="SimplePageCachingFilter" class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" />
</set>
</property>
</bean>

3.spring和redis集成

主要获取redisTemplate作为操作redis的对象。

redis.properties配置信息

#host 写入redis服务器地址

redis.ip=127.0.0.1

#Port

redis.port=6379

#Passord

#redis.password=123456

#连接超时30000

redis.timeout=30

#最大分配的对象数

redis.pool.maxActive=100

#最大能够保持idel状态的对象数

redis.pool.maxIdle=30

#当池内没有返回对象时,最大等待时间

redis.pool.maxWait=1000

#当调用borrow Object方法时,是否进行有效性检查

redis.pool.testOnBorrow=true

#当调用return Object方法时,是否进行有效性检查

redis.pool.testOnReturn=true

spring注入jedisPool、redisConnFactory、redisTemplate对象

<!-- 加载redis.propertis -->

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations" value="classpath:redis.properties"/>

</bean>
<!-- Redis 连接池 -->

<bean id="jedisPool" class="redis.clients.jedis.JedisPoolConfig">

<property name="maxTotal" value="${redis.pool.maxActive}" />

<property name="maxIdle" value="${redis.pool.maxIdle}" />

<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />

<property name="testOnReturn" value="${redis.pool.testOnReturn}" />

<property name="maxWaitMillis" value="${redis.pool.maxWait}" />

</bean>
<!-- Redis 连接工厂 -->

<bean id="redisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">

<property name="hostName" value="${redis.ip}" />

<property name="port" value="${redis.port}" />

<!-- property name="password" value="${redis.password}" -->

<property name="timeout" value="${redis.timeout}" />

<property name="poolConfig" ref="jedisPool" />

</bean>
<!-- redis 操作对象 -->

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">

<property name="connectionFactory" ref="redisConnFactory" />

</bean>
<!-- 自定义缓存 -->

<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">

<property name="caches">

<set>

<bean class="org.cpframework.cache.redis.RedisCache">

<property name="redisTemplate" ref="redisTemplate" />

<property name="name" value="default"/>

</bean>

</set>

</property>

</bean>
<!-- 启用缓存注解功能(请将其配置在Spring主配置文件中) -->

<cache:annotation-driven cache-manager="cacheManager"/>

4.spring 缓存注解解释

缓存注解有以下三个:

@Cacheable @CacheEvict @CachePut

1.

@Cacheable(value=”accountCache”),这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 的缓存中查询,如果没有,则执行实际的方法,并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数 userName,value 就是 Account 对象。“accountCache”缓存是在 spring*.xml 中定义的名称。

例子:

@Cacheable(value="accountCache")// 使用了一个缓存名叫 accountCache

public Account getAccountByName(String userName) {

// 方法内部实现不考虑缓存逻辑,直接实现业务

System.out.println("real query account."+userName);

return getFromDB(userName);

}

condition:用来条件判断,满足条件的则进行缓存

例子2:

@Cacheable(value="accountCache",condition="#userName.length() <=4")// 缓存名叫 accountCache

public Account getAccountByName(String userName) {

// 方法内部实现不考虑缓存逻辑,直接实现业务

return getFromDB(userName);

}

2.

@CacheEvict 注释来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。注意其中一个 @CacheEvict(value=”accountCache”,key=”#account.getName()”),其中的 Key 是用来指定缓存的 key 的,这里因为我们保存的时候用的是 account 对象的 name 字段,所以这里还需要从参数 account 对象中获取 name 的值来作为 key,前面的 # 号代表这是一个 SpEL 表达式,此表达式可以遍历方法的参数对象

例子3:

@CacheEvict(value="accountCache",key="#account.getName()")// 清空accountCache 缓存

public void updateAccount(Account account) {

updateDB(account);

}

@CacheEvict(value="accountCache",allEntries=true)// 清空accountCache 缓存

public void reload() {

reloadAll()

}

@Cacheable(value="accountCache",condition="#userName.length() <=4")// 缓存名叫 accountCache

public Account getAccountByName(String userName) {

// 方法内部实现不考虑缓存逻辑,直接实现业务

return getFromDB(userName);

}

3.

@CachePut 注释,这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。

@CachePut(value="accountCache",key="#account.getName()")// 更新accountCache 缓存

public Account updateAccount(Account account) {

return updateDB(account);

}

附录:

@Cacheable、@CachePut、@CacheEvict 注释介绍

通过上面的例子,我们可以看到 spring cache 主要使用两个注释标签,即 @Cacheable、@CachePut 和 @CacheEvict,我们总结一下其作用和配置方法。

表 1. @Cacheable 作用和配置方法

@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存


@Cacheable 主要的参数


value


缓存的名称,在 spring 配置文件中定义,必须指定至少一个


例如: @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”}


key


缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合


例如: @Cacheable(value=”testcache”,key=”#userName”)


condition


缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存


例如: @Cacheable(value=”testcache”,condition=”#userName.length()>2”)

表 2. @CachePut 作用和配置方法

@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用


@CachePut 主要的参数


value


缓存的名称,在 spring 配置文件中定义,必须指定至少一个


例如: @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”}


key


缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合


例如: @Cacheable(value=”testcache”,key=”#userName”)


condition


缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存


例如: @Cacheable(value=”testcache”,condition=”#userName.length()>2”)

表 3. @CacheEvict 作用和配置方法

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空


@CacheEvict 主要的参数


value


缓存的名称,在 spring 配置文件中定义,必须指定至少一个


例如: @CachEvict(value=”mycache”) 或者 @CachEvict(value={”cache1”,”cache2”}


key


缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合


例如: @CachEvict(value=”testcache”,key=”#userName”)


condition


缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存


例如: @CachEvict(value=”testcache”, condition=”#userName.length()>2”)


allEntries


是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存


例如: @CachEvict(value=”testcache”,allEntries=true)


beforeInvocation


是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存


例如: @CachEvict(value=”testcache”,beforeInvocation=true)

以上这篇基于spring 方法级缓存的多种实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Spring整合Ehcache管理缓存

    前言 Ehcache 是一个成熟的缓存框架,你可以直接使用它来管理你的缓存. Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现.它支持注解方式使用缓存,非常方便. 本文先通过Ehcache独立应用的范例来介绍它的基本使用方法,然后再介绍与Spring整合的方法. 概述 Ehcache是什么? EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点.它是Hibernate中的默认缓存框架. Ehcache已经发布

  • Spring+EHcache缓存实例详解

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有高速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存. 主要面向通用缓存,Java EE和轻量级容器. 它具有内存和磁盘存储.缓存载入器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器.支持REST和SOAP api等特点. 优点: 1. 高速 2. 简单 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需操心容量问

  • Java开发框架spring实现自定义缓存标签

    自从spring3.1之后,spring引入了抽象缓存,可以通过在方法上添加@Cacheable等标签对方法返回的数据进行缓存.但是它到底是怎么实现的呢,我们通过一个例子来看一下.首先我们定义一个@MyCacheable package caching.springaop; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.

  • 基于spring 方法级缓存的多种实现

    方案实施 1. spring和ehcache集成 主要获取ehcache作为操作ehcache的对象. spring.xml中注入ehcacheManager和ehCache对象,ehcacheManager是需要加载ehcache.xml配置信息,创建ehcache.xml中配置不同策略的cache. <!-- ehCache 配置管理器 --> <bean id="ehcacheManager" class="org.springframework.ca

  • 浅谈spring方法级参数校验(@Validated)

    依赖的jar包: spring相关jar包版本:4.3.1.RELEASE <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.3.Final</version> </dependency> 一.配置与注入 MethodValidationPostProce

  • 基于Spring接口集成Caffeine+Redis两级缓存

    目录 前言 改造 JSR107 规范 Cache CacheManager 配置&使用 分布式环境改造 定义消息体 Redis消息配置 消息消费逻辑 修改DoubleCache 测试 总结 前言 在上一篇文章Redis+Caffeine两级缓存的实现中,我们介绍了3种整合Caffeine和Redis作为两级缓存使用的方法,虽然说能够实现功能,但实现手法还是太粗糙了,并且遗留了一些问题没有处理.本文将在上一篇的基础上,围绕两个方面进行进一步的改造: JSR107定义了缓存使用规范,spring中提

  • spring boot+spring cache实现两级缓存(redis+caffeine)

    spring boot中集成了spring cache,并有多种缓存方式的实现,如:Redis.Caffeine.JCache.EhCache等等.但如果只用一种缓存,要么会有较大的网络消耗(如Redis),要么就是内存占用太大(如Caffeine这种应用内存缓存).在很多场景下,可以结合起来实现一.二级缓存的方式,能够很大程度提高应用的处理效率. 内容说明: 缓存.两级缓存 spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明 spring boot

  • 基于Spring Cache实现Caffeine+Redis二级缓存

    目录 一.聊聊什么是硬编码使用缓存? 二.Spring Cache简介 1.Cache接口 2.CacheManager接口 3.常用注解说明 三.使用二级缓存需要思考的一些问题? 四.Caffeine 简介 1.写入缓存策略 2.缓存值的清理策略 3.统计 4.高效的缓存淘汰算法 5.其他说明 五.基于Spring Cache实现二级缓存(Caffeine+Redis) 1.maven引入使用 2.application.yml 3.启动类上增加@EnableCaching 4.在需要缓存的方

  • 基于Spring Security的Oauth2授权实现方法

    前言 经过一段时间的学习Oauth2,在网上也借鉴学习了一些大牛的经验,推荐在学习的过程中多看几遍阮一峰的<理解OAuth 2.0>,经过对Oauth2的多种方式的实现,个人推荐Spring Security和Oauth2的实现是相对优雅的,理由如下: 1.相对于直接实现Oauth2,减少了很多代码量,也就减少的查找问题的成本. 2.通过调整配置文件,灵活配置Oauth相关配置. 3.通过结合路由组件(如zuul),更好的实现微服务权限控制扩展. Oauth2概述 oauth2根据使用场景不同

  • Spring实战之方法级别缓存用法示例

    本文实例讲述了Spring实战之方法级别缓存用法.分享给大家供大家参考,具体如下: 一 配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p

  • PHP基于文件存储实现缓存的方法

    本文实例讲述了PHP基于文件存储实现缓存的方法.分享给大家供大家参考.具体如下: 在一些数据库数据记录较大,但是服务器有限的时候,可能一条MySQL查询就会好几百毫秒,一个简单的页面一般也有十几条查询,这个时候也个页面加载下来基本要好几秒了,如果并发量高的话服务器基本就瘫痪了,造成一个页面很久也加载不下来,这个时候我们可以使用文件缓存来缓解下MySQL的压力,下面给个使用例子. <?php //页面业务逻辑处理,获得结果 $objPage = new Page_IndexModel($arrPa

  • 清除js缓存的多种方法总结

    在客户端有一个HTML文件,用来提交输入信息,问题在于:每次按刷新时,发觉并不是整个页面重新被装载,好似是缓存中. 因为文本框中仍出现上次输入的值,只有在地址栏中按回车整个页面才重新装载,应当怎样避免此问题? 1,在html里head区添加代码: <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="content-type" content=&quo

  • 一种angular的方法级的缓存注解(装饰器)

    使用es6中装装饰器能做很多事情,今天分享一种在angular使用装饰器进行方法调用缓存的功能. 应用场景是这样的,在前端工作中,会有一些经常使用的方法经常被调用,但是这些方法每次调用都会占用很多的资源,比如网络请求,数据统计功能,这些方法一般会随着函数调用传参的不同返回的结果不同. 因为使用过spring中的cache功能,感觉es中如果有spring cacheable注解就好了,在spring中注解使用如下: @Cacheable(value="'accountCache_'+#userN

随机推荐