1.在使用spring cache注解如cacheable、cacheevict、cacheput过程中有一些问题;

比如,我们在查到一个list后,可以将list缓存到一个键对应的区域里;当新增、修改、删除一个元素的时候,其实我们

需要的是只将cache的list里的元素变动就可以了,但因为只有一个键,没法做到只更改一个元素,只能整个list重新加载,

对性能还是有一定的影响;

2.对spring扩展,增加自定义cache,

@MyCacheDelete:当删除元素后,从cache里取出该key的缓存list,从list里删除指定id的元素,再将list写入缓存;

@MyCachePut :当新增修改元素后,从cache里找到该key对应的list,从list里找到修改的元素删除(新增不需要删除),然后将修改后的记录写入list,再将list写入缓存;

3.具体的步骤:

1)定义注解@MyCacheDelete,@MyCachePut

2)定义注解拦截器

该拦截器,其中最重要的一点就是解析key值,因为在缓存查询数据时我们还是使用cacheable,所以定义的key也要和cacheable一致;

@MyCachePut( key="'"+ ConstUtil.C_CACHE_KEY_PRE+"BasicData'+#info.parentId",value = ConstUtil.C_CACHE_NAME, pid = "recid")

上面info.parentId的值, 是spring表达式运行时解析出的;所以自定义拦截器里也要和spring框架一样算出key值;

这里重新实现了CacheAnnotationParser,让它解析自定义的注解,这样,可以调用spring框架里的generateKey;

3)有了cache的key,后面就简单了,就是从cache里的取数据、修改数据、更新缓存操作了;

虽然这种方式,解决了单条数据影响cache的list重新加载问题;但我们在设计缓存时,还是要尽量通过细分的业务去缓存对应的数据,不要让

缓存的list过大,过大的list对于cache的存取、序列化反序列化都有性能的影响;

Spring Cache 自定义注解的更多相关文章

  1. Spring Cache缓存注解

    目录 Spring Cache缓存注解 @Cacheable 键生成器 @CachePut @CacheEvict @Caching @CacheConfig Spring Cache缓存注解 本篇文 ...

  2. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  3. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  4. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  5. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  6. spring cache常用注解使用

    1.@CacheConfig 主要用于配置该类中会用到的一些共用的缓存配置.示例: @CacheConfig(cacheNames = "users") public interf ...

  7. 使用Spring Aop自定义注解实现自动记录日志

    百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为sprin ...

  8. day05 Spring中自定义注解的用处-之获取自定义的Servie

    PS: 在RPC远程调用中,想要获取自定义的service的方法,就得自定义标签遍历拿到方法 PS:在spring中,两个最核心的 概念是aop和ioc,aop其实就是动态代理. ioc 就是解决对象 ...

  9. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

随机推荐

  1. spring各种邮件发送

    参考地址一 参考地址二 参考地址三 参考地址四 Spring邮件抽象层的主要包为org.springframework.mail.它包括了发送电子邮件的主要接口MailSender,和值对象Simpl ...

  2. jquery 获取html <img /> 位置时出错问题

    如图所示,这样端口小图片都是通过jquery html()方法设置的(参数html就是画整个图片的html字符串),如图: 但是出现图片没有完全渲染完的问题,如图: 从图中可以看出在代码运行到断点的时 ...

  3. Ruby 和 Python 分析器是如何工作的?

    你好! 我作为一名编写Ruby profiler的先驱,我想对现有的Ruby和Python profiler如何工作进行一次调查. 这也有助于回答很多人的问题:“你怎么写一个profiler?” 在这 ...

  4. HTML:关于a标签的target属性

    超级链接a的target属性已经是不被新规范支持了,其值有四个保留字: 1._blank      <a href="document.html" target=" ...

  5. 微信公众平台消息接口开发-封装weixin.class.php(转)

    一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理. 我们就考虑在这个基础上做一次封装,weixin.class.ph ...

  6. Eclipse怎样连接并打开oracle等数据库?

    http://jingyan.baidu.com/article/a501d80cea3ed4ec630f5e2f.html

  7. MySQL多线程同步-Transfer使用测试

    由淘宝核心系统研发—数据库组开发的MySQL-Transfer,用于解决MySQL主从同步延迟的问题,从MySQL单线程到多线程的工作模式.可以观看@丁奇的相关资料: MySQL多线程同步-Trans ...

  8. ubuntu下安装自动补全YouCompleteMe

    一.安装预备软件.#vim要带python2.7的支持,curl是下载插件必须用到的软件,还有git apt install vim-nox-py2 curl git #安装python头文件 apt ...

  9. JavaScript 高程三读书笔记;

    1. 在使用 <script> 嵌入 JavaScript 代码时,记住不要在代码中的任何地方出现 "</script>" 字符串. 例如,浏览器在加载下面 ...

  10. js基本知识3

    1. 函数 function 函数的声明 函数的 调用 函数的传参 2. 函数返回值 Return 返回结果 返回给函数 Id 函数 function $id(id) { return documen ...