github地址:h2cache-spring-boot-starter
一、缓存当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象。所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从缓存里查询,如果存在则返回,如果不存在再从数据库里查询,最后添加到缓存里,然后返回给用户,当然了,接下来又能使用缓存来提供查询功能。
而缓存,一般我们可以分为本地缓存和分布式缓存。
常用的本地缓存有 ehcache、guava cache,而我们一般都是使用 ehcache,毕竟他是纯 Java 的,出现问题我们还可以根据源码解决,并且还能自己进行二次开发来扩展功能。
常用的分布式缓存当然就是 Redis 了,Redis 是基于内存和单线程的,执行效率非常的高。
二、Spring Cache相信如果要整合缓存到项目中,大家都会使用到 Spring Cache,它不但整合了多种缓存框架(ehcache、jcache等等),还可以基于注解来使用,是相当的方便。
缓存框架的整合在 spring-context-support 中:
缓存注解在 spring-context 中:
当然了,在 Spring 的 context 中没有整合 Redis,但是我们可以在 spring-data-redis 中找到。
但是我们都知道,不管是在 Spring 项目 还是 Spring Boot 中,我们都只能整合一种缓存,不能同时整合多种缓存。
在 Spring Boot 中,我们一般是利用 spring.cache.type 来指定使用哪种缓存,然后填写相关配置信息来完成自动配置。
CacheType 的源码:我们可以看到,Spring 是支持非常多种缓存框架的。 package org.springframework.boot.autoconfigure.cache; public enum CacheType { GENERIC, JCACHE, EHCACHE, HAZELCAST, INFINISPAN, COUCHBASE, REDIS, CAFFEINE, SIMPLE, NONE; private CacheType() { } }
那么如果我们就是有这么一种需求,要整合两种缓存框架:例如一个本地缓存 Ehcache,一个分布式缓存 Redis,
那能整么?
能是能,但是 Spring 可不提供这种多级缓存,而是需要你自己动手来整了。
三、h2cache-spring-boot-starter 1、什么是 h2cache-spring-boot-starter?在微服务中,每个服务都是无状态的,服务之间需要经过 HTTP 或者 RPC 来进行通信。而每个服务都拥有自己对应的数据库,所以说如果服务A 需要获取服务B 的某个表的数据,那么就需要一次 HTTP 或 RPC 通信,那如果高峰期每秒需要调用100次,那岂不是需要100次 HTTP 或 RPC 通信,这是相当耗费接口性能的。
那怎么解决呢?
本地缓存那是肯定不是的,因为一般不同服务都是部署在不同的机器上面的,所以此时我们需要的是分布式缓存,例如 Redis;但是,访问量高的的服务当然还是需要本地缓存了。所以最后,我们不但需要本地缓存,还需要分布式缓存,但是 Spring Boot 却不能提供这种多级缓存的功能,所以需要我们自己来整合。
不用怕,我已经自己整了一个 Spring Boot Starter了,就是 h2cache-spring-boot-starter,我们只需要在配置文件配置上对应的信息,就可以启用这个多级缓存的功能了。
2、开始使用 添加依赖:大家正常引入下面依赖即可,因为我已经将此项目发布到 Maven 中央仓库了~
<denpency> <groupId>com.github.howinfun</groupId> <artifactId>h2cache-spring-boot-starter</artifactId> <version>0.0.1</version> </denpency> 在 Spring Boot properties 启用服务,并且加上对应的配置:开启多级缓存服务:
# Enable L2 cache or not h2cache.enabled=true