springboot+mybatis集成自定义缓存ehcache用法笔记


       3a8a0e256b60abcde04e286b984dadd8.png        

今天小编给大家整理了springboot+mybatis集成自定义缓存ehcache用法笔记,希望对大家能有所办帮助!

一、ehcache介绍

EhCache 是一个纯Java的进程内缓存管理框架,属于开源的Java分布式缓存框架,主要用于通用缓存,Java EE和轻量级容器。

1、特点

1. 简单、快速

3. 提供多种缓存策略

4. 缓存数据可分两级:内存和磁盘

5. 缓存数据会在服务器重启的过程中重新写入磁盘

6. 可以通过RMI、可插入API等方式进行分布式缓存

7. 具有缓存和缓存管理器的侦听接口

8. 支持多缓存管理器实例,以及一个实例的多个缓存区域

9. 提供了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,手动方式时提供者的地址,多个的话用|隔开 --><cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:40002/userCache" /><!-- <cacheManagerPeerProviderFactoryclass="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 --><cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="hostName=127.0.0.1, port=40001, socketTimeoutMillis=2000" /><!-- <cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/> --><defaultCache eternal="false" maxElementsInMemory="1000"overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" /><cachename="userCache"maxElementsInMemory="1000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="300"overflowToDisk="false"memoryStoreEvictionPolicy="LRU"><!-- 配置缓存事件监听器 replicateAsynchronously 操作是否异步,默认值为true. replicatePuts 添加操作是否同步到集群内的其他缓存,默认为true.replicateUpdates 更新操作是否同步到集群内的其他缓存,默认为true. replicateUpdatesViaCopy 更新之后的对象是否复制到集群中的其他缓存(true);replicateRemovals 删除操作是否同步到集群内的其他缓存,默认为true. --><cacheEventListenerFactoryclass="net.sf.ehcache.distribution.RMICacheReplicatorFactory"properties="replicateAsynchronously=true,replicatePuts=true,replicateUpdates=true,replicateUpdatesViaCopy=true,replicateRemovals=true " /><!-- 初始化缓存,以及自动设置 --><bootstrapCacheLoaderFactoryclass="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 {@Autowiredprivate 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 {@Autowiredprivate 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;}
}

IT技术分享社区

个人博客网站:https://programmerblog.xyz

c9b483006cf291d0e83e3858703cee8e.png

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java取绝对值

在Java中可以使用Math.abs()方法来方便的进行绝对值计算&#xff0c;例如&#xff1a; 输入的是正数的时候直接返回即可&#xff0c;当是负数的时候返回它的相反数即可。 使用三目运算符可以使用一行代码就能做到 int value Math.abs(-90);System.out.println(value);System…

PHP怎么做一个加法口诀,神奇的手指速算口诀,100以内的加减法一分钟学会

手指速算是一套手、心、脑并用的科学计算方法&#xff0c;教孩子学会&#xff0c;既能开发大脑、增强动作协调能力和记忆力&#xff0c;还能增强学习兴趣哦~学起来并不难哦&#xff0c;爸爸妈妈可以和孩子一起算一算&#xff0c;比比看谁更快&#xff01;手指速算秘诀准备&…

Android_Layout (一)

layout &#xff08;布局&#xff09; --->Android 有五大布局&#xff0c;分别是&#xff1a; LinearLayout : 线性布局&#xff0c;子组件按照垂直或者水平方向来布局。RelativeLayout &#xff1a;相对布局&#xff0c;按照控件之间的相互位置进行参照物的概念排布&…

前端:uniapp封装网络请求笔记

uniapp作为开发移动端的前端框架&#xff0c;目前国内是非常流行的&#xff0c;使用HbuilderX开发工具基于uniapp框架开发的系统可以方便的转换为小程序、APP等移动端程序&#xff0c;大大降低了移动开发的成本。网络请求更是每个前端项目必备的技术&#xff0c;所以有必要进行…

java中instanceof使用详细介绍

instanceof是Java语言中的一个二元运算符&#xff0c;它的作用是&#xff1a;判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例&#xff0c;即它左边的对象是否是它右边的类的实例&#xff0c;该运算符返回boolean类型的数据。 boolean result obj…

javaWEB总结(9):自定义HttpServlet

