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 }
注:要緩存的類必須序列化。