学习记录
文章平均质量分 89
阿昌喜欢吃黄桃
这个作者很懒,什么都没留下…
展开
-
谁再用Arrays.asList就开除谁
针对对应的坑,所以不推荐使用,来直接从根源上避免出现坑。不然就想要注意在使用中的场景是否符合你的要求,如不对创建的List进行增删改的操作。等等。原创 2024-02-13 16:49:32 · 763 阅读 · 0 评论 -
Http请求Cookie失效问题
在cookies的使用中,要符合对应的使用规范,避免开发中出现问题;业务解决方案:将替换为最后不再报错,符合业务。原创 2024-02-02 18:04:42 · 850 阅读 · 0 评论 -
dubbo项目发布时Destroyed异常分析
源码可知,消费者调用dubbo时,调用invoke(),其会判断当前消费者的标记位是否被销毁状态,如果是就抛出以上异常,否则继续执行调用逻辑。相关的报错日志,来提示dubbo消费者调用生产者时,生产者服务已经DESTROYED。结合发布场景每次服务发布的时候才产生异常,所以先考虑2/3的情况;溯源找到对应的业务代码,发现时。在发布项目时,elk有打印。定时任务的调用业务,原创 2024-01-18 10:50:00 · 883 阅读 · 0 评论 -
电商概念之商品模型
广义定义:商品是为了出售而生产的劳动成果,人类社会生产力发展到一定历史阶段的产物,用于交换的劳动产品。商品类目商品属性销售属性商品编码&商品规格编码SKU和SPU。原创 2024-01-15 17:19:05 · 1254 阅读 · 0 评论 -
阿昌教你如何使用通义灵码
Hi,我是阿昌,今天教你如何使用通义灵码。原创 2023-12-14 14:18:01 · 1234 阅读 · 0 评论 -
阿昌教你如何优雅的数据脱敏
Target(ElementType.FIELD) //作用于字段上@JacksonAnnotationsInside // 表示自定义自己的注解Sensitive@JsonSerialize(using = SensitiveInfoSerializer.class) // 该注解使用序列化的方式/*** 方法来源于ContextualSerializer,获取属性上的注解属性,同时返回一个合适的序列化器*/@Override// 获取自定义注解。原创 2023-11-01 16:59:32 · 537 阅读 · 0 评论 -
基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理
com.alibaba.csp.sentinel.slots.block.flow.FlowSlot#checkFlow中会有com.alibaba.csp.sentinel.slots.block.flow.FlowRuleChecker来根据对应的FlowRule规则来判断是否通过或者执行对于的降级逻辑等;这里涉及到Sentinel中的Slot责任链,依然用的com.alibaba.csp.sentinel.slots.block.flow.FlowSlot举例。原创 2023-10-25 17:34:31 · 757 阅读 · 0 评论 -
23.10.13数据库升级流程记录
涉及到数据库升级,只能部分分库用户使用,或者全库停机,当前场景为。将之前的数据库升级为8.0版本,切只涉及一个分库;因为是全库停机发布,所以选择低流量时间点凌晨3点🕙。原创 2023-10-13 10:10:32 · 381 阅读 · 0 评论 -
23.09.26用户切库流程记录
因为db_A用户数据量超过预期,磁盘空间逐渐不足,需要换成db_A库的压力,所以将部分db_A用户切至db_B中。先整理出想要切库到db_B和保留在db_A的用户名单;将A库的用户,切到B库中,db分片为单独存储到话,如。db_A删除切出用户,db_B删除未迁移的用户;先将db_A中的数据全量复制到db_B中;对应到值,以确保切库后表路由的。,则切后用户需要更新分片信息。原创 2023-09-28 10:20:18 · 406 阅读 · 0 评论 -
0727开发问题小结分享
Hi,我是阿昌,今天记录分析下关于的内容。总结汇总了一些在开发问题,或者需要开发注意点;原创 2023-08-31 15:51:48 · 656 阅读 · 0 评论 -
Day820.抢购活动性能瓶颈调优 -Java 性能调优实战
Hi,我是,今天学习记录的是关于。每年的双十一都是很多研发部门最头痛的节日,由于这个节日比较特殊,公司一般都会准备大量的抢购活动,相应的请求对系统来说是个不小的考验。一次做双十一抢购活动,优惠力度特别大,购买量也很大,提交订单的接口 TPS 一度达到了 10W。在首波抢购时,后台服务监控就已经显示服务器的各项指标都超过了 70%,CPU 更是一直处于 400%(4 核 CPU),数据库磁盘 I/O 一直处于 100% 状态。由于瞬时写入日志量非常大,导致后台服务监控在短时间内,无法实时获取到最新的请求监控数原创 2022-12-04 14:41:16 · 384 阅读 · 0 评论 -
Day819.缓存优化系统性能 -Java 性能调优实战
Hi,我是,今天学习记录的是关于。缓存 是提高的一项必不可少的技术,无论是前端、还是后端,都应用到了缓存技术。使用缓存,可以降低多次请求服务的压力;使用缓存,可以降低数据库操作的压力,提升读取数据的性能。如果是一位 Java 开发工程师,可能会想,有必要去了解前端的技术吗?不想当将军的士兵不是好士兵,作为一个技术人员,不想做架构师的开发不是好开发。作为架构工程师的话,就很有必要去了解前端的知识点了,这样有助于设计和优化系统。前端做缓存,可以缓解服务端的压力,减少带宽的占用,同时也可以提升前端的查询性能。平时原创 2022-12-03 13:47:53 · 290 阅读 · 0 评论 -
Day818.电商系统的分布式事务调优 -Java 性能调优实战
在同服务多数据源操作不同数据库的情况下,可以使用基于 XA 规范实现的分布式事务,在 Spring 中有成熟的 JTA 框架实现了 XA 规范的二阶事务提交。事实上,二阶事务除了性能方面存在严重的阻塞问题之外,还有可能导致数据不一致,我们应该慎重考虑使用这种二阶事务提交。在跨服务的分布式事务下,可以考虑基于 TCC 实现的分布式事务,常用的中间件有 TCC-Transaction。TCC 也是基于二阶事务提交原理实现的,但 TCC 的二阶事务提交是提到了服务层实现。原创 2022-12-02 21:35:05 · 1085 阅读 · 0 评论 -
Day814.电商系统表设计优化案例分析 -Java 性能调优实战
总结为以下几个要点在字段比较复杂、易变动、不方便统一的情况下,建议使用键值对来代替关系数据库表存储;在高并发情况下的查询操作,可以使用缓存代替数据库操作,提高并发性能;数据量叠加比较快的表,需要考虑水平分表或分库,避免单表操作的性能瓶颈;除此之外,应该通过一些优化,尽量避免比较复杂的 JOIN 查询操作,例如冗余一些字段,减少 JOIN 查询;创建一些中间表,减少 JOIN 查询。你在设计表时,是否使用过外键来关联各个表呢?原创 2022-11-28 22:23:21 · 1744 阅读 · 0 评论 -
软件需求开发的时间管理方案
针对软件开发,每一个需求都会经历评审/开发/测试/上线/修复的环节都十分的重要。实际开发中很多开发把任务的顺序搞错了,更多地关注于紧急但不重要的事情,影响开发的质量,同时又造成问题处理不及时。对于需求的产品经理都会针对每一个需求对应优先级的划分。那在如此安排充实的情况,针对每一个新业务需求开发、线上紧急Bug、需求优化,如何平衡应对是一个非常重要的能力。那在这种情况下,需求的时间管理方案就十分的重要了;原创 2022-11-03 21:01:21 · 749 阅读 · 0 评论 -
Day784.网络通信优化之序列化:避免使用Java序列化 -Java 性能调优实战
无论是网路传输还是磁盘持久化数据,都需要将数据编码成字节码,而平时在程序中使用的数据都是基于内存的数据类型或者对象,需要通过编码将这些数据转化成二进制字节流;如果需要接收或者再使用时,又需要通过解码将二进制字节流转换成内存数据。我们通常将这两个过程称为序列化与反序列化。Java 默认的序列化是通过 Serializable 接口实现的,只要类实现了该接口,同时生成一个默认的版本号,无需手动设置,该类就会自动实现序列化与反序列化。原创 2022-10-29 11:51:12 · 314 阅读 · 0 评论 -
Day781.Stream如何提高遍历集合效率 -Java 性能调优实战
现在很多大数据量系统中都存在分表分库的情况。例如,电商系统中的订单表,常常使用用户 ID 的 Hash 值来实现分表分库,这样是为了减少单个表的数据量,优化用户查询订单的速度。但在后台管理员审核订单时,需要将各个数据源的数据查询到应用层之后进行合并操作。例如,当需要查询出过滤条件下的所有订单,并按照订单的某个条件进行排序,单个数据源查询出来的数据是可以按照某个条件进行排序的,但多个数据源查询出来已经排序好的数据,并不代表合并后是正确的排序,所以我们需要在应用层对合并数据集合重新进行排序。在。原创 2022-10-26 20:18:41 · 387 阅读 · 0 评论 -
Day780.常用的性能测试工具 -Java 性能调优实战
一张图:现在测试工具非常多,包括阿里云的 PTS 测试工具也很好用,但每款测试工具其实都有自己的优缺点。建议,还是在熟练掌握其中一款测试工具的前提下,再去探索其他测试工具的使用方法会更好。原创 2022-10-25 22:24:03 · 269 阅读 · 0 评论 -
Day779.经典ArrayList与LinkedList -Java 性能调优实战
了解了 ArrayList 和 LinkedList 的实现原理以及各自的特点。如果能充分理解这些内容,很多实际应用中的相关性能问题也就迎刃而解了。就像如果现在还有人跟你说,“ArrayList 和 LinkedList 在新增、删除元素时,LinkedList 的效率要高于 ArrayList,而在遍历的时候,ArrayList 的效率要高于 LinkedList”,还会表示赞同吗?原创 2022-10-24 22:52:48 · 354 阅读 · 0 评论 -
Day778.正则表达式问题 -Java 性能调优实战
正则表达式是计算机科学的一个概念,很多语言都实现了它。正则表达式使用一些特定的元字符来检索、匹配以及替换符合规则的字符串。构造正则表达式语法的元字符,由普通字符、标准字符、限定字符(量词)、定位字符(边界字符)组成。正则表达式虽然小,却有着强大的匹配功能。经常用到它,比如,注册页面手机号或邮箱的校验。但很多时候,又会因为它小而忽略它的使用规则,测试用例中又没有覆盖到一些特殊用例,不乏上线就中招的情况发生。原创 2022-10-23 17:06:02 · 451 阅读 · 0 评论 -
Day776.如何制定性能调优策略 -Java 性能调优实战
通过一张图来回顾下的内容。将性能测试分为微基准性能测试和宏基准性能测试,前者可以精准地调优小单元的业务功能,后者可以结合内外因素,综合模拟线上环境来测试系统性能。两种方法结合,可以更立体地测试系统性能。测试结果可以帮助制定性能调优策略,调优方法很多,这里就不一一赘述了。但有一个共同点就是,调优策略千变万化,但思路和核心都是一样的,都是从业务调优到编程调优,再到系统调优。最后,提个醒,任何调优都需要结合场景明确已知问题和性能目标,不能为了调优而调优,以免引入新的 Bug,带来风险和弊端。原创 2022-10-21 22:36:45 · 249 阅读 · 0 评论 -
Day774.能向 Redis 学到什么 -Redis 核心技术与实战
Hi, 我是阿昌,今天学习记录的是关于。大多数人人都会觉得,就是掌握具体的原理,进行实战,并且学习别人的经验,解决自己在实际工作中的问题。比如说,学习 Redis 时,会把它用在缓存、分布式锁、数据集群等业务场景中,这就需要掌握关键实践技巧、常见问题和应对方法,这也是这么多文章的聚焦点。但是,这只是学习技术的。当对技术的认识和积累达到一定程度后,就应该“向技术致敬”。所谓的致敬,就是向技术学习,来解决在生活中遇到的问题。这是第二个层面。原创 2022-10-19 22:07:52 · 413 阅读 · 0 评论 -
Day773.微博的Redis实践经验 -Redis 核心技术与实战
总结来说,微博对 Redis 的技术需求可以概括为 3 点,分别是高性能大容量易扩展为了满足这些需求,除了对 Redis 进行优化,微博也在自研扩展系统,包括基于 RocksDB 的容量扩展机制,以及服务化的 RedisService 集群。分享一下我两个感受第一个是关于微博做的 RedisService 集群,这个优化方向是大厂平台部门同学的主要工作方向。业务纵切、平台横切是当前构建大规模系统的基本思路。所谓业务纵切,是指把不同的业务数据单独部署,这样可以避免相互之间的干扰。原创 2022-10-18 22:56:50 · 1072 阅读 · 0 评论 -
Day772.Redis的使用规范建议 -Redis 核心技术与实战
按照强制、推荐、建议这三个类别,把这些规范分了下类,如下表所示:解释一下这 3 个类别的规范。强制类别的规范:这表示,如果不按照规范内容来执行,就会给 Redis 的应用带来极大的负面影响,例如性能受损。推荐类别的规范:这个规范的内容能有效提升性能、节省内存空间,或者是增加开发和运维的便捷性,你可以直接应用到实践中。建议类别的规范:这类规范内容和实际业务应用相关,我只是从我的经历或经验给你一个建议,你需要结合自己的业务场景参考使用。原创 2022-10-17 22:31:20 · 766 阅读 · 0 评论 -
Day769.Kaito大佬的学习方法&技巧&认识 -Redis 核心技术与实战
Hi, 我是阿昌,今天学习记录的是关于。原创 2022-10-14 23:26:51 · 796 阅读 · 0 评论 -
Day708.Tomcat和Jetty有哪些不同 -深入拆解 Tomcat & Jetty
首先用 Spring Boot 默认的 Tomcat 作为内嵌式 Web 容器,经过一轮压测后,将内嵌式的 Web 容器换成 Jetty,再做一轮测试,然后比较结果。从设计的角度来看,Tomcat 的架构基于一种多级容器的模式,这些容器组件具有父子关系,所有组件依附于这个骨架,而且这个骨架是不变的,我们在扩展 Tomcat 的功能时也需要基于这个骨架,因此 Tomcat 在设计上相对来说比较复杂。而 Jetty 更像是一位年轻的后起之秀,脑子转得很快,可塑性也很强,但有时候也会犯一点小错误。...原创 2022-08-14 18:26:08 · 374 阅读 · 0 评论 -
Day707.Jetty性能调优的思路 -深入拆解 Tomcat & Jetty
学习了 Jetty 调优的基本思路,主要分为·操作系统级别·的调优和 ·Jetty 本身·的调优,其中操作系统级别也适用于 Tomcat。通过一个实例来寻找 Jetty 的最佳线程数,在测试中我们发现,对于 ·CPU 密集型·应用,将·最大线程数设置 CPU 核数的 1.5 倍是最佳的·。因此,在我们的实际工作中,切勿将线程池直接设置得很大,因为程序所需要的线程数可能会比我们想象的要小。上面说到,Jetty 的最大线程数应该在 50 到 500 之间。...原创 2022-08-13 15:53:53 · 1539 阅读 · 0 评论 -
Day706.Tomcat进程占用CPU过高怎么办 -深入拆解 Tomcat & Jetty
当我们遇到 CPU 过高的问题时,首先要定位是哪个进程的导致的,之后可以通过top -H -p pid命令定位到具体的线程。其次还要通 jstack 查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过 vmstat 和 pidstat 这两个工具进行确认。哪些情况可能导致程序中的线程数失控,产生大量线程呢?1.使用了Java的newCachedThreadPool,因为最大线程数是int最大值2.自定义线程池最大线程数设置不合理。...原创 2022-08-12 22:52:19 · 447 阅读 · 0 评论 -
Day705.Tomcat拒绝连接原因分析及网络优化 -深入拆解 Tomcat & Jetty
在 Socket 网络通信过程中,不可避免地会碰到各种 Java 异常,了解这些异常产生的原因非常关键,通过这些信息我们大概知道问题出在哪里,如果一时找不到问题代码,我们还可以通过网络抓包工具来分析数据包。和。acceptCount 用来控制内核的 TCP 连接队列长度,maxConnections 用于控制 Tomcat 层面的最大连接数。通过调整和相关的内核参数somaxconn,增加了系统的并发度。......原创 2022-08-11 22:22:19 · 3064 阅读 · 0 评论 -
Day704.Tomcat内存溢出的原因分析及调优 -深入拆解 Tomcat & Jetty
Hi,我是阿昌。今天学习记录的是关于。作为 Java 程序员,我们几乎都会碰到 java.lang.OutOfMemoryError 异常,但是你知道有哪些原因可能导致 JVM 抛出异常吗?JVM 在抛出 java.lang.OutOfMemoryError 时,除了会打印出一行描述信息,还会打印堆栈跟踪,因此我们可以通过这些信息来找到导致异常的原因。在寻找原因前,我们先来看看有哪些因素会导致 OutOfMemoryError,其中内存泄漏。...原创 2022-08-10 21:38:33 · 2174 阅读 · 0 评论 -
Day703.Tomcat I/O和线程池的并发调优 -深入拆解 Tomcat & Jetty
理论上可通过利特尔法则或者 CPU 时间与 I/O 时间的比率,计算出一个理想值,这个值只具有指导意义,因为它受到各种资源的限制,实际场景中,我们需要在理想值的基础上进行压测,来获得最佳线程数。其实调优很多时候都是在找系统瓶颈,假如有个状况:系统响应比较慢,但 CPU 的用率不高,内存有所增加,通过分析 Heap Dump 发现大量请求堆积在线程池的队列中,请问这种情况下应该怎么办呢?这种情况应该怀疑大量线程被阻塞了,应该看看web应用是不是在访问外部数据库或者外部服务遇到了延迟。...原创 2022-08-09 21:29:41 · 398 阅读 · 0 评论 -
Day702.监控Tomcat的性能 -深入拆解 Tomcat & Jetty
Tomcat 中的关键的性能指标以及如何监控这些指标:主要有吞吐量、响应时间、错误数、线程池、CPU 以及 JVM 内存。在实际工作中,我们需要通过观察这些指标来诊断系统遇到的性能问题,找到性能瓶颈。如果我们监控到 CPU 上升,这时我们可以看看吞吐量是不是也上升了,如果是那说明正常;如果不是的话,可以看看 GC 的活动,如果 GC 活动频繁,并且内存居高不下,基本可以断定是内存泄漏。请问工作中你如何监控 Web 应用的健康状态?遇到性能问题的时候是如何做问题定位的呢?...原创 2022-08-08 21:28:44 · 838 阅读 · 0 评论 -
Day701.JVM GC原理及调优的基本思路 -深入拆解 Tomcat & Jetty
对于 CMS 来说,我们要合理设置年轻代和年老代的大小。你可能会问该如何确定它们的大小呢?这是一个迭代的过程,可以先采用 JVM 的默认值,然后通过压测分析 GC 日志。如果我们看年轻代的内存使用率处在高位,导致频繁的 Minor GC,而频繁 GC 的效率又不高,说明对象没那么快能被回收,这时年轻代可以适当调大一点。如果我们看年老代的内存使用率处在高位,导致频繁的 Full GC,这样分两种情况:如果每次 Full GC 后年老代的内存占用率没有下来,可以怀疑是内存泄漏;...原创 2022-08-07 15:25:00 · 327 阅读 · 0 评论 -
Day700.Cluster组件:Tomcat的集群通信原理 -深入拆解 Tomcat & Jetty
Hi,我是,今天学习记录的是关于的内容。为了支持水平扩展和高可用,Tomcat 提供了集群部署的能力,但与此同时也带来了分布式系统的一个通用问题,那就是如何在集群中的多个节点之间保持数据的一致性,比如会话(Session)信息。要实现这一点,基本上有两种方式,一种是把所有 Session 数据放到一台服务器或者一个数据库中,集群中的所有节点通过访问这台 Session 服务器来获取数据。另一种方式就是在集群中的节点间进行 Session 数据的同步拷贝,这里又分为两种策略:第一种是将一个节点的 Sessi原创 2022-08-06 14:23:13 · 616 阅读 · 0 评论 -
Day699.Tomcat的Session管理机制 -深入拆解 Tomcat & Jetty
今天从 Request 谈到了 Session 的创建、销毁和事件通知,里面涉及不少相关的类下面我画了一张图帮你理解和消化一下这些类的关系:Servlet 规范中定义了 HttpServletRequest 和 HttpSession 接口,Tomcat 实现了这些接口,但具体实现细节并没有暴露给开发者,因此定义了两个包装类,RequestFacade 和 StandardSessionFacade。...原创 2022-08-06 01:29:04 · 456 阅读 · 0 评论 -
Day698.Tomcat的日志框架及实战 -深入拆解 Tomcat & Jetty
默认情况下,Tomcat 的日志模板叫作 JULI,JULI 的日志门面采用了 JCL,而具体实现是基于 Java 默认的日志框架 Java Util Logging,Tomcat 在 Java Util Logging 基础上进行了改造,使得它自身的日志框架不会影响 Web 应用,并且可以分模板配置日志的输出文件和格式。Tomcat 独立部署时,各种日志都输出到了相应的日志文件,假如 Spring Boot 以内嵌式的方式运行 Tomcat,这种情况下 Tomcat 的日志都输出到哪里去了?...原创 2022-08-04 21:54:58 · 1006 阅读 · 0 评论 -
Day697.Spring框架中的设计模式 -深入拆解 Tomcat & Jetty
Spring 的两大核心功能IOC和AOP中用到的一些设计模式,主要有简单工厂模式、工厂方法模式、单例模式和代理模式。而代理模式又分为静态代理和动态代理。注意到在 newProxyInstance 方法中,传入了目标类的加载器、目标类实现的接口以及 MyInvocationHandler 三个参数,就能得到一个动态代理对象,请你思考一下 newProxyInstance 方法是如何实现的。...原创 2022-08-03 21:13:41 · 270 阅读 · 0 评论 -
Day696.Jetty如何实现具有上下文信息的责任链 -深入拆解 Tomcat & Jetty
Jetty 中 ScopedHandler 的实现原理,剖析了如何实现链式调用的“回溯”。主要是确定了 doScope 和 doHandle 的调用顺序,doScope 依次调用完以后,再依次调用 doHandle,它的子类比如 ContextHandler 只需要实现 doScope 和 doHandle 方法,而不需要关心它们被调用的顺序。这背后的原理是,ScopedHandler 通过递归的方式来设置_outScope和_nextScope两个变量,然后通过判断这些值来控制调用的顺序。...原创 2022-08-02 21:21:19 · 384 阅读 · 0 评论 -
Day695.Spring Boot如何使用内嵌式的Tomcat和Jetty -深入拆解 Tomcat & Jetty
ServletContainerInitializer调用所有实现ServletContextInitializer接口类的方法。ServletContextInitializer是通过ServletContextInitializer类型依赖查找的,是Spring管理的。原创 2022-08-01 21:24:31 · 861 阅读 · 0 评论 -
Day694.Tomcat如何支持异步Servlet -深入拆解 Tomcat & Jetty
非阻塞I/O模型可以利用很少的线程处理大量的连接,提高了并发度,本质就是通过一个Selector线程查询多个Socket的I/O事件,减少了线程的阻塞等待。同样,异步Servlet机制也是减少了线程的阻塞等待,将Tomcat线程和业务线程分开,Tomcat线程不再等待业务代码的执行。那什么样的场景适合异步Servlet呢?适合的场景有很多,最主要的还是根据你的实际情况,如果你拿不准是否适合异步Servlet,就看一条https。...原创 2022-07-31 14:32:26 · 701 阅读 · 2 评论