一、案例

  1.1  引入maven依赖

  1. <!-- caching -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-cache</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>net.sf.ehcache</groupId>
  8. <artifactId>ehcache</artifactId>
  9. </dependency>

  1.2  配置application.properties

  1. #echache缓存
  2. spring.cache.type=ehcache
  3. spring.cache.ehcache.config=classpath:config/ehcache.xml

  1.3  配置config/ehcache.xml

  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:noNamespaceSchemaLocation="ehcache.xsd">
  3. <cache name="roncooCache" eternal="false" maxEntriesLocalHeap="0"
  4. timeToIdleSeconds="50"></cache>
  5. <!-- eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和 timeToLiveSeconds属性,默认为false -->
  6. <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制 -->
  7.  
  8. <!-- timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为 单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了
  9. timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。 只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以
  10. 无限期地处于空闲状态 -->
  11. </ehcache>

  1.4  启用@EnableCaching 注解支持

  1. @EnableCaching
  2. @SpringBootApplication
  3. public class Springboot01Application {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(Springboot01Application.class, args);
  7. }
  8. }

  1.5  编写实体类

  • 如下代码,写完后运行Springboot01Application.java会自动在数据库生成表结构
  1. package com.shyroke.entity;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Date;
  5.  
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.GeneratedValue;
  9. import javax.persistence.Id;
  10. import javax.persistence.Table;
  11.  
  12. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  13.  
  14. @Entity
  15. @JsonIgnoreProperties({ "handler","hibernateLazyInitializer" })
  16. @Table(name="user")
  17. public class UserBean {
  18.  
  19. @Id
  20. @GeneratedValue
  21. private Integer id;
  22.  
  23. @Column
  24. private Date createTime;
  25.  
  26. @Column
  27. private String userName;
  28.  
  29. @Column
  30. private String userIp;
  31.  
  32. public Integer getId() {
  33. return id;
  34. }
  35.  
  36. public void setId(Integer id) {
  37. this.id = id;
  38. }
  39.  
  40. public Date getCreateTime() {
  41. return createTime;
  42. }
  43.  
  44. public void setCreateTime(Date createTime) {
  45. this.createTime = createTime;
  46. }
  47.  
  48. public String getUserName() {
  49. return userName;
  50. }
  51.  
  52. public void setUserName(String userName) {
  53. this.userName = userName;
  54. }
  55.  
  56. public String getUserIp() {
  57. return userIp;
  58. }
  59.  
  60. public void setUserIp(String userIp) {
  61. this.userIp = userIp;
  62. }
  63.  
  64. @Override
  65. public String toString() {
  66. return "RoncooUserLog [id=" + id + ", createTime=" + createTime + ", userName=" + userName + ", userIp=" + userIp + "]";
  67. }
  68.  
  69. }

  1.6  编写控制器

  1. package com.shyroke.controller;
  2.  
  3. import java.util.Date;
  4. import java.util.List;
  5.  
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.data.domain.PageRequest;
  8. import org.springframework.data.domain.Pageable;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.ResponseBody;
  12.  
  13. import com.shyroke.dao.UserMapper;
  14. import com.shyroke.entity.UserBean;
  15. import com.shyroke.service.CacheUserService;
  16.  
  17. @Controller
  18. @RequestMapping(value = "/")
  19. public class IndexController {
  20.  
  21. @Autowired
  22. private CacheUserService cacheUserService;
  23.  
  24. @RequestMapping(value = "/select")
  25. @ResponseBody
  26. public UserBean get() {
  27. return cacheUserService.getUserById(1);
  28. }
  29.  
  30. @RequestMapping(value = "/update")
  31. @ResponseBody
  32. public UserBean update() {
  33. UserBean bean = cacheUserService.getUserById(1);
  34. bean.setUserName("测试");
  35. bean.setCreateTime(new Date());
  36. cacheUserService.update(bean);
  37. return bean;
  38. }
  39.  
  40. @RequestMapping(value = "/del")
  41. @ResponseBody
  42. public String del() {
  43. return cacheUserService.deleteById(1);
  44. }
  45.  
  46. }

  1.7  编写服务接口和实现类

  1. package com.shyroke.service;
  2.  
  3. import com.shyroke.entity.UserBean;
  4.  
  5. public interface CacheUserService {
  6. /**
  7. * 查询
  8. *
  9. * @param id
  10. * @return
  11. */
  12. public UserBean getUserById(int id);
  13.  
  14. /**
  15. * 更新
  16. *
  17. * @param user
  18. * @return
  19. */
  20.  
  21. public UserBean update(UserBean user);
  22.  
  23. /**
  24. * 删除
  25. *
  26. * @param id
  27. * @return
  28. */
  29.  
  30. public String deleteById(int id);
  31. }
  1. package com.shyroke.service.impl;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.cache.annotation.CacheConfig;
  5. import org.springframework.cache.annotation.CacheEvict;
  6. import org.springframework.cache.annotation.CachePut;
  7. import org.springframework.cache.annotation.Cacheable;
  8. import org.springframework.stereotype.Repository;
  9. import org.springframework.stereotype.Service;
  10.  
  11. import com.shyroke.dao.UserMapper;
  12. import com.shyroke.entity.UserBean;
  13. import com.shyroke.service.CacheUserService;
  14.  
  15. @CacheConfig(cacheNames = "roncooCache")
  16. @Service
  17. public class CacheUserServiceImpl implements CacheUserService{
  18.  
  19. @Autowired
  20. private UserMapper userMapper;
  21.  
  22. @Cacheable(key = "#p0")
  23. @Override
  24. public UserBean getUserById(int id) {
  25. System.out.println("查询功能,缓存找不到,直接读库, id=" + id);
  26. return userMapper.getOne(id);
  27. }
  28.  
  29. @CachePut(key = "#p0")
  30. @Override
  31. public UserBean update(UserBean user) {
  32. System.out.println("更新功能,更新缓存,直接写库, id=" + user);
  33. return userMapper.save(user);
  34. }
  35.  
  36. @CacheEvict(key = "#p0")
  37. @Override
  38. public String deleteById(int id) {
  39. System.out.println("删除功能,删除缓存,直接写库, id=" + id);
  40. userMapper.delete(id);
  41. return "删除成功";
  42. }
  43.  
  44. }

  1.8  编写userMapper.java

  1. package com.shyroke.dao;
  2.  
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5.  
  6. import com.shyroke.entity.UserBean;
  7.  
  8. public interface UserMapper extends JpaRepository<UserBean, Integer>{
  9.  
  10. }

  1.9  结果

  • 现在数据库中插入一条数据


  • 第一次访问,所以没有缓存,故发出一条sql语句查询。
  • 然后在访问“http://localhost:8888/select” 结果如下:

没有发出sql语句,说明是从缓存中读取的数据。



  • 测试更新结果

  • 更新完毕之后,返回更新后的数据,然后在返回“http://localhost:8888/select”

  • 没有发出查询语句,而且查询的结果的更新世间与执行“http://localhost:8888/update”更新操作后的时间一致,说明查询的是最新的更新后的数据,所以表示“http://localhost:8888/update”更新操作会先更新缓存。

(十六)SpringBoot之使用 Caching- - EhCache的更多相关文章

  1. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  2. [十六]SpringBoot 之 读取环境变量和绑定属性对象

    1.读取环境变量 凡是被spring管理的类,实现接口EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的 ...

  3. [二十六]SpringBoot 之 整合log4j

    1.引入log4j依赖 在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Sprin ...

  4. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

  5. 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint

    目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...

  6. Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置

    Actuator 简介 Actuator 是 Spring Boot 提供的对应用系统的自省和监控功能.通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘.内存.C ...

  7. SpringBoot:三十五道SpringBoot面试题及答案

    SpringBoot面试前言今天博主将为大家分享三十五道SpringBoot面试题及答案,不喜勿喷,如有异议欢迎讨论! Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一 ...

  8. spring-boot-route(十六)使用logback生产日志文件

    日志是一个系统非常重要的一部分,我们经常需要通过查看日志来定位问题,今天我们一起来学习一下Spring Boot的日志系统.有很多同学习惯性的在生产代码中使用System.out来输出日志,这是不推荐 ...

  9. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  10. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

随机推荐

  1. 网络中的tarpit/tar pit

    最近看haproxy源码,里面有个TARPIT的概念不能理解,找了很久才找到对应的意思.特此记录. tarpit 本意是“沼泽地.地洼地”,这里显然把它引申为“捕获或者困住某个物体”. 在网络语义中提 ...

  2. 调用百度地图API的总结

    因为项目要用到百度地图,所以先摸索了一下,各种功能官方都有文档,点击可查看,文章的话我就直接写我用到的功能例子了,要用可以直接复制粘贴~ 一.主要涉及到的几个接口(先申请密钥): 1.技术一:坐标转换 ...

  3. android: Canvas的drawArc()方法的几个误区

    绘制圆环很多时候会用到Canvas的drawArc方法, drawArc()方法的说明很简单: public void drawArc (RectF oval, float startAngle, f ...

  4. 简略描述:一个 url 从输入按下回车键,到页面展示出来,都经历了什么?

    首先,在输入网址按下回车以后,这个时候DNS服务器会通过当前的网址去解析网址的 ip: 在查找到真的 IP 以后,这个时候浏览器会向 web 服务器发起一个 tcp 连接请求(三次握手): 第一次:建 ...

  5. SSD论文学习

    SSD: Single Shot MultiBox Detector——目标检测 参考https://blog.csdn.net/u010167269/article/details/52563573 ...

  6. osg::PagedLOD example

    int main() { osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; osg::ref_ptr< ...

  7. MySQL复制表结构

    示例SQL: create table testdb.test_table_back like testdb.test_table

  8. Web前端开发工具

    WebStorm: dreamweaver; Hbuilder: sublime text: 前端神器brackets.

  9. (转)华为 安卓手机在MAC系统下 ADB 识别

    使用MACOS发现在Android开发环境完整的情况下,接入小米,SAMSUNG,HTC,ZTE等手机都可以自动识别,如果暂时不能识别,只需要在 adb_usb.ini 中设置之后也可以识别,并可以在 ...

  10. Ubuntu下配置LVS【h】

    以后服务器只用CentOS和Ubuntu.下午用redhat装个lvs装了一下午都没搞好,TNND的.果断用Ubuntu,不到两个小时就搞定了. 原文参见: http://kamengwang.blo ...