前言:我们知道 MyHttpServlet是MyGenericServlet的子类&#xff0c;MyHttpServlet会继承父类的方法&#xff0c;可是却很少去追问MyHttpServlet中的doGet方法和doPost方法是如何进行判断的&#xff0c;本文主要做一个小例子&#xff0c;进一步理解HttpServlet。有些代码前文多次…

Java中局部变量必须初始化

Java中有两种变量&#xff0c;局部变量和成员变量。 成员变量可以不进行初始化&#xff0c;虚拟机也会确保它有一个默认的值。 局部变量不能这样做&#xff0c;我们必须对它进行赋值&#xff0c;才能使用它。

php 直播服务器搭建,基于Nginx搭建RTMP/HLS视频直播服务器

1、Nginx环境搭建(基于lnmp环境)//下载并安装lnmp环境wget -c http://soft.vpser.net/lnmp/lnmp1.3.tar.gz && tar zxf lnmp1.3.tar.gz && cd lnmp1.3 && ./install.sh lnmp安装完成安装完成后访问服务器地址会出现如下界面lnmpPS&#xff1a;安装时生…

办公:office办公软件Excel表格的打印技巧

很多新手使用办公软件过程中&#xff0c;对于Excel的打印出现了诸多问题&#xff0c;今天我们就一起来看看表格打印的几个技巧&#xff01; 打印预览时网格线怎么不见了&#xff1f; 如何调整打印区域的页边距&#xff1f; 如何设置单色打印&#xff1f; ...... 这些打印时遇到…

线程池和线程详细教程

1. 线程池的概念&#xff1a; 线程池就是首先创建一些线程&#xff0c;它们的集合称为线程池。使用线程池可以很好地提高性能&#xff0c;线程池在系统启动时即创建大量空闲的线程&#xff0c;程序将一个任务传给线程池&#xff0c;线程池就会启动一条线程来执行这个任务&#…

虚拟主机 php .htacess,LiteSpeed添加虚拟主机+支持htaccess图文教程

上次给大家简单介绍了Debian下手动安装LiteSpeedMySQLPHP的教程(点击查看)&#xff0c;但是这个教程还没完&#xff0c;想要使用litespeed还要进入后台进行设置&#xff0c;包括添加虚拟主机和.htaccess伪静态的支持&#xff0c;本文就继续这个话题给大家详细做个图文教程吧~为…

前端:uniapp封装组件用法笔记

大家在做前端项目开发的时候&#xff0c;经常会遇到公用的一些页面&#xff0c;比如搜索、列表、商品详情卡片、评论列表等。为了提高开发效率、使代码看起来更加简洁&#xff0c;这个时候封装相应的组件是最好的解决方案。今天小编给大家介绍一下如何在uniapp中封装组件&#…

Angular的工作原理

首先上一小段代码&#xff08;index.html&#xff09;&#xff0c;结合代码我们来看看&#xff0c;angular一步一步都做了些什么。 <!doctype html> <html ng-app><head><script src"angular.js"></script></head><body>&…

网络知识:四个网络命令ping、arp、tracert、route的用法介绍

网络相关的从业人员&#xff0c;都需要面对检测和解决网络故障的各种问题&#xff0c;实际案例中因为网络导致的故障也是最多的&#xff0c;今天我们和大家一起来学习一下解决网络故障时使用最多的四个网络命令。希望对大家以后的实际工作中的故障排除起到作用。 1、Ping命令的…

jQuery掷骰子

网上找的jQuery掷骰子效果&#xff0c;测试兼容IE7及以上浏览器&#xff0c;IE6没有测试 js代码如下&#xff1a; 1 $(function(){2 var dice $("#dice");3 dice.click(function(){4 $(".wrap").append("<div iddice_mask><…

电脑知识:台式电脑如何使用无线网上网

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

电脑维修:如何给笔记本电脑升级内存条

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Object o = new Object()在内存中占几个字节

CAS&#xff1a; Compare and Swap&#xff0c;即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的&#xff0c;这是一种独占锁&#xff0c;也是…

MYSQL笔记:删除操作Delete、Truncate、Drop用法比较

今天小编给大家梳理一下MYSQL删除操作Delete、Truncate、Drop用法有什么区别&#xff0c;到底该如何合理使用&#xff0c;希望对大家能有帮助&#xff01;1、执行速度比较Delete、Truncate、Drop关键字都可以删除数据drop>truncate>delete2、原理方面2.1 deletedelete属于…