SpringBoot中Cache缓存的使用

第一步:创建SpringBoot项目

Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    <version>2.3.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- MyBatis单元测试必须得添加以下两个jar包 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.4</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.4</version>
</dependency>
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.22</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Yml配置

server:
    port: 80
    servlet:
        context-path: /ed
mybatis:
    #Entity扫描的model包
    type-aliases-package: com.hc.domain
    #显示日志
    configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
spring:
    application:
        name: EhcacheDemo
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&useUnicode=true
        username: root
        password: root

第二步:新建ehcache.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false">
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    <!-- 默认配置 -->
    <defaultCache maxElementsInMemory="5000" eternal="false"
                  timeToIdleSeconds="120" timeToLiveSeconds="120"
                  memoryStoreEvictionPolicy="LRU" overflowToDisk="false"/>
    <cache name="baseCache" maxElementsInMemory="10000"
           maxElementsOnDisk="100000"/>
</ehcache>

配置信息说明:

  • name:缓存名称。
  • maxElementsInMemory:缓存最大个数
  • eternal:对象是否永久有效,一但设置timeout将不起作用
  • timeToIdleSeconds:对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
  • timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0,也就是对象存活时间无穷大
  • overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache是否将对象写到磁盘中
  • diskSpoolBufferSizeMB:设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
  • maxElementsOnDisk:硬盘最大缓存个数
  • diskPersistent:是否缓存虚拟机重启期数据,默认不缓存
  • diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
  • memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)
  • clearOnFlush:内存数量最大时是否清除

第三步:具体代码:

实体类

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
}

Mapper类

@Mapper
@CacheConfig(cacheNames = "userCache")
public interface UserMapper {
    @Cacheable
    @Select("select * from tb_user where id = #{id}")
    User selectByPrimaryKey(@Param("id") Integer id);
    @Select("select * from tb_user where username = #{username}")
    User selectByUsername(@Param("username") String username);
}

Controller类

@RestController
public class UserController {
    @Resource
    private UserMapper userMapper;
    @GetMapping("selectByPrimaryKey")
    public User selectByPrimaryKey(){
        User user = userMapper.selectByPrimaryKey(1001);
        return user;
    }
    @GetMapping("selectByUsername")
    public void selectByUsername(){
        userMapper.selectByUsername("lisi");
    }

	// 可以采用如下代码清除缓存:
	@Resource
	private CacheManager cacheManager;
		@RequestMapping("/rmCache")
		public void remoKey() {
    		cacheManager.getCache("userCache").clear();
		}
	}

你可能感兴趣的:(#,SpringBoot)