SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]

来源:互联网 发布:ant编译java代码 编辑:程序博客网 时间:2024/05/22 12:46

Spring定义了org.springframework.cache.CacheManagerorg.springframework.cache.Cache接口来统一不同的缓存技术,SpringBoot为我们提供了自动配置多个CacheManager的实现


在不适用任何额外配置的情况下,默认使用SimpleCacheConfiguration

SpringBoot通过spring.cache为前缀来配置缓存



使用这些缓存实现的话,只需导入相关缓存的依赖,并在配置类中使用@EnableCaching开启缓存即可

Guava实现

这里简单介绍下使用Guava实现

引入的依赖

pom.xml

[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>com.ibigsea</groupId>  
  5.     <artifactId>spirngboot-cache-demo</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.       
  8.       
  9.     <properties>  
  10.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  11.         <boot.version>1.3.5.RELEASE</boot.version>  
  12.     </properties>  
  13.       
  14.     <dependencies>  
  15.         <dependency>  
  16.             <groupId>org.springframework.boot</groupId>  
  17.             <artifactId>spring-boot-starter-web</artifactId>  
  18.             <version>${boot.version}</version>  
  19.         </dependency>  
  20.         <dependency>  
  21.             <groupId>org.springframework.boot</groupId>  
  22.             <artifactId>spring-boot-starter-test</artifactId>  
  23.             <version>${boot.version}</version>  
  24.             <scope>test</scope>  
  25.         </dependency>  
  26.         <dependency>  
  27.             <groupId>org.springframework.boot</groupId>  
  28.             <artifactId>spring-boot-starter-cache</artifactId>  
  29.             <version>${boot.version}</version>  
  30.         </dependency>  
  31.         <dependency>  
  32.             <groupId>com.google.guava</groupId>  
  33.             <artifactId>guava</artifactId>  
  34.             <version>19.0</version>  
  35.         </dependency>  
  36.     </dependencies>  
  37. </project>  

dataCache.java

[java] view plain copy
  1. package com.ibigsea.springboot_cache_demo.cache;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7.   
  8. import javax.annotation.PostConstruct;  
  9.   
  10. import org.springframework.cache.annotation.CacheConfig;  
  11. import org.springframework.cache.annotation.CacheEvict;  
  12. import org.springframework.cache.annotation.CachePut;  
  13. import org.springframework.cache.annotation.Cacheable;  
  14. import org.springframework.stereotype.Component;  
  15.   
  16. @Component  
  17. public class DataCache {  
  18.       
  19.     private Map<Long, String> dataMap = new HashMap<>();  
  20.       
  21.     /** 
  22.      * 初始化 
  23.      */  
  24.     @PostConstruct  
  25.     public void init() {  
  26.         dataMap.put(1L, "张三");  
  27.         dataMap.put(2L, "李四");  
  28.         dataMap.put(3L, "王五");  
  29.     }  
  30.       
  31.     /** 
  32.      * 查询 
  33.      * 如果数据没有缓存,那么从dataMap里面获取,如果缓存了, 
  34.      * 那么从guavaDemo里面获取 
  35.      * 并且将缓存的数据存入到 guavaDemo里面 
  36.      * 其中key 为 #id+dataMap 
  37.      */  
  38.     @Cacheable(value="guavaDemo" ,key="#id + 'dataMap'")  
  39.     public String query(Long id) {  
  40.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  41.         System.out.println(sdf.format(new Date()) + " : query id is " + id);  
  42.         return dataMap.get(id);  
  43.     }  
  44.       
  45.     /** 
  46.      * 插入 或者更新 
  47.      * 插入或更新数据到dataMap中 
  48.      * 并且缓存到 guavaDemo中 
  49.      * 如果存在了那么更新缓存中的值 
  50.      * 其中key 为 #id+dataMap 
  51.      */  
  52.     @CachePut(value="guavaDemo" ,key="#id + 'dataMap'")  
  53.     public String put(Long id, String value) {  
  54.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  55.         System.out.println(sdf.format(new Date()) + " : add data ,id is "+ id);  
  56.         dataMap.put(id, value);  
  57.         // data persistence  
  58.         return value;  
  59.     }  
  60.       
  61.     /** 
  62.      * 删除 
  63.      * 删除dataMap里面的数据 
  64.      * 并且删除缓存guavaDemo中的数据 
  65.      * 其中key 为 #id+dataMap 
  66.      */  
  67.     @CacheEvict(value="guavaDemo" , key="#id + 'dataMap'")  
  68.     public void remove(Long id) {  
  69.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  70.         System.out.println(sdf.format(new Date()) + " : remove id is "+ id + " data");  
  71.         dataMap.remove(id);  
  72.         // data remove    
  73.     }  
  74.       
  75.       
  76. }  

关于缓存注解中的value,就是配置文件中的cache-names

关于注解中的key这个值,如果不指定的话 ,那么会取方法参数当做Key

 

application.yml

[html] view plain copy
  1. spring:  
  2.   cache:   
  3.     #缓存名称  
  4.     cache-names: guavaDemo  
  5.     #缓存最大数量500条, 缓存失效时间 6个小时  
  6.     guava.spec: maximumSize=500,expireAfterWrite=360m  

App.java

[java] view plain copy
  1. package com.ibigsea.springboot_cache_demo;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5.   
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.boot.SpringApplication;  
  8. import org.springframework.boot.autoconfigure.SpringBootApplication;  
  9. import org.springframework.cache.annotation.EnableCaching;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.bind.annotation.RestController;  
  12.   
  13. import com.ibigsea.springboot_cache_demo.cache.DataCache;  
  14.   
  15. /** 
  16.  * 是Spring Boot项目的核心注解,主要是开启自动配置 
  17.  */  
  18. @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan  
  19. @RestController  
  20. // 开启缓存  
  21. @EnableCaching  
  22. public class App {  
  23.       
  24.     @Autowired  
  25.     private DataCache dataCache;  
  26.       
  27.     public static void main(String[] args) {  
  28.         SpringApplication.run(App.class, args);  
  29.     }  
  30.       
  31.     @RequestMapping("/put")  
  32.     public String put(Long id, String value) {  
  33.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  34.         return  sdf.format(new Date()) + " : value is " + dataCache.put(id, value) ;  
  35.     }  
  36.   
  37.     @RequestMapping("/get")  
  38.     public String query(Long id){  
  39.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  40.         return sdf.format(new Date()) + " : value is " +dataCache.query(id) ;  
  41.     }  
  42.       
  43.     @RequestMapping("/remove")  
  44.     public String remove(Long id) {  
  45.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  46.         dataCache.remove(id) ;  
  47.         return sdf.format(new Date()) + " : success " ;  
  48.     }  
  49.       
  50. }  

运行结果


关于注解配置:

@Cacheable


@CacheEvict


@CachePut

和上面的一样,只是这个注解是用来更新或者插入数据到缓存中的,

其中key自己定义,返回值会缓存

 

还有就是SpringBoot会根据你的类路径里面的依赖jar,来确定使用什么类型进行缓存,所以基本是我们是不用配置spring.cache.type这个属性的


Redis实现

Redis缓存:

如果是用redis作为缓存的话

我们只需要引入redis相关依赖,修改yml配置属性

[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>com.ibigsea</groupId>  
  5.     <artifactId>spirngboot-cache-demo</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.   
  8.   
  9.     <properties>  
  10.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  11.         <boot.version>1.3.5.RELEASE</boot.version>  
  12.     </properties>  
  13.   
  14.     <dependencies>  
  15.         <dependency>  
  16.             <groupId>org.springframework.boot</groupId>  
  17.             <artifactId>spring-boot-starter-web</artifactId>  
  18.             <version>${boot.version}</version>  
  19.         </dependency>  
  20.         <dependency>  
  21.             <groupId>org.springframework.boot</groupId>  
  22.             <artifactId>spring-boot-starter-test</artifactId>  
  23.             <version>${boot.version}</version>  
  24.             <scope>test</scope>  
  25.         </dependency>  
  26.         <dependency>  
  27.             <groupId>org.springframework.boot</groupId>  
  28.             <artifactId>spring-boot-starter-cache</artifactId>  
  29.             <version>${boot.version}</version>  
  30.         </dependency>  
  31.         <dependency>  
  32.             <groupId>org.springframework.boot</groupId>  
  33.             <artifactId>spring-boot-starter-redis</artifactId>  
  34.             <version>${boot.version}</version>  
  35.         </dependency>  
  36. <!--         <dependency> -->  
  37. <!--             <groupId>com.google.guava</groupId> -->  
  38. <!--             <artifactId>guava</artifactId> -->  
  39. <!--             <version>19.0</version> -->  
  40. <!--         </dependency> -->  
  41.     </dependencies>  
  42. </project>  

application.yml

[html] view plain copy
  1. spring:  
  2.   cache:   
  3.     #缓存名称  
  4.     cache-names: guavaDemo  
  5.     #缓存最大数量500条, 缓存失效时间 6个小时  
  6.     #guava.spec: maximumSize=500,expireAfterWrite=360m  
  7.   # REDIS (RedisProperties)    
  8.   redis :   
  9.     host : localhost # server host    
  10.     port : 6379 # connection port    
  11.     pool.max-idle : 8 # pool settings ...    
  12.     pool.min-idle : 1   
  13.     pool.max-active : 8    
  14.     pool.max-wait : -1    

就这样就OK,代码什么的都是不用改变的,是不是很方便

测试结果



数据都会缓存到redis里面

其他的地方就不测试了 都是差不多的

 

使用其他实现导入对应的依赖,然后添加配置即可


注意: 

如果使用guava缓存的时候 ,同时添加了redis的jar依赖,或者其他的依赖,可能会出现异常

这个时候加上 type: GUAVA 就可以



阅读全文
0 0
原创粉丝点击