介绍SpringBoot项目中使用缓存,之前先介绍一下Spring的缓存抽象和JSR107,本博客是我在学习尚硅谷视频和参考其它博客之后做的笔记,仅供学习参考 文章目录 一、Spring的缓存抽象 1.1 、缓存抽象定义 1.2、重要接口 二、JSR107 2.1、JSR107核心接口 2.2、JSR107图示 三、Spring缓存使用 3.1、重要注解简介 3.2、环境准备 3.3、引入spring-boot-starter-cache Cache:缓存抽象的规范接口,缓存实现有:RedisCache、EhCacheCache、ConcurrentMapCache等 CacheManager:缓存管理器,管理Cache的生命周期 二、JSR107 2.1、JSR107核心接口 Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry和 Expiry 缓存有效期可以通过ExpiryPolicy设置 2.2、JSR107图示 引用尚硅谷视频课件中的图示: ?
图片 虽迟但到的JSR107 —— JCache API 提到JAVA中的“行业规矩”,JSR是一个绕不开的话题。 揭秘JSR107 —— JCache API内容探究 JSR107规范具体的要求形式,都以接口的形式封装在javax.cache包中进行提供。 JSR107提供的注解操作方法 前面提到了作为供应商想要实现JSR107规范的时候会比较复杂,需要做很多自己的处理逻辑。但是对于业务使用者而言,JSR107还是比较贴心的。 Spring Cache并非是一个具体的缓存实现,而是和JSR107类似的一套缓存规范,基于注解并可实现与Spring的各种高级特性无缝集成,受到了广泛的追捧。 比如后面我们会专门介绍的Guava Cache、Caffeine Cache以及同样支持JSR107规范的Ehcache等等。
注:建议在读下面的内容之前,先去了解下JSR107中的内容,trust me! 一、Fundamentals 1. JSR107中定义了五种core interfaces CachingProvider CacheManager Cache Entry(这个Entry就是放入到Cache中的key-value键值对) Store-By-Value: JSR107中规定,在将Entry存储到Cache时,对Key和Value进行拷贝,而后实际存储到Cache中的是这个拷贝值;从Cache中读取时,实际拿到的只是Cache Store-By-Reference: JSR107中规定,这种方式是引用存储,存入到Cahe中的是引用,从Cache中返回的也是引用,所以在使用这种方式时,一定要注意修改带来的相互影响。 由于JSR107只是规范,而实际的每个厂商底层实现的不同,加上可能写到磁盘或者Ehcache集群(Entry要在网络中传输),所以Entry中的key和value最好都实现java.io.Serializable
> <config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:jsr107='http://www.ehcache.org/ /v3 http://www.ehcache.org/schema/ehcache-core-3.1.xsd http://www.ehcache.org/v3/jsr107 http: 令人欣慰的是,Ehcache同时提供了对JSR107与Spring Cache规范的支持! 下面一起看下如何通过JSR107规范接口以及Spring Cache的标准来使用Ehcache。 而由于Spring Cache提供了对JSR107规范的支持,且Ehcache3.x也全面符合JSR107规范,所以我们可以将三者结合起来,以JSR107规范作为桥梁,实现SpringBoot与Ehcache3 小结回顾 好啦,关于Ehcache的各种配置、以及通过JSR107或者Spring Cache规范集成到项目中使用的相关内容,就介绍到这里了。
Spring Cache缓存抽象的实现产品 缓存标准方面:一个是JSR107,一个是Spring Cache,前面也说了Spring Cache已经成为了现实中的标准,所以市面上它的实现产品非常丰富,因此本文主要看看基于 Spring Cache它也是支持JSR107规范的,可谓非常的友好。 (推荐) 上面截图我们能看到support包里是有对jcache(JSR107)的支持,而切好EhCache3.x它实现了JSR107规范(但没有实现Spring-Cache),为了集成它,我们就用现成的方案 做了一层适配,让所有实现了JSR107的缓存方案,都能够用在Spring环境中。 -- <service> <jsr107:defaults> <jsr107:cache name="demoCache" template="heap-cache"/>
JSR107缓存抽象:JCache 说起JSR107或者说是JCache,估摸大多数小伙伴都会觉得非常的陌生,没用过且还没听过。 JSR107的草案提得其实是非常的早的,但是第一个Final Release版本却一直难产到了2014年,如图(本文截自JSR官网): ? 因此目前而言,关于缓存这块业界有个通识: Spring Cache缓存抽象已经成了业界实际的标准(几乎所有产品都支持) JSR107仅仅只是官方的标准而已(支持的产品并不多) 因为JSR107使用得极少 JCache的实现产品挺少的,Ehcache3.x有实现JSR107相关规范接口 它的核心类的层次结构图: ? (其实JavaEE的很多设计都有这个通病,标准过于复杂,落地实操性很差~) 我看网上有小伙伴评论说:JSR107的设计简直莫名其妙。
"http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ehcache.org/v3" xmlns:jsr107 ="http://www.ehcache.org/v3/jsr107" xsi:schemaLocation=" http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd http://www.ehcache.org/v3/jsr107 http ://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd"> <service> <jsr107:defaults enable-statistics
方案 基于JSR107规范自研 基于ConcurrentHashMap实现数据缓存 JSR107规范目标 为应用程序提供缓存Java对象的功能。 定义了一套通用的缓存概念和工具。 JSR107规范核心概念 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。
"http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ehcache.org/v3" xmlns:jsr107 ="http://www.ehcache.org/v3/jsr107" xsi:schemaLocation=" http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd http://www.ehcache.org/v3/jsr107 http ://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd"> <service> <jsr107:defaults enable-statistics
xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ehcache.org/v3" xmlns:jsr107 ="http://www.ehcache.org/v3/jsr107" xsi:schemaLocation=" http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd http://www.ehcache.org/v3/jsr107 http:/ /www.ehcache.org/schema/ehcache-107-ext-3.0.xsd"> <service> <jsr107:defaults enable-statistics
"http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ehcache.org/v3" xmlns:jsr107 ="http://www.ehcache.org/v3/jsr107" xsi:schemaLocation=" http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd http://www.ehcache.org/v3/jsr107 http ://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd"> <service> <jsr107:defaults enable-statistics
www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ehcache.org/v3" xmlns:jsr107 ="http://www.ehcache.org/v3/jsr107" xsi:schemaLocation=" http://www.ehcache.org /v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd"> <service> <jsr107:defaults
方案 ---- 基于 JSR107 规范自研。 基于 ConcurrentHashMap 实现数据缓存。 3. JSR107 规范 ---- 文档:https://jcp.org/en/jsr/detail?id=107(了解一下就行,没太大的应用) 目标 为应用程序提供缓存 Java 对象的功能。
(使用缓存注解实现缓存无需关心缓存具体的实现产品~) 关于直接调用API方式来使用缓存,可参考: 【小家Spring】聊聊Spring Cache的缓存抽象与JSR107缓存抽象JCache,并使用API ); default: return null; } } // 向容器导入了AutoProxyRegistrar和ProxyCachingConfiguration // 若JSR107 :cache-api这个包),并且并且存在ProxyJCacheConfiguration这个类 // 显然ProxyJCacheConfiguration这个类我们一般都不会导进来~~~~ 所以JSR107
一、JSR107 JSR107是Java的一套缓存规范,Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry
这些注解看起来非常类似于JSR107,但是没不那么广泛,另一方面Hystrix不提供独立和复杂的缓存系统,因此没有必要像JSR107一样有这样的注释多样性。 比较两种方法:JSR107 @CacheRemove( cacheName = "getUserById", cacheKeyGenerator = UserCacheKeyGenerator.class
createCache(URL url) { return new LruCache(url); } } //JCacheFactory子类,返回LruCache对象,可与符合JSR107 SPI实现的全限定类名 String type = url.getParameter("jcache"); //通过CachingProvider 等jsr107
return BeanUtils.instantiateClass(ctor, delegate); } } Ehcache 配置 Ehcache 3 开始,统一使用了 JCache,就是 JSR107 JSR107:emm,其实 JSR107 是一种缓存标准,各个框架只要遵守这个标准,就是现实大一统。差不多就是我不需要更改系统代码,也能随意更换底层的缓存系统。 config xmlns:ehcache="http://www.ehcache.org/v3" xmlns:jcache="http://www.ehcache.org/v3/jsr107
SpringBoot 笔记 (五): 缓存 1.JSR107介绍 1.核心概念 JSR107这个规范有五个核心概念分别是: CacheProvider 它用来管理缓存的Manager也就是用来创建,删除 javax.cache.cache-api javax.cache.cache 2.Spring缓存抽象 spring保留了两个核心的概念就是 CacheManager 和 Cache 用来支持并简化 JSR107 支持JSR107的注解,以及自带一些注解。 ?
JSR107 Java Caching定义5个核心接口:CachingProvider,CacheManager,Cache,Entry,Expiry CachingProvider:定义了创建,配置, org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration (JSR107