spring针对各类缓存实现,抽象出了CacheManager接口,用户使用该接口处理缓存,而无需关心底层实现。而且也能够方便的更改缓存的具体实现,而不用修改业务代码。下面对于在springboot中使用缓存作一简单介绍:html
1.添加依赖ajax
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-cache</artifactId> 4 </dependency>
2.在须要使用缓存的方法上加上注解,以下:
redis
1 @Override 2 //@CachePut 该注解会将方法的返回值缓存起来,其中缓存名字是 people,数据的key是person的id 3 @CachePut(value = "people", key = "#person.id") 4 public Person save(Person person) { 5 Person p = personRepository.save(person); 6 System.out.println("为id、key为:"+p.getId()+"数据作了缓存"); 7 return p; 8 }
1 @Override 2 //@CacheEvict 该注解会删除people缓存中key为id 的数据 3 @CacheEvict(value = "people", key = "#id") 4 public void remove(Long id) { 5 System.out.println("删除了id、key为"+id+"的数据缓存"); 6 //这里不作实际删除操做 7 }
1 @Override 2 //@Cacheable 该注解会在方法执行时,判断缓存people中key为#person.id 3 //的缓存是否存在,若是存在,则直接返回缓存中的数据。若是不存在,则会查数据库,而后将返回结果缓存起来。 4 @Cacheable(value = "people", key = "#person.id") 5 public Person findOne(Person person) { 6 Person p = personRepository.findOne(person.getId()); 7 System.out.println("为id、key为:"+p.getId()+"数据作了缓存"); 8 return p; 9 }
以上几部就完成了缓存,可是如今的缓存是默认的基于内存的,没有实现持久化。下面以redis做为缓存的具体实现,以下spring
1.添加依赖数据库
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-redis</artifactId> 4 </dependency>
2.在配置文件里添加redis配置json
1 redis.hostname=localhost 2 redis.port=6379
3.在spring容器中配置redis缓存
1 @Configuration 2 public class RedisConfig extends CachingConfigurerSupport{ 3 private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class); 4 5 @Autowired 6 private Environment env; 7 8 @Bean 9 public JedisConnectionFactory redisConnectionFactory() { 10 JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(); 11 redisConnectionFactory.setHostName(env.getProperty("redis.hostname")); 12 redisConnectionFactory.setPort(Integer.parseInt(env.getProperty("redis.port"))); 13 return redisConnectionFactory; 14 } 15 16 @Bean 17 public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) { 18 RedisTemplate<String, String> redisTemplate = new RedisTemplate<>(); 19 redisTemplate.setConnectionFactory(cf); 20 return redisTemplate; 21 } 22 23 @Bean 24 public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) { 25 RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); 26 cacheManager.setDefaultExpiration(600); 27 return cacheManager; 28 } 29 30 }
4.从缓存中取到的数据有时为JsonArray 须要转换成对象类型输出到页面时springboot
jsapp
var optionsPerson = ""; $.ajax({ url: "/personing/getPerson", //所须要的列表接口地址 type: "get", dataType: "json", success: function (data) { var Data = data; for (var key in Data) { if (key == 'personList') { var pList = Data[key]; for (var i = 0; i < pList.length; i++) { optionsPerson += "<option value=\'" + pList[i].Id + "'\>" + pList[i].name + "</option>"; } } } $("#person").html(optionsPerson); } });
controlleride
1 @ApiOperation(value = "获取人",notes = "获取人") 2 @GetMapping("/getPerson") 3 public Map<String, List<Object>> findPersons(){ 4 Map<String, List<Object>> map = new HashMap<String, List<Object>>(); 5 List<Person> pList=PersonService.findAll(); 6 7 List<Object> personList=new ArrayList<>(pList); 8 9 /* for (Person p:pList){ 10 personList.add(p); 11 } 不可用*/ 12 map.put("personList",personList); 13 14 return map; 15 }
serviceImpl
1 @Cacheable(value="person_list",keyGenerator = "wiselyKeyGenerator") //开启缓存 2 @Override 3 public List<Person> findAllPerson(){ 4 5 List<Person> list=personRepository.findAll(); 6 7 return list; 8 }
注:要缓存的类必须序列化。