【HBZ分享】高并发下Redis+Nginx+Lua+Canal架构体系设计

这篇具有很好参考价值的文章主要介绍了【HBZ分享】高并发下Redis+Nginx+Lua+Canal架构体系设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方案一:springboot + 本地缓存 + redis分布式缓存

  1. 设计简单,可以支持普通并发现的大部分需求,但如果并发太高,该方案依然无法支撑。
  2. 瓶颈卡在tomcat的并发量低

方案二:nginx + lua + redis分布式缓存(结合双删策略)

  1. 通过lua直连redis
  2. nginx判断是否从nginx中直接获取缓存,如果需要获取,则通过lua直接去redis读取,并返回,整个过程不需要经历应用程序这层,所以性能很高,单节点qps大约10W+
  3. 由于双删策略,会导致如果数据库数据更新,会清空redis缓存,此时nginx直接查会查不到数据,依然会走应用程序查询,但如果此时并发量很高,依然会有大量请求冲击到应用程序,导致性能变慢,这是双删策略不可避免的
  4. 双删策略就是更新数据库时,先删除缓存,再更更新数据库,更新完再次删除缓存,目的就是避免数据不一致

方案三:nginx + lua + redis + canal体系

  1. canal可以监听mysql的binlog,如果DB数据又变动,canal会监听到,并发起更新redis的请求
  2. 由于canal的存在,redis不需要使用双删,因为DB只要数据变动,canal就会发送消息到kafka,应用程序只需要监听kafka,如果有消息,就进行更新redis即可,基本上缓存与DB数据是一致的,可能只有个几毫秒的延迟
  3. 此时如果需要从nginx中直接走redis获取数据,那基本上一定会查到数据(是基本,不是绝对), 因为不需要走双删流程,canal的存在会让缓存实时更新,并且更细速度很快
  4. 为什么说是基本会查到,而不是一定会查到呢?
    答:因为如果redis用的是list,hash等结构,要想更新数据,必须要先删除,再更新才行(如果直接更新,则list,hash会直接向原数据插入,而并非覆盖,如果是string类型,那无所谓,直接覆盖,不会出现redis空档期), 所以从删除到再插入这两段代码中,依然有极短是时间是没数据的
  5. 双删也是有删除操作,canal也有删除操作,为什么canal的体系更完美?
    答:双删操作的第二次删除后是不会向缓存写数据的,所以下一次请求必定会走到应用程序去DB查询,并且如果此时并发量很高,会有大量的请求进入应用程序,期间还要去DB查询,这个过程时间要远远大于canal更新,因为canal更新是删除旧数据后,紧接着就写入到了redis,没有中间查DB这个场景。

文章来源地址https://www.toymoban.com/news/detail-522567.html

到了这里,关于【HBZ分享】高并发下Redis+Nginx+Lua+Canal架构体系设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模拟高并发下RabbitMQ的削峰作用

            在并发量很高的时候,服务端处理不过来客户端发的请求,这个时候可以使用消息队列,实现削峰。原理就是请求先打到队列上,服务端从队列里取出消息进行处理,处理不过来的消息就堆积在消息队列里等待。 可以模拟一下这个过程:         发送方把10万条

    2024年02月11日
    浏览(43)
  • mysql高并发下主键自增打来的问题

    在一般情况下,在新增领域对象后,都需要获取对应的主键值。使用应用层来维护主键,在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里,如果JDBC驱动不能绑定新增记录对应的主键,就需要手工执行查询语句以获取对应的主键值,对

    2024年02月13日
    浏览(38)
  • 高并发下的缓存击穿、雪崩、穿透和分布式锁(三)

    概念: 去查询缓存和数据库都不存在的数据,然后大量请求不存在的数据,导致数据库压力过大崩溃。 解决方案: 把不存在的数据null存入缓存,并给个短期的过期时间。 概念: 缓存采用相同的过期时间,然后在某一时刻会同时过期,然后请求全部访问数据库,导致数据库

    2024年02月07日
    浏览(37)
  • 高并发下数据幂等问题的9种解决方案

    严格来说,所谓人云亦云的接口幂等性,大部分场景是要求接口防重或数据幂等,而不是接口幂等,很多人都搞混了。 举例:后端做了支付防重,用户对单一订单重复支付,再次支付不是提示支付成功(接口幂等是要求多次请求返回的结果一致),而是提示请勿重复支付。

    2024年03月23日
    浏览(36)
  • 短信发送+实现高并发下高可用(HTTP连接池+异步)

    依赖注入 application.properties SmsComponent SmsConfig RestTemplateConfig(使用HTTP协议请求) 测试 异步配置 使用异步

    2024年02月09日
    浏览(36)
  • 高并发下数据一致性问题:数据库+缓存双写模式分析

    随着互联网业务的发展,其中越来越多场景使用了缓存来提升服务质量。从系统角度而言, 缓存的主要目标是减轻数据库压力(特别是读取压力)并提高服务响应速度 。引入缓存就不可避免会涉及到缓存与业务数据库数据一致性的问题,而不同的业务场景对数据一致性的要

    2024年02月09日
    浏览(45)
  • 08 - 网络通信优化之IO模型:如何解决高并发下IO瓶颈?

    提到 Java I/O,相信你一定不陌生。你可能使用 I/O 操作读写文件,也可能使用它实现 Socket 的信息传输…这些都是我们在系统中最常遇到的和 I/O 有关的操作。 我们都知道,I/O 的速度要比内存速度慢,尤其是在现在这个大数据时代背景下,I/O 的性能问题更是尤为突出,I/O 读写

    2024年02月12日
    浏览(47)
  • 腾讯二面:如何保证接口幂等性?高并发下的接口幂等性如何实现?

    什么是接口幂等性 接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。 具体到HTTP接口或者

    2024年03月19日
    浏览(47)
  • 阿里架构师分享分布式架构笔记文档:Nginx+Redis+ZK+Kafka+MQ等

    Nginx 是一款非常优秀的开源软件,工作需要,研究了很久一段时间的 Nginx 源码,在研究学习的过程中收益颇多。作为高性能服务器的代表,为了追求极致的高性能,在许多方面,Nginx 的源码实现都可以称得上是典范。 市面上真正适合学习的Nginx资料太少,有的书或资料虽然讲

    2024年02月10日
    浏览(53)
  • 微服务---分布式多级缓存集群实现方案(Caffeine+redis+nginx本地缓存+Canal数据同步)

    传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻T

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包