样式缓存没更新_如何利用数据异构实现多级缓存和数据迁移

e8e948c54594422433b731c79e479437.png

Tips:关注公众号:松花皮蛋的黑板报,领取程序员月薪25K+秘籍,进军BAT必备!

京东的内容创作平台有很多的样式,比如文章、单品推荐、搭配、店铺上新、秒杀、直播预告、优惠卷。有些样式可以投稿到不同的频道,频道就好比露出的位置,频道露出的前提是内容质量审核通过后,频道侧二审通过。上面列举的有些样式因为时效性的考虑所以是不需要审核就可以外露的,比如直播预告、优惠卷,其他的样式则需要在CMS后台管理中经过一道或者两道审核,或者在质检抽查中复活。


我们知道内容体裁类都是读多写少的,所以一般强依赖缓存。其中,刚刚提到的很多场景都会直接写缓存或更新缓存,比如有些内容不需要审核、内容审核一次后、内容审核两次后、内容编辑后、内容编辑标签后、内容定时上下线等等,那么就需要有一个组件化的服务来满足同步。如果由你来设计一种方案来同步缓存或者多级缓存,你会怎么做呢?这就是我今天要和大家讨论的数据异构,将数据进行异地异构存储,比如说需要整合多张表数据构成一条记录然后异地存储。


我们先来看下第一种方案,就是双写,业务代码在对数据库操作时同步缓存。不过用这种对业务侵入的硬编码方式有很多缺点,我们首先得考虑事务性,考虑怎么保证同步数据库和同步缓存两者要么都成功要么都失败,但是一旦使用上事务,性能下降会非常明显。你可能看到过这种方案,更新操作时,先删除缓存后更新数据库,让查询操作来同步刷数据到缓存,这种方案最大的问题就是如果你删除的缓存是热点数据,那将导致大量的请求直接达到数据库。更极端的情况是,更新操作时,缓存节点不可用、程序和缓存节点之间网络延时增高、程序重启来不及同步缓存节点,那就会导致服务性能受到影响、数据无法达到一致性。


刚刚的双写是同步进行,如果换成使用MQ异步双写呢?也就是,程序处理完业务逻辑后发送MQ事件通知,由不同的应用消费MQ然后分别写入数据库和缓存中,其中写缓存的应用再反查其他表。很明显,异步双写的方案比前面的简单双写性能肯定高很多,甚至我们还可以利用MQ的重试机制保证数据不丢失。不过它依然存在硬编码、与业务强耦合的问题,还引入了时延问题。因为有些MQ消息必须是串行处理的,或者由于网络原因导致无法及时被消费,就会导致操作结果不一定能马上看到。


那我们再来看下第三种方案,使用定时任务异步双写。数据表中增加一个时间标示的字段,任何更新操作都导致该字段的值发生变化。然后增加一个定时器程序,每隔一段时间扫描表,把该时间段内发生变化的数据提取出来,然后逐条同步到缓存中。不过这种方式对数据库有很大的轮询压力,所以一般都不采用这种方式。


那有没有更好的方案完成数据异构呢?答案就是利用Mysql的binlog日记。


Mysql的binlog日记主要用来记录对mysql数据更新的操作,并以事务的形式保存在磁盘中,一般用来做Mysql的主从复制、数据恢复、增量备份。可以看出binlog日记具备高可靠性、低时延性,所以我们可以利用binlog日记来完成数据异构。整体流程大概是这样的,构建一个中间件系统,伪造成master的一个slave,当读取到binglog中的数据变化后,将其二进制内容格式化成MQ消息后传输,程序拿到消息后同步缓存。不过缺点也很明显,需要有一个中间件系统支撑,如果没有的话,使用前面提到的MQ异步双写或许是最佳的选择。


好,今天我主要和你讨论了关于如何利用数据异构实现多级缓存,这个技术还可以解决下面这种问题,比如数据库分库分表后如何进行数据迁移,当然后者的实现更加复杂,需要考虑数据校验问题,就不再展开了。如果今天的文章有帮助到你,欢迎分享给你朋友或者点个在看。

BLOG地址:www.liangsonghua.me关注微信公众号:松花皮蛋的黑板报,获取更多精彩!公众号介绍:分享在京东工作的技术感悟,还有JAVA技术和业内最佳实践,大部分都是务实的、能看懂的、可复现的

2a14322b1eaef509de72115a2432aa68.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Redisson可以很方便地实现数据缓存。Redisson是一个基于Redis的Java客户端,它提供了丰富的功能和API,包括分布式锁、分布式集合、分布式对象等。在使用Redisson实现数据缓存时,可以通过以下步骤进行操作: 1. 引入Redisson的依赖并配置Redis连接信息。 2. 创建RedissonClient对象,该对象是Redisson的核心组件,用于与Redis进行通信。 3. 使用Redisson提供的分布式锁功能,可以通过调用tryLock方法来加锁,该方法会返回一个布尔值表示是否成功获取到锁。在加锁时,可以设置锁的过期时间,以防止锁被长时间占用。 4. 在获取到锁之后,可以从缓存中读取数据。如果缓存中不存在所需的数据,可以从数据库或其他数据源中获取,并将数据存入缓存中。 5. 在数据更新或删除时,需要先获取到锁,然后进行相应的操作,并更新缓存。 6. 在操作完成后,需要释放锁,以便其他线程或进程可以获取到锁并进行操作。 通过以上步骤,可以利用Redisson实现数据缓存,并保证数据的一致性和并发安全性。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [分布式锁Redisson快速入门及利用AOP实现声明式缓存](https://blog.csdn.net/weixin_44743245/article/details/120805755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [redisson做分布式缓存(加锁方面)](https://blog.csdn.net/weixin_55034383/article/details/129333680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值