Spring缓存框架原理浅谈
运维在上线,无聊写博客。最近看了下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缓存框架原理浅谈的更多相关文章
- spring boot架构浅谈
首先来说一下什么是spring boot架构 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置 ...
- Spring AOP 用法浅谈(Day_18)
当你这一天没有在进步,那你就是在退步! [简述] Aspect Oriented Programming :面向切面编程 所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情 ...
- 1.1浅谈Spring(一个叫春的框架)
如今各种Spring框架甚嚣尘上,但是终归还是属于spring的东西.所以在这里,个人谈一谈对spring的认识,笔者觉得掌握spring原理以及spring所涉及到的设计模式对我们具有极大的帮助.我 ...
- 浅谈对Spring Framework的认识
Spring Framework,作为一个应用框架,官方的介绍如下: The Spring Framework provides a comprehensive programming and con ...
- 浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...
- 浅谈Spring MVC知识
关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...
- 浅谈Spring中的Quartz配置
浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...
随机推荐
- luac++
Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 洪亮 305 2014年08月09日 发布 1 推荐 21 收藏,14.9k 浏览 关于cocos2d-x下Lua调用C++的文档看了 ...
- 忘记Windows7登陆密码解决办法
忘记 Windows7 的登陆密码,解决这个问题的思路就是替换 system32 下的 Magnify.exe . 可以从 WindowsPE 启动,到 C:\windows\system32 下. ...
- 106运用SWITCH语句打印星期几的单词
package com.chongrui.test;/*运用SWITCH语句打印星期几的单词 * */ public class TypeConvertion { public static void ...
- 关于 Java(TM) Platform SE binary 已停止工作 的解决方法
一.问题描述 昨天晚上Myeclipse还用着好好的,今天早上打开工程,只要运行就卡住,大半天弹出个消息窗口:Java(TM) Platform SE binary 已停止工作. 如图 关闭Myecl ...
- c# 使用泛型类型作为参数
泛型作为一种经常使用的类型,有时需要在方法之间传递,不了解的话可能会束手无策. 比如我定义一个方法 processList 需要把List<T> 作为参数传入,这时可以这样写 publ ...
- 使用Lucene索引和检索POI数据
1.简介 关于空间数据搜索,以前写过<使用Solr进行空间搜索>这篇文章,是基于Solr的GIS数据的索引和检索. Solr和ElasticSearch这两者都是基于Lucene实现的,两 ...
- JDBC URL FOR ORACLE, wrong or correct, how do you know? ORA-12505
JDBC URL FOR ORACLE, wrong or correct, how do you know? INSTANCE SID by ":" jdbc:oracle:th ...
- Python-socket网络编程
一.计算机网络 多台独立的计算机用网络通信设备连接起来的网络.实现资源共享和数据传递.比如,我们之前的学过的知识可以将D盘的一个文件传到C盘,但如果你想从你的电脑传一个文件到我的电脑上目前是做不到的; ...
- 用opencsv文件读写CSV文件
首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...
- 学习微信小程序之css7
盒模型 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...