spring与redis集成之aop整合方案
java使用redis缓存可以使用jedis框架,jedis操作简单,没有什么复杂的东西需要学习,网上资料很多,随便看看就会了.
将spring与redis缓存集成,其实也是使用jedis框架,只不过spring对它进行了一层封装,并将这层封装库命名为spring-data-redis.
下面将要使用spring-data-redis与jedis的jar包,并通过spring的aop功能,将redis缓存无缝无侵入的整合进来.
1.先下载好依赖包
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>4.1.1.RELEASE</version>
- </dependency>
- <!-- 还有spring的其它包,这里不一一贴出-->
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-redis</artifactId>
- <version>1.4.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>2.6.0</version>
- </dependency>
2.再配置spring文件
- <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
- <property name="minIdle" value="${redis.minIdle}" />
- <property name="maxIdle" value="${redis.maxIdle}" />
- <property name="maxTotal" value="${redis.maxActive}" />
- <property name="maxWaitMillis" value="${redis.maxWait}" />
- <property name="testOnBorrow" value="${redis.testOnBorrow}" />
- </bean>
- <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
- <property name="hostName" value="${redis.host}" />
- <property name="port" value="${redis.port}" />
- <property name="password" value="${redis.password}" />
- <property name="usePool" value="true" />
- <property name="poolConfig" ref="poolConfig" />
- </bean>
- <!-- redis template definition -->
- <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
- <property name="connectionFactory" ref="jedisConnFactory" />
- <property name="keySerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
- </property>
- <property name="valueSerializer">
- <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
- </property>
- <property name="hashKeySerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- </property>
- <property name="hashValueSerializer">
- <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
- </property>
- </bean>
3.开始编写aop代码
3.1 声明两个注解类,用于定义哪些方法将使用缓存
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.METHOD})
- public @interface Cacheable {
- public enum KeyMode{
- DEFAULT, //只有加了@CacheKey的参数,才加入key后缀中
- BASIC, //只有基本类型参数,才加入key后缀中,如:String,Integer,Long,Short,Boolean
- ALL; //所有参数都加入key后缀
- }
- public String key() default ""; //缓存key
- public KeyMode keyMode() default KeyMode.DEFAULT; //key的后缀模式
- public int expire() default 0; //缓存多少秒,默认无限期
- }
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.PARAMETER})
- public @interface CacheKey {}
3.2 创建一个Aop拦截器的处理类,用于拦截加了@Cacheable的方法
- @Aspect
- @Component
- public class CacheableAop {
- @Autowired private RedisTemplate redisTemplate;
- @Around("@annotation(cache)")
- public Object cached(final ProceedingJoinPoint pjp,Cacheable cache) throws Throwable {
- String key=getCacheKey(pjp, cache);
- ValueOperations<String, Object> valueOper=redisTemplate.opsForValue();
- Object value=valueOper.get(key); //从缓存获取数据
- if(value!=null) return value; //如果有数据,则直接返回
- value = pjp.proceed(); //跳过缓存,到后端查询数据
- if(cache.expire()<=0) { //如果没有设置过期时间,则无限期缓存
- valueOper.set(key, value);
- } else { //否则设置缓存时间
- valueOper.set(key, value,cache.expire(),TimeUnit.SECONDS);
- }
- return value;
- }
- /**
- * 获取缓存的key值
- * @param pjp
- * @param cache
- * @return
- */
- private String getCacheKey(ProceedingJoinPoint pjp,Cacheable cache) {
- StringBuilder buf=new StringBuilder();
- buf.append(pjp.getSignature().getDeclaringTypeName()).append(".").append(pjp.getSignature().getName());
- if(cache.key().length()>0) {
- buf.append(".").append(cache.key());
- }
- Object[] args=pjp.getArgs();
- if(cache.keyMode()==KeyMode.DEFAULT) {
- Annotation[][] pas=((MethodSignature)pjp.getSignature()).getMethod().getParameterAnnotations();
- for(int i=0;i<pas.length;i++) {
- for(Annotation an:pas[i]) {
- if(an instanceof CacheKey) {
- buf.append(".").append(args[i].toString());
- break;
- }
- }
- }
- } else if(cache.keyMode()==KeyMode.BASIC) {
- for(Object arg:args) {
- if(arg instanceof String) {
- buf.append(".").append(arg);
- } else if(arg instanceof Integer || arg instanceof Long || arg instanceof Short) {
- buf.append(".").append(arg.toString());
- } else if(arg instanceof Boolean) {
- buf.append(".").append(arg.toString());
- }
- }
- } else if(cache.keyMode()==KeyMode.ALL) {
- for(Object arg:args) {
- buf.append(".").append(arg.toString());
- }
- }
- return buf.toString();
- }
- }
4.使用缓存示例
- @Service
- @Transactional
- public class DemoServiceImpl implements DemoService {
- @Autowired private DemoDao demoDao;
- public List<Demo> findAll() {
- return demoDao.findAll();
- }
- /*
- 对get()方法配置使用缓存,缓存有效期为3600秒,缓存的key格式为:{package_name}.DemoServiceImpl.get
- 同时为参数配置了@CacheKey后,表示此参数的值将做为key的后缀,此例的key,最终是:{package_name}.DemoServiceImpl.get.{id}
- 可以为多个参数配置@CacheKey,拦截器会调用参数的toString()做为key的后缀
- 若配置多个@CacheKey参数,那么最终的key格式为:{package_name}.{class_name}.{method}.{arg1}.{arg2}.{...}
- */
- @Cacheable(expire=3600)
- public Demo get(@CacheKey String id) {
- return demoDao.get(id);
- }
- public Demo getByName(String name) {
- return demoDao.getByName(name);
- }
- }
- 若为名称相同的方法配置缓存,可以在@Cacheable中加入key属性,追加额外的key后缀
- @Cacheable还有一个KeyMode属性,用于配置哪些参数可以追加到key后缀中,
默认取值 DEFAULT:表示只有加了@CacheKey的参数才能追加到key后缀
BASIC:自动将基本类型追加到key后缀,而无需再配置@CacheKey
ALL:自动将所有参数追加到lkey后缀,而无需再配置@CacheKey
这只是一个初步整合方案,测试可行,还未在生产中使用,实际效果待验正.
spring与redis集成之aop整合方案的更多相关文章
- Spring Boot Redis 集成配置(转)
Spring Boot Redis 集成配置 .embody{ padding:10px 10px 10px; margin:0 -20px; border-bottom:solid 1px #ede ...
- mybatis与Spring集成(Aop整合PagerAspect插件)
目的: Mybatis与spring集成 Aop整合pagehelper插件 Mybatis与spring集成 导入pom依赖 <?xml version="1.0" enc ...
- spring boot通过Spring Data Redis集成redis
在spring boot中,默认集成的redis是Spring Data Redis,Spring Data Redis针对redis提供了非常方便的操作模版RedisTemplate idea中新建 ...
- Spring Boot Redis 集成 Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer'
一.原因:redis集群环境没有开启Keyspace notifications 二.解决办法 @Configuration public class HttpSessionConfig { /** ...
- Spring+ehcache+redis两级缓存
问题描述 场景:我们的应用系统是分布式集群的,可横向扩展的.应用中某个接口操作满足以下一个或多个条件: 1. 接口运行复杂代价大, 2. 接口返回数据量大, 3. 接口的数据基本不会更改, 4. 接口 ...
- 【转】Spring的中IoC及AOP
1. Spring介绍 Spring是轻量级的J2EE应用程序框架.Spring的核心是个轻量级容器(container),实现了IoC(Inversion of Control)模式的容器,Spri ...
- spring data redis使用1——连接的创建
spring data redis集成了几个Redis客户端框架,Jedis , JRedis (Deprecated since 1.7), SRP (Deprecated since 1.7) a ...
- Spring Data Redis配置项有多少(不列举具体,只提供找的方法)
首先,要说明Spring Data Redis集成了很多款客户端,比如Jedis这些. 而如果在注入Bean时,我们一般是可以设置一些项的,比如hostName和port等,对于这些项一般的查找方式通 ...
- 使用Spring Data Redis操作Redis(单机版)
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...
随机推荐
- EJBCA认证系统结构及相关介绍
写作此文的主要目的是记录下EJBCA认证系统的系统结构及相关部件作用的介绍,方便后面查阅使用.
- android webview点击返回键回到上一个html
android webview点击返回键返回上一个html @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ( ...
- 保护眼睛,绿豆沙颜色的RGB值和HSL值
现在的人尤其是职场中人,每天都得花很长时间对着电脑,对眼睛的伤害很大,其实我们可以对电脑进行一个简单的设置,把窗口背景设置成绿豆沙颜色的,对眼睛的保护很有帮助的. 下面是绿豆沙颜色的RGB值和HSL值 ...
- Visual Studio之Nuget(服务器)
一.创建空Web项目 二.安装Nuget.Server 这个时候,安装完成后,发现项目文件里多了Default.aspx等文件,因为我选择的MVC,所以最好做下小小的调整 ——在Global.asax ...
- .wsdl文件生成.cs文件
1.打开VS文件命令行工具(一般在安装文件的Common7\Tools\Shortcuts下面例如[E:\VS2013安装程序\Common7\Tools\Shortcuts\VS2013 x64 本 ...
- Svn入门
1.建立svn仓库 命令svnadmin create 仓库名称,如:进入命令行窗口,切换到Svn安装目录下,输入如下命令:svnadmin create F:\software\repos ...
- MVC打开电脑对话框
//下载文件 public ActionResult Download(int id) { //依靠模板生成文档 var path =要下载的文件的路径 var name = Path.GetFile ...
- HTML5 调用手机相册和摄像头的方法并上传微信下测试通过
<input type="file" capture="camera" accept="image/*" id="camer ...
- 网络抓包--Wireshark
Wireshark 是一款非常棒的Unix和Windows上的开源网络协议分析器.它可以实时检测网络通讯数据,也可以检测其抓取的网络通讯数据快照文件.可以通过图形界面浏览这些数据,可以查看网络通讯数据 ...
- 一步一步学习SignalR进行实时通信_2_Persistent Connections
原文:一步一步学习SignalR进行实时通信_2_Persistent Connections 一步一步学习SignalR进行实时通信\_2_Persistent Connections Signal ...
