运维在上线,无聊写博客。最近看了下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. 解决java.lang.NoClassDefFoundError: org/objectweb/asm/util/TraceClassVisitor

    方案一: <dependency> <groupId>asm</groupId> <artifactId>asm-all</artifactId& ...

  2. WPF 画心2.0版之元旦快乐

    2017年元旦已经到了,想做一个祝福语的窗口,就把上一篇画心的程序改了改,变成了如下界面. 说下改动的地方,首先窗口没有标题栏了. MainWindow.xaml AllowsTransparency ...

  3. 预处理指令 #import

    vs class # import会包含这个类的所有信息,包括实体变量和方法, # @class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,先不考虑.

  4. 2016年6月20日 JAVA知识框架

    基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1  JAVA简介 2  JAVA编程环境 3  JAVA基本编程结构 4 ...

  5. .Net中Remoting通信机制

    Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式. 从微软的产品角度 ...

  6. 将 xunit.runner.dnx 的 xml 输出转换为 Nunit 格式

    由于目前 DNX 缺乏 XSLT 的转换能力,因此只能使用变通方法.具体参考这个链接 主要内容复制过来是: From @eriklarko on July 14, 2015 7:38 As a wor ...

  7. 【Mybatis架构】 延迟加载

    在上一篇博客中,我们提到过有关于Mybatis输出映射中resultMap能够实现延迟加载的事,然而真的是所有的resultMap都能实现延迟加载还是咋地啊?现在我们就来对那一句话做一下阐述和实例说明 ...

  8. 学习微信小程序之css3display

    一display diaplay改变标签的模式,行内装块级(block),块级转行内(inline) 通过设置display为none,可以 让整个标签在页内移除掉 设置visibility为hidd ...

  9. echarts之tooltip-position

    当postion为Array时 tooltip : { trigger: 'axis', position:[3,3] //赋予一个[x,y]的位置 } 当postion为function时 tool ...

  10. dos下对mysql的简单操作(linux类似)

    >>>>>>>>>>>>>>>>>>>> 基础入门语句10条 1. 连接服务器  ...