运维在上线,无聊写博客。最近看了下Spring的缓存框架,这里写一下

1.Spring 缓存框架 原理浅谈

2.Spring 缓存框架 注解使用说明

3.Spring 缓存配置 + Ehcache(默认)

4.Spring 缓存配置 + Ehcache(自己实现)

5.Spring 缓存配置 + Memcache

6.Ehcache和Memcache的资料收集

  Spring提供的缓存注解,通过对CacheManager管理Cache,实现对缓存的操作。Spring提供的CacheManager和Cache的关系,可以类比Ehcache里面的Cache和Element的关系。例如存储用户的缓存,对应的数据接口是:CacheManager中管理着一个Map<key,Cache>结构的Cache集合(参考:ConcurrentMapCacheManager.cacheMap),Map的key值为@Cacheable注解中的name属性,存储内容(Cache)对应的则是同一个name对应的一类数据。这一类数据会根据@Cacheable中key的属性,在Cache里面存储成Map<key,Element>结构的对象集合(参考:ConcurrentMapCache.store)。

  可以简单的说,在Spring的@Cache注解中,管理的是一个Map1<name, Map2<key, value>>的存储结构,Map1对应的是CacheManager实现,Map2对应的是Cache实现,在实现中CacheManager和Cache都可以通过配置的方式,实现不同的缓存策略,如下图:

     

在如上结构中,主要应用了策略模式【面向接口,而不是面向实现】实现业务与具体实现的隔离;通过具体的不同策略实现【开闭原则】,可以方便的增加多个具体实现;业务代码只依赖接口(此处依赖注解),不依赖具体的实现【依赖倒转原则】,高层的业务模块不依赖底层的具体算法。

在底层的具体实现上面,Spring通过配置不同的动态代理的实现【代理工厂】对实现方式进行管理。

  在这个框架中Map1<name, Map2<key, value>>的局限性在于,存储结构是一个二层的树状结构,但是现在大部分的缓存例如Memcache和Redis都是<K,V>结构。而且如果把Memcache存储成<K,Map<key,val>>结构的话,在判断缓存(K_key)是否存在的时候,需要把整个K对应的Map从缓存服务器中放到本地环境进行判断,对于宽带和效率上都有比较大的影响。

  因此在具体实现的时候,针对集中是缓存,最好不要简单的使用CacheManager和Cache的Map1<name,Map2<key,value>>结构来实现。而是通过其他的方式,将需要存储的值,最终存储成<K,V>结构来提升效率(PS:不使用Map1<name,Map2<key,value>>会导致CacheEvict的allEntries属性失效,后面文章细说)。

Spring缓存框架原理浅谈的更多相关文章

  1. spring boot架构浅谈

    首先来说一下什么是spring boot架构 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置 ...

  2. Spring AOP 用法浅谈(Day_18)

    当你这一天没有在进步,那你就是在退步! [简述] Aspect Oriented Programming :面向切面编程 所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情 ...

  3. 1.1浅谈Spring(一个叫春的框架)

    如今各种Spring框架甚嚣尘上,但是终归还是属于spring的东西.所以在这里,个人谈一谈对spring的认识,笔者觉得掌握spring原理以及spring所涉及到的设计模式对我们具有极大的帮助.我 ...

  4. 浅谈对Spring Framework的认识

    Spring Framework,作为一个应用框架,官方的介绍如下: The Spring Framework provides a comprehensive programming and con ...

  5. 浅谈mysql innodb缓存策略

    浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...

  6. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  7. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  8. 浅谈Spring MVC知识

    关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...

  9. 浅谈Spring中的Quartz配置

    浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...

随机推荐

  1. myeclipse2015卸载、安装、破解全过程-----myeclipse2015

    myeclipse2015安装以及破解步骤: 下载地址:myeclipse2015-->https://pan.baidu.com/s/1i4RFCBb   密码:qxsu 破解文件地址--&g ...

  2. Tern Sercer Tineout

  3. Swift - UIView,UItableView,Cell设置边框方法

    // 设置边框的宽度 cell.layer.borderWidth = 1 // 设置边框的颜色 cell.layer.borderColor = UIColor.blackColor().CGCol ...

  4. How GitHub Works《Github是如何工作的?》

    https://github.com/blog/920-how-github-works 如果你想知道Github是如何工作的,你可以看查看Zach Holman(@holman)的三篇文章: Hou ...

  5. 用python DIY一个图片转pdf工具并打包成exe

    最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用python自己DIY一下: 这里主要用了reportlab.开始打算随便写几行,结果为若干坑纠结了挺久,于 ...

  6. 查看文本[Linux]

    查看文本 不分屏查看 cat (默认标准输入到标准输出) -n(行号) 连接...并显示 -E(每行行尾打印$) 翻屏:shift+pageUp/pageDown tac reverse cat 分屏 ...

  7. Kinect开发随笔①——红外扫描仪(Kinect 数据源)

    来源于 MVA 的 快速入门:Kinect for Windows v2 开发 的学习随笔 具体内容为上图所示章节内容 章节内全部代码:GitHub地址点我(链接失效,待补档) <Page &l ...

  8. MySQL数据库1067 问题

    1.MySql1067错误解决方法 http://blog.csdn.net/mhmyqn/article/details/17043921   MySql 1045解决方法 my.ini  mysq ...

  9. [NHibernate]利用LINQPad查看NHibernate生成SQL语句

    上篇文章中我们提到可以通过重写NHibernate的 EmptyInterceptor 拦截器来监控NHibernate发送给数据库的SQL脚本,今天看到有朋友用LINQPad工具来进行NHibern ...

  10. nodejs复习01

    console 格式化 console.log("%s:%s", "a", "b") //字符串 console.log("%d. ...