目标:简化缓存代码的编写
解决方案:基于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<Object, ? extends Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//        RedisTemplate<Object, ? extends Object> template = new RedisTemplate();
//        template.setConnectionFactory(redisConnectionFactory);
//        return template;
//    }
}

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

@Service
public class TagServiceImpl implements TagService{@Autowiredprivate TagMapper tagMapper;@Autowiredprivate RedisTemplate redisTemplate;@Cacheable(value = "tagCache")//基于此注解描述的方法为缓存切入点//@Cacheable使用此方法 系统底层会先从缓冲查找数据 假如没有缓冲,会查询mysql--配置了redis所以存到redis//这个注解要生效 需要在启动类加上@EnableCaching@Overridepublic List<Tag> selectTags(){return tagMapper.selectList(null);}//    @Override
//    public List<Tag> selectTags() {
//        System.out.println("service select tags");
//        //从redis中查询Tag信息 redis有就直接返回
//        ValueOperations<String,List> valueOperations =
//                redisTemplate.opsForValue();
//        List<Tag> 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序列化

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

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

更改后:

缓存数据一致性的问题:

当从数据库查询数据以后,假如将数据库存入到缓存,后续更新可数据库的数据,假如没有更新缓存就会出现缓存数据与数据库数据不一致这样的现象,对于这样的问题,有时是允许出现的

缓冲

最终一致性

@Cacheable注解相关推荐

  1. Spring@Cacheable注解在类内部调用失效的问题

    如图所示,getRecomendGoogs方法里面调用findImgUrlByName方法,在findImgUrlByName方法上使用@Cacheable注解的时候,并没有走缓存. 要解决这个问题, ...

  2. Cacheable注解使用详解

    完成Redis基础配置之后,就可以使用Redis对数据进行缓存了. 最简单的方式就是使用springframe为我们提供的@Cacheable注解,以下是@Cacheable注解的具体使用方式. @C ...

  3. @Cacheable注解属性介绍

    本文目录: 1.value/cacheNames 属性 2.key属性 3.keyGenerator 属性 4.cacheManager 属性 5.cacheResolver 属性 6.conditi ...

  4. cacheable注解原理_Cacheable注解使用详解

    完成Redis基础配置之后,就可以使用Redis对数据进行缓存了. 最简单的方式就是使用springframe为我们提供的@Cacheable注解,以下是@Cacheable注解的具体使用方式. @C ...

  5. 手写redis@Cacheable注解 支持过期时间设置

    原理解释 友情链接  手写redis @ Cacheable注解参数java对象作为键值 @Cacheable注解作用,将带有该注解方法的返回值存放到redis的的中; 使用方法在方法上使用@Cach ...

  6. @Cacheable注解介绍

    @Cacheable注解是Spring框架的一个注解,它的作用是将方法的返回值存储在缓存中,以便在之后的调用中可以直接使用缓存中的值,而无需再次执行方法.这样可以提高程序的执行效率,减少对数据库的访问 ...

  7. 16课:关于Springboot和@Cacheable注解拉去缓存,@CacheEvict清空缓存的原理

    16课:关于Springboot和@Cacheable注解拉去缓存,@CacheEvict清空缓存的原理 简介 代码展示 1.pox.xml 2.application.properties文件 3. ...

  8. cacheable注解原理_@Cacheable的实现原理

    如果你用过Spring Cache,你一定对这种配置和代码不陌生: 上面两段代码,xml是启用Cache Annotation注解并注册一个cacheManager,第二段代码在getData的时候会 ...

  9. Spring Boot整合@Cacheable注解使用

    1 @Cacheable @Cacheable 作用:把方法的返回值添加到Ehcache 中做缓存 Value 属性:指定一个Ehcache 配置文件中的缓存策略,如果么有给定value,name 则 ...

最新文章

  1. HTTP 无状态中的 状态 到底指的是什么?
  2. Unity3D协程(转)
  3. 美利好车的微服务实践
  4. Linux中关于 su 和 su - 的区别
  5. LInux:shell 彩色进度条实现(有图有代码有真相!!!)
  6. 一文理解设计模式之--观察者模式(Observer)
  7. [导入]表单确认按钮——Javascript函数
  8. Vue开发实例(04)之更换项目入口
  9. 八种样本抽样方法介绍
  10. win10计算机名访问win7,实现Win10与Win7局域网共享,教你这招
  11. ERP项目实施方法论
  12. STM32之TIM1高级定时器
  13. Multism14安装问题
  14. 支付宝异步通知 asp
  15. D3D9 HOOK [透视原理]
  16. 解决eso搜索优化问题 Vue 有对应的 Nuxt.js。
  17. 读毛姆《人性的枷锁》
  18. Android性能优化系列篇(三):崩溃优化+卡顿优化
  19. 删除下拉框只找23火星软件_下拉词删除就找23火星
  20. 二分类问题中的评价指标

热门文章

  1. 梦回2008样式原子化:Tailwind是如何让Facebook拜倒在她的石榴裙下?
  2. BFC是什么?BFC可以做什么?
  3. Vue项目关于省略号显示
  4. SQL实战(9)--从titles表获取按照title进行分组
  5. 网络营销推广怎么做 一封神奇的文案策划背后的真相
  6. 收敛因子和黄金正弦指引机制的蝴蝶优化算法
  7. 使用JS创建style标签
  8. 安卓性能优化之启动优化
  9. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(三)
  10. python随机密码生成以整数17为随机数种子_python习题 随机密码生成 + 连续质数计算...