
ARCH
文章平均质量分 68
ARCH
Winn~
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
MySQL亿级数据平滑迁移双写方案
由于该任务是定时执行,开启后,新库和老库的数据会有 1~2 分钟的延迟,万一写新库的逻辑有问题,可以切回老库。该对比&补偿任务有一个缺陷,其不能处理数据被删除的情况,如果老库里的数据被删除但是新库的数据删除失败,那使用更新时间区间就无法从老库查出这条数据,自然也无法进行对比&补偿。双写时,由于数据先写入老库再异步写入新库,因此新库的数据肯定会滞后于老库。假设有两个线程,业务线程 A 需要写入一条数据,迁移插件拦截后,先同步写入新库,写完新库后提交任务给线程 B 中异步写入老库,提交完任务后插件立刻返回。原创 2025-06-26 16:59:09 · 539 阅读 · 0 评论 -
如何彻底解决缓存击穿、缓存穿透、缓存雪崩
成因:缓存击穿通常发生在某个热点数据失效或清空后,大量请求同时涌入后端数据库,导致数据库崩溃或宕机。原创 2025-06-12 15:59:32 · 472 阅读 · 0 评论 -
Skywalking如何生成TraceId
DistributedTraceId有两个实现PropagatedTraceId和NewDistributedTraceIdNewDistributedTraceId会通过GlobalIdGenerator的generate()方法生成traceId并赋值。原创 2025-06-11 09:44:54 · 187 阅读 · 0 评论 -
Redlock浅谈
假设以下场景:客户端 A 在 Redis 主节点成功获取锁。主节点宕机,锁尚未同步到从节点。从节点晋升为新主节点,此时客户端 B 也能获取同一把锁。结果:客户端 A 和 B 同时持有锁,违反互斥性。原创 2025-06-10 13:11:50 · 456 阅读 · 0 评论 -
Prometheus高可用集群方案
在多集群,大集群等场景下,Prometheus 由于没有分片能力和多集群支持,还有Prometheus 不支持长期存储、不能自动水平扩缩容、大范围监控指标查询会导致 Prometheus 服务内存突增等。单台的 Prometheus 存在单点故障的风险,随着监控规模的扩大,Prometheus 产生的数据量也会非常大,性能和存储都会面临问题。毋庸置疑,我们需要一套高可用的 Prometheus 集群。原创 2025-06-10 12:08:40 · 782 阅读 · 0 评论 -
JVM垃圾回收器-ZGC
ZGC是一种高效低延迟垃圾回收器,通过创新技术将STW时间控制在1毫秒内,支持16TB堆内存。相比G1垃圾回收器(存在转移阶段STW时间较长的问题),ZGC采用读屏障和着色指针技术实现并发转移。着色指针将地址分为44位地址、4位状态标志和16位保留空间,通过颜色位标记对象状态。ZGC还采用精细的内存划分策略,将堆分为2MB小区域、32MB中区域和动态分配的大区域,分别存放不同大小的对象。这些设计使ZGC成为高性能应用的理想选择。原创 2025-06-05 18:33:03 · 1030 阅读 · 0 评论 -
什么是零拷贝?
零拷贝技术对比分析:从传统拷贝到高效传输优化 本文系统介绍了零拷贝技术及其应用场景,对比了多种数据传输方案的性能差异。在文件读取和网络发送场景中,传统方式需要4次CPU拷贝和状态切换,而DMA可减少到2次拷贝但仍有4次切换。进一步优化方案包括:mmap+write(1次CPU拷贝)、sendfile(1次CPU拷贝+2次切换),以及更先进的sendfile+DMA收集和splice方案,实现了零CPU拷贝和仅2次状态切换。这些技术通过减少数据复制次数和上下文切换,显著提升了数据传输效率。原创 2025-06-05 18:50:50 · 203 阅读 · 0 评论 -
SkyWalking如何实现跨线程Trace传递
SkyWalking 的中构建 Trace 信息时会借助 ThreadLocal来存储一些上下文信息,当遇到跨线程的时候,如果 Trace 的上下文信息没有传递到新线程的ThreadLocal 中,那么链路就断开了。那么SkyWalking是如何解决这个问题的呢?原创 2025-05-30 12:33:57 · 383 阅读 · 0 评论 -
如何设计秒杀系统的库存系统
本文探讨了电商库存系统的设计与优化。核心方案包括:1)通过带条件的UPDATE语句防止超卖;2)权衡Redis与数据库的库存存储方案;3)采用分库分表和请求合并来提升并发处理能力。文章详细讨论了异步处理中的异常场景(如超时回滚、批量扣减失败等),并提出了数据库事务优化、基于binlog的缓存一致性方案(含版本控制机制)。最后指出内存队列的扩展局限性,建议数据库层实现全局排队机制。整套方案兼顾了数据一致性与系统性能。原创 2025-05-27 08:53:11 · 439 阅读 · 0 评论 -
Redis分布式锁浅谈
Redis分布式锁通过SET命令的NX和PX选项实现原子性加锁,并配合Lua脚本安全释放。核心步骤包括获取锁(SET key unique_value NX PX)、执行业务逻辑和释放锁(验证唯一标识)。需注意锁超时与业务冲突、非原子性风险等问题,可通过合理超时设置、Redisson框架或Redlock算法优化。相比Zookeeper,Redis性能更高但需处理网络分区风险。原创 2025-05-25 13:48:01 · 248 阅读 · 0 评论 -
https原理时序图
原创 2021-09-28 11:07:12 · 527 阅读 · 0 评论 -
Disruptor高性能队列
一、Java内置队列通过不加锁的方式实现的队列都是无界的(无法保证队列的长度在确定的范围内);而加锁的方式,可以实现有界队列。在稳定性要求特别高的系统中,为了防止生产者速度过快,导致内存溢出,只能选择有界队列;同时,为了减少Java的垃圾回收对系统性能的影响,会尽量选择array/heap格式的数据结构。这样筛选下来,符合条件的队列就只有ArrayBlockingQueue。二、ArrayBlockingQueue的问题ArrayBlockingQueue在实际使用过程中,会因为加锁和伪共享等出现严原创 2021-08-02 15:05:47 · 237 阅读 · 0 评论 -
TCP三次握手原因分析
通信是双工的,双方都要确保自己可以发送和接收对方的数据。为什么要三次握手以A和B通信为例。1.首先第一次握手是A向B发送数据,如果成功的话,B知道自己可以接受A发来的数据2.B向A发送数据是第二次握手,如果成功,A知道了A可以发送到B,也可以知道A可以接收B的数据,这样A方确保了自己的功能完备。但是B还不知道自己能不能发送数据到A。3.A向B发送数据,B成功接收的话,双方都确定自己可以发送消息到对方和接收对方消息。可以开辟端口号进行单独通信。为什么要四次分手A端和B端分手第一次分手:A向B提原创 2020-07-02 17:05:11 · 204 阅读 · 0 评论 -
策略模式介绍和用法
1、什么是策略模式策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。2、怎么使用环境角色类:public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * ...原创 2018-12-28 09:34:04 · 14901 阅读 · 1 评论 -
多种单例模式优缺点对比
单例模式都有哪几种饿汉模式,懒汉线程非安全模式,懒汉线程安全模式,内部类模式,枚举模式。现在最推荐的方式是枚举单例模式。逐一介绍饿汉模式:/** * 饿汉式单例模式 * 特点:可以通过反射机制攻击;线程安全[多个类加载器除外]。 */public class HungryType { public static final HungryType instance = new...原创 2018-12-12 12:27:49 · 353 阅读 · 1 评论 -
模板方法设计模式介绍和应用
什么是模板模式?模板模式是基于继承的,父类定义一个模板结构,将具体内容延迟到子类去实现。代码示例父类public abstract class A(){ void step1(){//一样的步骤在父类实现 ... } abstract void step2()//不一样的步骤在子类实现 abstract void step3()//不一样...原创 2018-12-06 14:53:54 · 701 阅读 · 0 评论 -
微服务的隔离和熔断-Hystrix
假设Tomcat线程池有100个线程, 每次有新的用户请求过来,Tomcat就会从中找出一个空闲的线程去执行, 抛开那些琐碎的小细节,这些请求其实非常简单, 无非就是这么几件事:根据用户ID调用用户服务, 获取用户对象。获取该用户的推荐商品获取该用户的积分。把这些信息组合起来,返回给浏览器。有意思的是前三件事情全是HTTP调用,需要调...原创 2018-12-06 14:35:00 · 1276 阅读 · 0 评论 -
糟糕……线上出问题了,我该如何分析……
1、根据经验来分析,如果应急团队中有人对相应的问题有经验,并能确定能够通过某种手段回复系统的正常运行,那么应该第一时间回复(回滚等),同事务必要保留现场,以备后续对问题的定位和修复;如果没有人又经验,则需要使用比较粗暴的方法保证服务可用,如定时重启、限流、降级等。2、业务服务人、技术负责人、核心研发人员、架构师、运维工程师以及运营人员对问题的原因进行快速分析。原创 2018-11-29 17:47:15 · 235 阅读 · 0 评论 -
Redis数据库的数据倾斜
对于集群系统,一般缓存是分布式的,即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够,导致大量的缓存数据集中到了一台或者几台服务节点上,称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起的。原创 2024-04-18 19:36:34 · 1684 阅读 · 0 评论 -
手把手教你实现一个Java Agent
团队中有同事在做性能优化相关的工作,因为公司基础设施不足,同事在代码中写了大量的代码统计某个方法的耗时,大概的代码形式就是这样的代码非常多,侵入性很大,联想到之前学习的Java Agent技术,可以无侵入式地解决这类问题,所以做了一个很小很小的demo。原创 2023-12-05 12:17:37 · 274 阅读 · 0 评论 -
elasticsearch命令大全
16、bool查询must_not(not),既不是也不是。17、bool查询filter,某个字段还可以比较大小范围。14、bool查询must(and),同时满足多个条件。15、bool查询should(or),满足一个就行。2、要按文档数对所有索引进行降序排序。10、phrase最左前缀查询。13、按某个字段降序查询。6、查询索引的结构信息。DELETE 索引名。4、查看集群各个节点。5、查看集群健康状态。9、phrase查询。原创 2023-11-21 16:11:34 · 757 阅读 · 0 评论 -
如何在10亿级别用户中检查用户名是否存在?
不知道大家有没有留意过,在使用一些app注册的时候,提示你用户名已经被占用了,需要更换一个,这是如何实现的呢?你可能想这不是很简单吗,去数据库里查一下有没有不就行了吗,那么假如用户数量很多,达到数亿级别呢,这又该如何是好?原创 2023-11-16 11:10:59 · 1655 阅读 · 0 评论 -
Sentinel底层原理(下)
Sentinel的核心原理,也就是前面提到暗流涌动的SphU.entry(…)这行代码背后的逻辑。Sentinel会为每个资源创建一个处理链条,就是一个责任链,第一次访问这个资源的时候创建,之后就一直复用,所以这个处理链条每个资源有且只有一个。SphU.entry(…)这行代码背后就会调用责任链来完成对资源的检查逻辑。这个责任链条中每个处理节点被称为ProcessorSlot,中文意思就是处理器槽这些实现会通过SPI机制加载,然后按照一定的顺序组成一个责任链。原创 2023-11-14 16:54:15 · 401 阅读 · 0 评论 -
Sentinel浅层介绍(上)
Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。原创 2023-11-14 15:42:45 · 270 阅读 · 0 评论 -
五大限流设计方式
计数器是一种最简单限流算法,其原理就是:在一段时间间隔内,对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清零。这个就像你去坐车一样,车厢规定了多少个位置,满了就不让上车了,不然就是超载了。原创 2023-07-17 14:27:28 · 308 阅读 · 0 评论 -
单机性能极限优化六大绝招
索引的原理是拿额外的存储空间换取查询时间,增加了写入数据的开销,但使读取数据的时间复杂度一般从O(n)降低到O(logn)甚至O(1)。索引不仅在数据库中广泛使用,前后端的开发中也在不知不觉运用。在数据集比较大时,不用索引就像从一本没有目录而且内容乱序的新华字典查一个字,得一页一页全翻一遍才能找到;用索引之后,就像用拼音先在目录中先找到要查到字在哪一页,直接翻过去就行了。书籍的目录是典型的树状结构,那么软件世界常见的索引有哪些数据结构,分别在什么场景使用呢?原创 2023-07-11 18:58:28 · 321 阅读 · 0 评论 -
订单自动取消的11种实现方式(下)
在Redis中,有个发布订阅的机制生产者在消息发送时需要到指定发送到哪个channel上,消费者订阅这个channel就能获取到消息。图中channel理解成MQ中的topic。并且在Redis中,有很多默认的channel,只不过向这些channel发送消息的生产者不是我们写的代码,而是Redis本身。这里面就有这么一个channel叫做__keyevent@__:expired,db是指Redis数据库的序号。当某个Redis的key过期之后,Redis内部会发布一个事件到__keyevent@__原创 2023-07-07 14:48:06 · 564 阅读 · 0 评论 -
订单自动取消的11种实现方式(上)
DelayQueue是JDK提供的api,是一个延迟队列DelayQueue泛型参数得实现Delayed接口,Delayed继承了Comparable接口。getDelay方法返回这个任务还剩多久时间可以执行,小于0的时候说明可以这个延迟任务到了执行的时间了。compareTo这个是对任务排序的,保证最先到延迟时间的任务排到队列的头。原创 2023-07-07 12:06:41 · 314 阅读 · 0 评论 -
分布式中灰度方案就该这样设计!
分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,为了保持不同版本之间的隔离性,验收需要将请求路由到指定版本号的服务上处理;假设存在三个服务:A、B、C,且服务B和C都存在多个版本,那么让请求按照即定的路由规则执行,即可保证研发期间的验收是版本间隔离的,并且可以实现灰度部署的策略;原创 2023-07-06 11:04:58 · 307 阅读 · 0 评论 -
Redis10大性能优化策略(下)
1)尽量不使用 O(N) 以上复杂度过高的命令,对于数据的聚合操作,放在客户端做。2)执行 O(N) 命令,保证 N 尽量的小(推荐 N原创 2023-07-05 14:31:06 · 1246 阅读 · 0 评论 -
Redis10大性能优化点(上)
对 Redis 进行基准性能测试例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了。所以,你只有了解了你的 Redis 在生产环境服务器上的基准性能,才能进一步评估,当其延迟达到什么程度时,才认为 Redis 确实变慢了。为了避免业务服务器到 Redis 服务器之间的网络延迟,你需要直接在 Redis 服务器上测试实例的响应延迟情况。原创 2023-07-05 11:42:45 · 763 阅读 · 0 评论 -
设计一个高流量高并发的系统需要关注哪些点
做好一个高流量高并发的系统,不论前端还是后端,过程中每一个步骤都是至关重要的。设计一个系统除了满足功能性,还要考虑兼容性、易用性、可靠性、安全性、可维护性、可移植性等软件质量。同时要对系统的吞吐量、并发数、平均响应时间等指标要完全掌握,在指标异常时可以快速做出决策避免一系列问题发生。原创 2023-06-29 18:11:19 · 381 阅读 · 0 评论 -
ES+Redis+MySQL,这个高可用架构设计太顶了!
会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是全公司所有业务线。所以,会员系统必须保证高性能、高可用,提供稳定、高效的基础服务。随着同程和艺龙两家公司的合并,越来越多的系统需要打通同程APP、艺龙APP、同程微信小程序、艺龙微信小程序等多平台会员体系。例如微信小程序的交叉营销,用户买了一张火车票,此时想给他发酒店红包,这就需要查询该用户的统一会员关系。原创 2023-03-14 17:13:34 · 3406 阅读 · 2 评论 -
构建高性能内存队列:Disruptor
为了提高CPU的速度,Cpu有高速缓存Cache,该缓存最小单位为缓存行CacheLine,他是从主内存复制的Cache的最小单位,通常是64字节。一个Java的long类型是8字节,因此在一个缓存行中可以存8个long类型的变量。如果你访问一个long数组,当数组中的一个值被加载到缓存中,它会额外加载另外7个。因此你能非常快地遍历这个数组。原创 2022-12-22 14:52:28 · 745 阅读 · 0 评论 -
xxl-job惊艳的设计,怎能叫人不爱
xxl-job 使用 netty http 的方式进行通信,虽然也支持 Mina,jetty,netty tcp 等方式,但是代码里面固定写死的是 netty http。原创 2022-12-22 11:37:27 · 175 阅读 · 0 评论 -
一文看懂并发量计算公式
1、估算业务并发量的公式C=nL/TC^=C+3×(C的平方根)其中:C是平均的业务并发用户数、n是login session的数量、L是login session的平均时间长度、T是指考察的时间段长度、C^是指业务并发用户数的峰值。例子分析:假设OA系统有1000用户,每天400个用户发访问,每个登录到退出平均时间2小时,在1天时间内用户只在8小时内使用该系统。则平均并发量和最大并发量如下:C=400×2/8=100C^=100+3×(100的平方根)=100+3×10=130此外,如原创 2021-12-08 14:28:41 · 22181 阅读 · 0 评论 -
读懂Redis缓存
这种主从同步模式的缺点:如果主节点挂了,那么就不能写入了。原创 2021-11-23 18:06:33 · 369 阅读 · 0 评论 -
Redis跳跃表数据结构
跳跃表SkipList是一种有序的数据结构,是Redis有序集合的底层实现之一。跳跃表中,数据被存储在节点中,。这些指针分布在不同的层级,用于提升跳跃表的访问性能。跳跃表支持平均O(log N)、最坏O(N)复杂度的查找性能,并且支持通过顺序性操作来批量处理节点。在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为眺跃表的实现比平衡树 要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。原创 2021-11-19 16:35:49 · 871 阅读 · 0 评论 -
读懂消息队列Kafka
满足其一即可:原创 2021-11-11 19:28:50 · 1063 阅读 · 0 评论 -
网络请求背后都会经历什么
1、网络四层模型数据链路层(以太网协议),网络层(ip协议),传输层(tcp协议),应用层(http协议)2、用浏览器请求一个链接的时候,经历了哪些过程?我们打开一个浏览器,请求www.baidu.com地址,这个时候找DNS服务器,DNS服务器解析域名之后,返回一个ip地址,比如172.194.26.108。接着会判断两个ip地址是不是一个子网的,用子网掩码255.255.255.0,对两个ip地址做与运算,拿到192.168.31.0和172.194.26.0,明显不是一个子网的。那就得发送原创 2021-09-23 16:50:55 · 499 阅读 · 0 评论