分布式锁结合SpringCache( 三 )
3、缓存数据与数据库保持一致性:/*** @return 缓存一致性* 1、双写模式:数据库修改时修改缓存数据 , 高并发情况下对数据库进行修改容易出现脏数据* 2、失效模式:数据库更新时删除缓存数据 , 等待下次查询进行更新缓存*/public Map> getCatalogJsonFromDbWithRedissonLock() {//1、占分布式锁 , 去redis占坑,锁的粒度越大 , 越细越快 , 锁的名字一样RLock lock = redisson.getLock("CatalogJson-lock");lock.lock();Map> dataFromDb;try {//运行代码dataFromDb = getDataFromDb();} finally {lock.unlock();}return getDataFromDb();}3.1、双写模式:
文章插图
3.2、失效模式(采用):
文章插图
5、SpringCache的使用1、主启动类以及基本注解详解:/** * * @Cacheable:触发保存缓存 。* @CacheEvict:触发??删除缓存 。* @CachePut:更新缓存 , 而不会干扰方法的执行 。* @Caching:重新组合多个缓存操作 。* @CacheConfig:在类级别共享一些与缓存相关的常见设置 。* * 开启缓存@EnableCaching * * 原理:CacheAutoConfiguration->RedisCacheConfiguration->自动配置了RedisCacheManager->初始化所有缓存->每个缓存决定用什么配置 * ->进行判断 , 如果有自定义配置则按自定义配置 , 如果没有则按默认->想改缓存配置 , 只需要给容器中放一个RedisCacheCpnfiguration */@EnableRedisHttpSession@EnableCaching@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")@EnableDiscoveryClient@MapperScan(basePackages = "com.atguigu.gulimall.product.dao")@SpringBootApplicationpublic class GulimallProductApplication {public static void main(String[] args) {SpringApplication.run(GulimallProductApplication.class, args);}}2、注解应用:/*** 级联更新所有关联的数据* @CacheEvict:失效模式* 1、同时进行多种缓存操作* 2、指定删除某个分区下所有数据:@CacheEvict(value = "http://kandian.youth.cn/index/category", allEntries = true)* 3、存储同一类型数据、都可以指定同一个分区**//*方法一:@Caching(evict = {@CacheEvict(value = "http://kandian.youth.cn/index/category", key = "'level1Categorys'"),@CacheEvict(value = "http://kandian.youth.cn/index/category", key = "'getCatalogJson'")})*///@CacheEvict一旦更改数据就清除缓存@CacheEvict(value = "http://kandian.youth.cn/index/category", allEntries = true)//方法二@Transactional@Overridepublic void updateCascade(CategoryEntity category) {this.updateById(category);categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());}/*** (1指定生成的缓存使用的key:key属性指定* (2指定缓存的数据存活时间:* (3将数据保存为json*///每一个缓存的数据都要制定要放到那个名字的缓存【缓存分区】//缓存过期之后 , 如果多个线程同时请求对某个数据的访问 , 会同时去到数据库 , 导致数据库瞬间负荷增高 。//属性 sync 可以指示底层将缓存锁住 , 使只有一个线程可以进入计算 , 而其他线程堵塞 , 直到返回结果更新到缓存中 。@Cacheable(cacheNames = "category", key = "'level1Categorys'", sync = true)//代表当前方法结果需要缓存 , 如果缓存中结果 , 有方法就不调用 , 如果没有则调用方法并返回缓存结果@Overridepublic List
推荐阅读
- Kensington发布StudioDock 将iPad Pro扩展坞与无线充电器相结合
- 为中国医疗健康产业护航,“医工结合”的机会和趋势在哪里?
- java 从零实现属于你的 redis 分布式锁
- 荣耀游戏本实测分享“性能与智能”完美结合
- 中医与人工智能结合,是必然趋势还是双刃剑?
- HarmonyOS 2.0手机开发者Beta版真来了!快来升级EMUI11提前感受分布式技术
- 四核强性能,华硕XD4灵耀AX魔方分布式路由评测
- 为升级鸿蒙做准备 EMU 11分布式技术提前预演
- 分布式天花板?阿里百万架构师的ZK+Dubbo笔记,颠覆认知
- 为什么分布式云是下一代云计算?Gartner分析师这样解释
