栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@Cacheable注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@Cacheable注解

目标:简化缓存代码的编写
解决方案:基于AOP(面向切面编程)方式实现缓存应用
实践步骤:
第一步:在启动上类添加@EnableCaching注解(开启AOP方式的缓存配置),例如:

@EnableCaching //启动AOP方式的缓存配置

@EnableCaching //启动AOP方式的缓存配置
@SpringBootApplication
public class RedisApplication {
    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class,args);
    }
//    @Bean
//    @ConditionalOnMissingBean(
//            name = {"redisTemplate"}
//    )
//    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//        RedisTemplate template = new RedisTemplate();
//        template.setConnectionFactory(redisConnectionFactory);
//        return template;
//    }
}


第二步:重构TagServiceImpl中的selectTags()方法,方法上使用@Cacheable注解,例如:

@Service
public class TagServiceImpl implements TagService{

    @Autowired
    private TagMapper tagMapper;

    @Autowired
    private RedisTemplate redisTemplate;
    @Cacheable(value = "tagCache")//基于此注解描述的方法为缓存切入点
    //@Cacheable使用此方法 系统底层会先从缓冲查找数据 假如没有缓冲,会查询mysql--配置了redis所以存到redis
    //这个注解要生效 需要在启动类加上@EnableCaching
    @Override
    public List selectTags(){
        return tagMapper.selectList(null);
    }

//    @Override
//    public List selectTags() {
//        System.out.println("service select tags");
//        //从redis中查询Tag信息 redis有就直接返回
//        ValueOperations valueOperations =
//                redisTemplate.opsForValue();
//        List tags = valueOperations.get("tags");
//        System.out.println("tags="+tags);
//
//
//        if(tags!=null&&!tags.isEmpty())
//            return tags;
//
//
//        //从redis中没有获取tag信息,查询mysql
//        System.out.println("select from mysql");
//        tags = tagMapper.selectList(null);
//
//        //将从mysql中查询的信息存储到redis
//        valueOperations.set("tags", tags);
//        //返回查询结果
//
//        return tags;
//
//    }
}


其中,@Cacheable描述的方法为AOP中的一个切入点方法,访问这个方法时,系统底层会通过一个拦截器,检查缓存中是否有你要的数据,假如有则直接返回,没有则执行方法从数据库查询数据.

在redis的查询结果:


RedisTemplate 默认jdk序列化

想要修改序列化模式:要重新配置:

 @Bean
    public RedisCacheManager cacheManager(
            RedisConnectionFactory connectionFactory){
        RedisCacheConfiguration config=
                RedisCacheConfiguration.defaultCacheConfig()
        //配置key序列化
        .serializeKeysWith(RedisSerializationContext.
                SerializationPair.fromSerializer(new StringRedisSerializer()))
        //配置value的序列化
        .serializevaluesWith(RedisSerializationContext.
                SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer(
                        Object.class)));
        return RedisCacheManager
                .builder(connectionFactory)
                .cacheDefaults(config)//修改默认配置
                .transactionAware() //启动默认事务
                .build();
    } 

更改后:

 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号