SpringBoot配置JVM缓存

  • 缓存分类:缓存分为内存缓存和JVM缓存
    内存缓存  如:redis
    JVM缓存  只在java中使用,单个JVM有效
  • 缓存 的使用场景
    减轻数据库访问压力
  1. 创建springboot工程<本文配置的是JVM缓存>
  2. 在pom.xml中添加缓存依赖
    ​
    <!-- springboot缓存依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    
    ​
  3. resources目录下建立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"
    	updateCheck="false">
    	<diskStore path="java.io.tmpdir/Tmp_EhCache" />
    
    <!-- name:缓存名称。  
         maxElementsInMemory:缓存最大个数。  
         eternal:对象是否永久有效,一但设置了,timeout将不起作用。  
         timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。  
         timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。  
         overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。  
         diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。  
         maxElementsOnDisk:硬盘最大缓存个数。  
         diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.  
         diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。  
         memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。  
         clearOnFlush:内存数量最大时是否清除
     -->
    	<!-- 默认配置 -->
    	<defaultCache maxElementsInMemory="5000" eternal="false"
    		timeToIdleSeconds="120" timeToLiveSeconds="120"
    		memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />
    
    	<cache name="baseCache" maxElementsInMemory="10000"
    		maxElementsOnDisk="100000" />
    
    </ehcache>
    
  4. 在App启动类中加上开启缓存注解@EnableCaching // 开启缓存注解
    package com.trip;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.cache.annotation.EnableCaching;
    
    @SpringBootApplication
    @EnableCaching // 开启缓存注解
    public class App {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		SpringApplication.run(App.class, args);
    	}
    
    }
  5. 创建user相关类和业务逻辑层
    // 控制层
    @Controller
    public class IndexController {
    	
    	@Autowired
    	private UserService userService;
    	
    	@GetMapping("/obtain")
    	@ResponseBody
    	public Object obtain(){
    		return userService.getUserMapper().findByPhone("17688796355");
    	}
    
    }
    // 业务逻辑层
    package com.trip.ehCache.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import com.trip.ehCache.dao.UserMapper;
    
    
    @Service
    @Transactional
    public class UserService {
    	@Autowired
    	private UserMapper userMapper;
    	
    	public UserMapper getUserMapper() {
    		return userMapper;
    	}
    	
    }
    // 数据访问层
    import org.springframework.cache.annotation.CacheConfig;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
    import com.trip.ehCache.entity.User;
    
    @CacheConfig(cacheNames = "baseCache") // 配置ehcache.xml注解, baseCache为配置文件定义的名称
    public interface UserMapper extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>{
    
    	@Cacheable // 该查询使用缓存注解
    	User findByPhone(String phone);
    	
    }
  6. 测试url  http://localhost:8080/obtain
  7. 删除数据库的数据,页面依然显示
  8. 删除缓存
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.CacheManager;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import com.trip.ehCache.service.UserService;
    
    @Controller
    public class IndexController {
    	
    	@Autowired
    	private UserService userService;
    	
    	@Autowired
    	private CacheManager cacheManager;
    	
    	/**
    	 * 添加缓存
    	 * @return
    	 */
    	@GetMapping("/obtain")
    	@ResponseBody
    	public Object obtain(){
    		return userService.getUserMapper().findByPhone("17688796355");
    	}
    	
    	/**
    	 * 删除缓存
    	 * @return
    	 */
    	@GetMapping("/delete")
    	@ResponseBody
    	public Object delete(){
    		cacheManager.getCache("baseCache").clear();
    		return "删除缓存";
    	}
    
    }

猜你喜欢

转载自blog.csdn.net/xiaobo5264063/article/details/89647428