springboot+mybatis集成自定义缓存ehcache用法笔记
【摘要】 今天小编给大家整理了springboot+mybatis集成自定义缓存ehcache用法笔记,希望对大家能有所办帮助! 一、ehcache介绍EhCache 是一个纯Java的进程内缓存管理框架,属于开源的Java分布式缓存框架,主要用于通用缓存,Java EE和轻量级容器。 1、特点简单、快速提供多种缓存策略缓存数据可分两级:内存和磁盘缓存数据会在服务器重启的过程中重新写入磁盘可以通过RM...
今天小编给大家整理了springboot+mybatis集成自定义缓存ehcache用法笔记,希望对大家能有所办帮助!
一、ehcache介绍
EhCache 是一个纯Java的进程内缓存管理框架,属于开源的Java分布式缓存框架,主要用于通用缓存,Java EE和轻量级容器。
1、特点
-
简单、快速
-
提供多种缓存策略
-
缓存数据可分两级:内存和磁盘
-
缓存数据会在服务器重启的过程中重新写入磁盘
-
可以通过RMI、可插入API等方式进行分布式缓存
-
具有缓存和缓存管理器的侦听接口
-
支持多缓存管理器实例,以及一个实例的多个缓存区域
-
提供了Hibernate的缓存实现
2、应用场景
- 单应用或对缓存访问性能要求很高的应用
- 适合简单共享
- 适合缓存内容不大的场景,比如MyBatis自定义缓存、系统配置信息、页面缓存。
二、springboot+mybatis集成ehcache步骤
Spring Boot 的缓存机制
高速缓存抽象不提供实际存储,并且依赖于由org.springframework.cache.Cache和org.springframework.cache.CacheManager接口实现的抽象。 Spring Boot根据实现自动配置合适的CacheManager,只要缓存支持通过@EnableCaching注解启用即可。
1、添加ehcache.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<diskStore path="java.io.tmpdir" />
<!-- 配置提供者 1、peerDiscovery,提供者方式,有两种方式:自动发现(automatic)、手动配置(manual) 2、rmiUrls,手动方式时提供者的地址,多个的话用|隔开 -->
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:40002/userCache" />
<!-- <cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446,timeToLive=255"/>
-->
<!-- 配置监听器 1、hostName 主机地址 2、port 端口 3、socketTimeoutMillis socket子模块的超时时间,默认是2000ms -->
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=127.0.0.1, port=40001, socketTimeoutMillis=2000" />
<!-- <cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/> -->
<defaultCache eternal="false" maxElementsInMemory="1000"
overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" />
<cache
name="userCache"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="300"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU">
<!-- 配置缓存事件监听器 replicateAsynchronously 操作是否异步,默认值为true. replicatePuts 添加操作是否同步到集群内的其他缓存,默认为true.
replicateUpdates 更新操作是否同步到集群内的其他缓存,默认为true. replicateUpdatesViaCopy 更新之后的对象是否复制到集群中的其他缓存(true);
replicateRemovals 删除操作是否同步到集群内的其他缓存,默认为true. -->
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="
replicateAsynchronously=true,
replicatePuts=true,
replicateUpdates=true,
replicateUpdatesViaCopy=true,
replicateRemovals=true " />
<!-- 初始化缓存,以及自动设置 -->
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
properties="bootstrapAsynchronously=true" />
</cache>
</ehcache>
2、配置 application.properyies
#cache 配置cache
spring.cache.cache-names=userCache
spring.cache.jcache.config=classpath:ehcache.xml
3、springboot启动类增加注解@EnableCaching
@SpringBootApplication
@ComponentScan(basePackages="com.ehcache")//扫描组件
@EnableCaching
public class EhcacheTestApplication {
public static void main(String[] args) {
SpringApplication.run(EhcacheTestApplication.class, args);
}
}
4、UserInfoService.java 文件增加缓存注解
@Service
public class UserInfoService {
@Autowired
private UserDao userDao;
@CacheEvict(key="'user_'+#uid", value="userCache")
public void del(String uid) {
userDao.del(uid);
}
@CachePut(key="'user_'+#user.id", value="userCache")
public void update(User user) {
userDao.update(user);
}
@Cacheable(key="'user_'+#id",value="userCache")
public User getUserById(String id){
return userDao.findById(id); }
@CacheEvict(key="'user'",value="userCache")
public String save(User user) {
return userDao.save(user);
}
}
5、增加测试控制器TestController.java
package com.ehcache.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.ehcache.entity.User;
import com.ehcache.factory.CacheManagerFactory;
import com.ehcache.factory.UserFactory;
import com.ehcache.service.UserService;
import com.google.gson.Gson;
import net.sf.ehcache.Element;
@RestController
@RequestMapping("/CacheTest")
public class CacheTestController {
@Autowired
private UserService userService;
Gson gson = new Gson();
CacheManagerFactory cmf = CacheManagerFactory.getInstance();
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test(HttpServletRequest request){
// 新增新用户
String id = userService.save(UserFactory.createUser());
User user = userService.getUserById(id);
user.setUsername("小明");
userService.update(user);
// 查询该用户
System.out.println(gson.toJson(user, User.class));
System.out.println();
// 再查询该用户
User user = userService.getUserById(uid);
System.out.println(gson.toJson(user, User.class));
System.out.println();
// 更新该用户
userService.update(user);
// 更新成功后再查询该用户 System.out.println(gson.toJson(userService.getUserById(id), User.class));
System.out.println();
// 删除该用户
userService.del(id);
System.out.println();
// 删除后再查询该用户 System.out.println(gson.toJson(userService.getUserById(id), User.class));
return id;
}
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)