实习笔记13-EhCache缓存(本地缓存)
最近有把数据从一个函数传递到另一个函数的需求,如果这些数据使用频率很高的话,就可以写进缓存里。所以浅浅了解常用的缓存以及使用场景,使用方法还是很有帮助的。
EhCache是一个开源的、设计用于提高数据从关系型数据库中取出时高花费、高延时的缓存解决方案。EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。EhCache缓存存储和读取非常快,并且支持多种缓存策略:堆缓存、磁盘缓存、集群缓存。
EhCache适合两种业务:
- QPS多。
- 缓存数据量小。
TIPS:
- 敏感数据不适应EhCache,更新快。
- 建议将过期时间设置的非常小,1-10s。
本地缓存是内存访问,没有远程交互开销,性能最好,但是受限于单机容量,一般缓存较小且无法扩展
一、单独使用EhCache配置:
- 引入依赖
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.8.1</version>
</dependency>
- 快速入门代码
public static void main(String[] args) {
//1. 构建核心组件,CacheManager
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
// 设置缓存别名
.withCache("cache1",CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class,Object.class, ResourcePoolsBuilder.heap(1)))
// 同时指定缓存的key-value类型,以及缓存容纳的个数
.build();
//2. 初始化
cacheManager.init();
//3. 获取Cache方式一。从缓存管理器拿到设置好的Cache
Cache<String, Object> cache1 = cacheManager.getCache("cache1", String.class, Object.class);
//4. 获取Cache方式二。 基于缓存管理器构建一个Cache
Cache<String, Object> cache2 = cacheManager.createCache("cache2", CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Object.class, ResourcePoolsBuilder.heap(5)));
//5. 操作
cache1.put("cache0","阿巴阿巴");
Object value1 = cache1.get("cache0");
System.out.println(value1);
}
二、SpringBoot整合EhCache配置:
- 引入依赖
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
- 准备EhCache配置项
需要告诉Spring Boot去哪里找缓存配置文件,这需要在Spring Boot配置文件中进行设置:
spring.cache.jcache.config=classpath:ehcache.xml
3.使用@EnableCaching注解开启Spring Boot应用程序缓存功能,你可以在应用主类中进行操作:
package com.ramostear.cache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class CacheApplication {
public static void main(String[] args) {
SpringApplication.run(CacheApplication.class, args);
}
}
4.需要创建一个 ehcache 的配置文件,该文件放置在类路径下,如resources目录下:
<config xmlns: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="true"/>
</service>
<cache alias="person">
<key-type>java.lang.Long</key-type>
<value-type>com.ramostear.cache.entity.Person</value-type>
<expiry>
<ttl unit="minutes">1</ttl>
</expiry>
<listeners>
<listener>
<class>com.ramostear.cache.config.PersonCacheEventLogger</class>
<event-firing-mode>ASYNCHRONOUS</event-firing-mode>
<event-ordering-mode>UNORDERED</event-ordering-mode>
<events-to-fire-on>CREATED</events-to-fire-on>
<events-to-fire-on>UPDATED</events-to-fire-on>
<events-to-fire-on>EXPIRED</events-to-fire-on>
<events-to-fire-on>REMOVED</events-to-fire-on>
<events-to-fire-on>EVICTED</events-to-fire-on>
</listener>
</listeners>
<resources>
<heap unit="entries">2000</heap>
<offheap unit="MB">100</offheap>
</resources>
</cache>
</config>
5.还需要定义个缓存事件监听器,用于记录系统操作缓存数据的情况,最快的方法是实现CacheEventListener接口:
package com.ramostear.cache.config;
import org.ehcache.event.CacheEvent;
import org.ehcache.event.CacheEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PersonCacheEventLogger implements CacheEventListener<Object,Object>{
private static final Logger logger = LoggerFactory.getLogger(PersonCacheEventLogger.class);
@Override
public void onEvent(CacheEvent cacheEvent) {
logger.info("person caching event {} {} {} {}",
cacheEvent.getType(),
cacheEvent.getKey(),
cacheEvent.getOldValue(),
cacheEvent.getNewValue());
}
}
6.使用@Cacheable注解
@Cacheable(cacheNames = "person",key = "#id")