• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Broke_薪雪
博客园    首页    新随笔    联系   管理    订阅  订阅

springboot缓存的使用

spring针对各种缓存实现,抽象出了CacheManager接口,用户使用该接口处理缓存,而无需关心底层实现。并且也可以方便的更改缓存的具体实现,而不用修改业务代码。下面对于在springboot中使用缓存做一简单介绍:

1.添加依赖

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-cache</artifactId>
4 </dependency>

 

2.在需要使用缓存的方法上加上注解,如下:

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作为缓存的具体实现,如下

 

1.添加依赖

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-redis</artifactId>
4 </dependency>

 

2.在配置文件里添加redis配置

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 需要转换成对象类型输出到页面时

js

 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);
                    }
                });

 

controller

 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     }

 

注:要缓存的类必须序列化。

posted @ 2018-12-05 13:58  Broke、薪雪  阅读(1218)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3