Spring Boot缓存实战 默认Cache(ConcurrentMapCacheManager)
2017-08-11 13:53
766 查看
Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。
从上面可以看出第一次走的是数据库,第二次走的是缓存
源码:
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-cache 工程
pom文件
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> </dependency> </dependencies>
关键Service
package com.xiaolyuh.service.impl; import com.xiaolyuh.entity.Person; import com.xiaolyuh.repository.PersonRepository; import com.xiaolyuh.service.PersonService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class PersonServiceImpl implements PersonService { @Autowired PersonRepository personRepository; @Override @CachePut(value = "people", key = "#person.id") public Person save(Person person) { Person p = personRepository.save(person); System.out.println("为id、key为:" + p.getId() + "数据做了缓存"); return p; } @Override @CacheEvict(value = "people")//2 public void remove(Long id) { System.out.println("删除了id、key为" + id + "的数据缓存"); //这里不做实际删除操作 } @Override @Cacheable(value = "people", key = "#person.id")//3 public Person findOne(Person person) { Person p = personRepository.findOne(person.getId()); System.out.println("为id、key为:" + p.getId() + "数据做了缓存"); return p; } }
Controller
package com.xiaolyuh.controller; import com.xiaolyuh.entity.Person; import com.xiaolyuh.service.PersonService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class CacheController { @Autowired PersonService personService; @RequestMapping("/put") public long put(@RequestBody Person person) { Person p = personService.save(person); return p.getId(); } @RequestMapping("/able") public Person cacheable(Person person) { return personService.findOne(person); } @RequestMapping("/evit") public String evit(Long id) { personService.remove(id); return "ok"; } }
启动类
@SpringBootApplication @EnableCaching// 开启缓存,需要显示的指定 public class SpringBootStudentCacheApplication { public static void main(String[] args) { SpringApplication.run(SpringBootStudentCacheApplication.class, args); } }
测试类
package com.xiaolyuh; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import net.minidev.json.JSONObject; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootStudentCacheApplicationTests { @Test public void contextLoads() { } private MockMvc mockMvc; // 模拟MVC对象,通过MockMvcBuilders.webAppContextSetup(this.wac).build()初始化。 @Autowired private WebApplicationContext wac; // 注入WebApplicationContext // @Autowired // private MockHttpSession session;// 注入模拟的http session // // @Autowired // private MockHttpServletRequest request;// 注入模拟的http request\ @Before // 在测试开始前初始化工作 public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } @Test public void testAble() throws Exception { for (int i = 0; i < 2; i++) { MvcResult result = mockMvc.perform(post("/able").param("id", "2")) .andExpect(status().isOk())// 模拟向testRest发送get请求 .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))// 预期返回值的媒体类型text/plain; // charset=UTF-8 .andReturn();// 返回执行请求的结果 System.out.println(result.getResponse().getContentAsString()); } } }
打印日志
从上面可以看出第一次走的是数据库,第二次走的是缓存
源码:
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-cache 工程
相关文章推荐
- SpringBoot--P-1:缓存 Another unnamed CacheManager already exists in the same VM.
- 实例详解Spring Boot实战之Redis缓存登录验证码
- Spring缓存 org.springframework.cache.ehcache.EhCacheManagerFactoryBean
- spring boot整合shiro后,部分注解(Cache缓存、Transaction事务等)失效的问题
- SpringBoot -- 集成Redis/CacheManager
- Spring Boot缓存实战 Caffeine示例
- Spring Boot 菜鸟教程 17 Cache-缓存
- springBoot学习(四): springBoot + Cache 缓存
- spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战
- Spring Boot Cache + redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置
- Spring缓存 org.springframework.cache.ehcache.EhCacheManagerFactoryBean
- springboot缓存 之 从Cache中取出所有条目
- Spring Boot缓存实战 Caffeine
- spring boot guava cache 缓存学习
- SpringBoot 整合redis实现缓存 记录@CachePut值为1
- Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2
- spring boot redis cache 缓存学习
- Spring Boot缓存实战 EhCache示例
- springboot cache 缓存
- spring boot guava cache 缓存学习