- 博客(427)
- 收藏
- 关注
原创 SpringAOP中@EnableAspectJAutoProxy注解的作用
理解@EnableAspectJAutoProxy注解的作用
2020-09-30 17:25:55 12792 1
原创 解析SpringBoot中的starter原理
SpringBoot其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,提供自动配置的“starter”项目对象模型以简化Maven配置。本文重点分析springboot利用starter把关键类加载到spring容器中的过程,希望通过一步步分析使大家能够更好的理解其中的原理。...
2020-07-09 16:13:04 2959
原创 spring-kafka通过@KafkaListener实现消费者监听流程分析
首先通过@EnableKafka注解,注入KafkaBootstrapConfiguration类@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(KafkaBootstrapConfiguration.class)public @interface EnableKafka {}注入KafkaListenerAnnotationBeanPostProcessor,此类负责收集有@Kaf
2020-06-23 15:07:17 9098 2
原创 kafka生产者性能相关的参数理解
batch.size当多条消息发送到batch后,batch的上限大小(字节为单位),当达到上限时则会发送给kafka broker,设置的过小则降低了kafka的吞吐量,设置的过大则消息的延迟时间会拉长、占用了过高的内存...
2020-05-25 19:34:41 5274 1
原创 kafka生产者消息发送的流程与参数配置
kafka生产者发送消息的流程1、消息首先会被封装成ProducerRecord对象,ProducerRecord的构造方法有多种。可以指定要发送的分区spring提供的kafkaTemplate也可以指定分区发送,比如这里指定了发送到分区为1public String sendPartition() { for (int i = 0; i < 10; i++) { kafkaTemplate.send("test_topic", 1,"test_topic_key", Strin
2020-05-22 19:18:09 4321
原创 LeetCode-数组-前缀和-中等难度
前缀和是一种利用预处理的方式来减少整体实现复杂度的方法。(i)(i - 1)(i)(i)(0 ~ i)0 < i < j(i ~ j)(j)(i - 1)根据这样的关系,在某些应用场景上我们就可以利用前缀和进行快速求解。
2024-03-08 09:15:00 865
原创 裂变增长秘诀:揭秘如何轻松实现用户裂变与高效拉新
据统计2022年我国手机上网人数10.65亿人,互联网普及率为75.6%,其中农村地区互联网普及率为61.9%,居民使用互联网的平均时间为2小时42分钟,城镇居民3小时23分钟,农村居民1小时38分钟,流量的规模虽然看起来如此之大,但实际上却是被少数巨头垄断,比如微信、微博、头条、抖音等,对于大多数企业来说,能够通过自身获取流量的能力实在有限,留也留不住,买也买不起是普遍现象。所以,拥有持续的获客方式就变得非常的重要,而移动互联网时代最重要的获客方式是什么?那一定是裂变拉新,
2024-03-04 09:15:00 714
原创 揭秘统计数据:如何用数据魔法揭示生活中的奥秘?
你有没有遇到过,某天报表的数据突显异常,排查后发现原来是单位弄错了。你有没有遇到过,某组数据看起来没啥感觉,但做成报表组合到一起看问题则会非常明显。你有没有遇到过,有些凭直觉来感受的统计信息与仔细验算后的统计信息,最终得出的结论截然相反。你有没有遇到过,某些根据统计结果得出的结论看起来没问题,但总觉得哪里不对劲。我相信,只要你常看一些数据统计报表,或者会常做一些数据统计方面的工作,那你一定遇到过,大家常说数据不会骗人,但真的是这样吗?本篇文章主要就来揭秘一些既有趣、又能迷惑人的常见手段。
2024-02-22 09:45:00 779
原创 LeetCode-数组-定长滑动窗口-中等难度
一般我们在学习滑动窗口时,可以把它分为定长与不定长来针对性练习,滑动窗口实际上也可以看作是双指针,尤其是不定长的滑动窗口,本篇文章主要整理了一些比较有代表性的定长类滑动窗口的题型,以供练习。
2024-02-04 09:30:00 768
原创 如何打赢稳定性之战?
随着23年年末期间,各大厂争先恐后的出现的各种线上故障,一时间“降本增笑”、“开猿节流”成为了大家调侃的话题,我自己所在的公司其实也因为在年中时出现了几次线上故障,而面临着系统稳定性的考验。因此,也就想借本文跟大家分享、探讨一下到底如何才能打赢稳定性之战?
2024-01-15 09:00:00 990
原创 LeetCode-数组-双指针-中等难度
双指针一般是指利用两个变量,通过在线性的结构上进行遍历来解决某些特定的问题,按照遍历的方式一般多采用:同向遍历,相向遍历两种方式,例如冒泡排序、选择排序、插入排序都是用了两个变量同向遍历来实现,快排则是通过相向遍历来实现。要求可接的雨水处的水量,可以先分别求出位于此处两侧最长柱子的高度,然后取其较短的一根即表示其可接水量的上限,因此完全可以通过不断的左右遍历(收缩较短的柱子)的方式计算出每个位置可接的水量。个后,再进行比较,所以快指针逻辑不变,只需要让慢指针在比较时每次往前取两位即可。左右指针,相向遍历。
2024-01-04 14:00:00 972
原创 LeetCode-数组-重叠、合并、覆盖问题-中等难度
我认为区间类的题型,大多数考验的是思维能力,以及编码能力,该类题型本身并无什么算法可言,主要是思维逻辑,比如本题实际上你只需要能够总结出重叠与不重叠的含义,再加上一点编码技巧,便可完成。
2023-12-09 11:25:22 335
原创 LeetCode-周赛-思维训练-中等难度
整个实现逻辑,实际上就是分别考虑了两种情况,一种是数组中的元素本身可以维持连续性,一种是数组中的元素本身无法维持连续性,需要补齐。在有了前一题的基础上,再来做这一题,就简单了许多,本题可以看作当数组无法构造连续整数,且又未达到。我们先抛开原题不看,可以先完成一道简单的题目,假设现在就给你一个目标值X,问你能够构造出从。数组所包含的元素并不是按照最佳期望给的,但这并不影响整体的解题方式。时,你可以通过添加一些数字,使其满足要求,问你最少需要添加几次。现在,让我们回到原题中,虽然题目中给出的。
2023-12-06 20:30:00 183
原创 MySQL查询原理与优化
上一篇文章中(MySQL索引全解:从理论到实践,打造高效查询的指南),详细介绍了索引相关的内容,理解这部分知识对于实现高性能的查询来说必不可少,但这并不是全部,你还需要了解MySQL的查询流程,以及一些其他相关的查询机制,这样才能确保你不会写出一些性能糟糕的查询语句。所以,本篇文章就针对MySQL查询相关的内容进行介绍,包含:执行查询的过程、查询消耗的关键指标、查询的优化等,通过这些内容希望能够帮助你明白一些执行较慢的查询产生的原因,以及如何才能避开它们。从上一篇文章。
2023-11-13 09:45:00 111
原创 Spring事务最佳应用指南(包含:事务传播类型、事务失效场景、使用建议、事务源码分析)
这是一个典型的采用模板方法设计的抽象类,定义了关于事务的核心处理流程。下图展示了几个关键的抽象方法,其具体的逻辑处理都在子类中。下图是子类重写的doCommit和doRollback方法。Spring为我们提供的类,定义了事务处理的基本流程,对外暴露一个execute方法,并通过传入一个标记性接口来实现使用者的业务逻辑处理,大大简化了使用方式。而,很明显就是针对不同的ORM框架而定制的。所以定义是为了让事务使用更加方便,定义是为了让扩展更加的方便。
2023-11-06 09:45:00 229
原创 MySQL索引全解:从理论到实践,打造高效查询的指南
显然,索引并不是越多越好,否则也不多想,直接给所有列都加上索引就好了,之所以要限制索引的数量,主要是在新增、修改、删除等操作时,会因为需要同时维护索引而产生较高的消耗,我们知道每一个索引都会有一份独立的存储,索引越多也就意味着每添加一行数据,除了要记录本身的行数据之外,要写的索引文件也就越多,因此一定会对写入的性能造成一定的影响,尤其是那种写多读少的场景。通过前面的介绍,你应该明白索引也是需要存储的,索引长度首先影响的就是存储空间(不局限于磁盘上的存储,也关系到内存中的数据页能一次性加载多少索引键值)。
2023-10-22 10:23:12 233
原创 不讲故事的设计模式-责任链模式
通常一个商品在整个报价链路中会涉及到多种价格的计算,包括:基础价格、商家报价、平台报价、折扣价等,这其中每一种价格都有自己的计算逻辑,且有些价格是需要在前一个价格的基础上叠加计算,最终得出消费者到手价,所以可以运用责任链模式来处理。语句,代码看起来明显更加简洁直观,反观责任链模式将每个条件分支的处理逻辑封装在独立的处理节点中,反而增加了系统的复杂性和理解难度,特别是当链路比较长或者处理逻辑比较复杂时。很明显,上面的这种代码实现方式实在是不够优雅,每个具体的处理器类还得要处理对下一个处理器的调用,
2023-10-06 10:30:00 172
原创 方法设计时一定要考虑的几点
本文主要针对日常在进行代码review过程中发现的一些关于方法设计上的一些常见问题,改进这些问题能够有效的提升方法的可用性、健壮性、可维护性等方面问题。
2023-10-01 19:53:41 129
原创 不讲故事的设计模式-模板方法模式
模板方法模式是一种行为型设计模式,该设计模式的核心在于通过抽象出一套相对标准的处理步骤,并可灵活的将任意步骤交给子类去进行扩展,使得可以在不改变整体业务处理流程的前提下,通过定义不同的子类实现即可完成业务处理的扩展。我们可以举个简单的例子,比如对于下面定义的method方法中调用的a、b、c三个子方法,可以通过不同的子类实现来完成不同业务逻辑的处理。a();b();c();还可以这样定义,此时相当于b方法在父类中有一套默认的处理,子类可以根据需要选择重写或者不重写。a();b();c()
2023-09-26 09:45:00 120
原创 @Builder使用遇到的坑
注解的理解不深,但笔者认为在实际的业务开发中,难免会因为各种各样的原因而导致问题产生,对于一个方法的使用,不单单是要要求使用者能够完全了解,更重要的是方法本身在使用时会不会出现让使用者容易忽视的条件。反编译后发现(已过滤掉了部分无关代码内容),其实现方式就是通过。注解,就会缺少无参的构造方法,这严重违反了代码编写规范。主要是因为链式编程所带来的便捷性,实际上笔者更推荐使用。,它同样可以实现链式编程,同时还是避免多创建一个。通过反编译可以看出,问题就在于。方式构建,导致默认值丢失。对象,更重要的是可以避免。
2023-09-12 18:50:46 421 1
原创 Redis Bitmap:实现千万级用户签到的秘密武器
1. 在具体应用之前,有必要先了解一下什么是Redis Bitmap?Redis Bitmap是一种数据结构,它通过比特位来记录信息,每一位都代表一个布尔值,这样它可以在一些大规模数据的存储和查询场景中比常规的记录方式更节省内存和高效。2. Redis Bitmap常用的命令Bitmap在Redis中是通过字符串实现的,每个字符串都是一个固定大小的位数组,常用的命令如下:SETBIT:设置指定偏移量上的位值。。:指定的键名。:指定的偏移量。:要设置的值,0或1。
2023-08-31 14:30:00 769 2
原创 【提升接口响应能力的最佳实践】常规操作篇
CompletableFuture提供了一种优雅而强大的方式来处理并发请求和任务。然而,正如在处理高并发时使用过多的线程会导致资源浪费和效率下降一样,使用过多的 CompletableFuture 也会导致同样的问题。这种现象被称为 “线程调度问题”,它会导致性能下降和吞吐量下降(P99值较高)。因此,我们需要在使用 CompletableFuture 时考虑实际场景和负载情况,并根据需要使用恰当的技术来优化性能。
2023-08-26 20:30:00 877
原创 server.max-http-header-size设置不当引发的线上OOM案例分析
向内存申请,也就是说每接收到一个HTTP请求,都会向内存申请200MB的空间,所以,当请求并发上来以后,必然会导致OOM。线上OOM后,dump内存快照,通过MAT工具进行分析,如下图所示,有多个200MB的。来设置HTTP message header的大小,其默认为8KB,并通过。对象存在,这很不合理。排查相关配置后发现,被设置为200MB。
2023-07-28 10:15:00 1070
原创 关于如何写好代码的一些建议与方法(中)
关于如何写好代码的一些建议与方法(上)关于如何写好代码的一些建议与方法(下)数据结构一般被分为:逻辑结构与存储结构(内存)逻辑结构:线性结构、树形结构、图形结构存储结构:顺序存储、链式存储线性结构包含:数组、链表、栈、队列,其特点是由一系列数据类型相同的数据元素组成的有序集合。线性结构的优点是操作简单、速度快,随机访问能力强,但缺点是一旦数据量增加后,要么访问的速度变慢,要么插入或者删除的速度变慢,因此线性结构通常用于处理简单的数据集合,例如Java语言中的等容器集合。树这种数据结构就比线性结构要复杂得
2023-07-27 10:47:48 195
原创 关于如何写好代码的一些建议与方法(下)
设计原则是一块比较难以理解与统一的编程规范,因为它不像其他规范一样,都有明确的准则、模板、公式等,设计原则更多的是理解,不同的人理解可能不一样,一段代码,有些人可能认为已经符合设计原则了,有些人则认为不符合,有些人认为封装的合适,有些人则认为是过度封装,所以对于设计原则更重要的应该是保持团队中的认知统一,让团队中的成员保持统一的衡量尺度,不断地提高团队的整体认知水平,这样才能充分发挥出设计原则的作用。
2023-07-27 09:30:00 166
原创 小心掉进微服务的“坑”
本文探讨了微服务架构的设计和优化,特别是在分分合合的过程中可能出现的问题,如沟通和协调问题、服务依赖关系问题、系统性能问题、部署和维护问题、集成问题和故障传播问题。针对这些问题,文章提出了链路追踪、应用架构设计优化和垂直域划分等解决方案,强调了在进行微服务改造时需要有架构演进的把控能力,并逐步完善和调整实施细节,积极听取组织内外的经验意见。
2023-07-22 19:45:00 89
原创 JVM关键知识点整理,从入门到提高到实践
Garbage-First (G1)是一款非常具有特殊意义垃圾收集器的技术发展体现,因为相比G1之前的垃圾收集器,G1首次打破了基于老年代或者新生代一整块内存进行收集的设计思想,G1设计上依然有分代的思想,但是在内存上不再进行分代上的物理划分,也就是在一块大的内存区域中,既有年轻代也有老年代,G1适用于具有大内存的多核服务器,G1虽然与CMS一样都是追求低停顿时间的垃圾收集器,但是由于G1在设计上的突破,使其能在更大的内存空间回收时,保持优秀的垃圾回收效率,这是G1之前的所有垃圾收集器所不能做到的。
2023-06-30 21:03:55 517
原创 一文带你认识Kafka重点知识以及最佳应用实践方式
在Kafka中每个topic一般都会有多个分区,每个分区会按照一定规则分配给对应的消费者,那么一旦消费者无法接收消息后,就必须对分区进行重新分配,保证消息能够正常的被消费。比如原来一个主题中有两个分区,分别对应一个消费者组中的两个消费者,此时如果有一个消费者挂了,那么就会触发分区再均衡,此时就会让另一个健康的消费者来消费原来那个消费者对应的分区中的数据。简单的理解一下,副本就是对于分区中消息的备份,是kafka中通过数据的冗余保证高可用的一种方式,所以副本又是建立在kafka集群模式的基础上的。
2023-06-12 09:45:00 369
原创 关于如何用好线程池的一些建议
阻塞队列的设计起到了良好的缓冲作用,当面对突发流量到来时,先将任务丢到队列中,再慢慢来消费,其原理和MQ是类似的,一旦队列也被打满了,则说明消费能力与你的期望对比,已经严重不足了,此时maximumPoolSize参数的设计,又给了你一次处理的机会,你可以选择再开启一部分线程来应对突发状况,当危机接触后,再主动帮你回收这部分线程,或者选择使用拒绝策略。一个简单的任务处理,考虑各种实际运行中可能遇到的情况,对于线程池的使用者来说,也应了解线程池的任务处理流程,再结合自身的业务场景充分考虑其中的参数设置。
2023-06-01 10:00:00 528
原创 一文解决MySQL突击面试,关键知识点总结
A (Atomicity, 原子性)一个事务中的所有操作要不全部成功,要不全部失败,不能出现部分成功,部分失败的情况。C(Consistency,一致性)数据库设计上这个含义比较模糊,简单可以理解为财务的对账一样,两边数据的加加减减必须要能保持一致。I(Isolation,隔离性)主要是针对在并发场景下,对于共享资源的访问要有一定的隔离性,在MySQL中隔离性也是分等级的,根据不同的业务需求选择不同的隔离性,主要依靠锁+MVCC来实现,隔离性越强,数据库的吞吐就越差。
2023-05-03 09:14:51 1370 1
原创 【leetcode常见面试题】螺旋矩阵解题思路
总共上下左右4个方向。每个方向的开始都由上一个方向的结束来决定。每个方向的结束都由下一个方向的开始来决定。
2023-03-31 11:00:00 413
原创 LeetCode岛屿问题通用解决模板
岛屿类问题,最简单的处理方式就是使用深度优先遍历来解,找到一个陆地后,不断的向其上下左右四个方向进行遍历,直到抵达边界或者水域为止。我们先从一道LeetCode上的题目了解一下一般岛屿类题目的问题场景。通过上面6题,应该可以体会出通用解决模板的套路,无论题目如何变化,其边界判断、水域、陆地判断、上下左右遍历都是非常标准的解决岛屿问题的方式,只要掌握了这个套路,其他无非就是在其基础上演化处理而已。
2023-03-22 11:00:00 536
原创 SpringBoot帮你优雅的关闭WEB应用程序
监控的是SIGTERM信号,SIGTERM是Linux提供的一种优雅关闭服务的方式,通过发出一个软件终止的信号来给应用程序一个缓冲的时间,相对于SIGKILL这种,就会直接杀掉进程。与Tomcat不同之处,正如官方文档中说明那样,Undertow在关闭期间对于请求会直接返回503,而Tomcat则不会。,则不会有任何提示以及等待活跃请求执行完成的行为,而是直接关闭服务。只需简单配置后,即可使用,启动服务,发起请求。输出日志中,可以看到,当发起停止服务时,打印了。,表示开始等待活跃的请求执行结束。
2023-03-19 11:00:00 1732
原创 【从优秀源码中学习设计模式】--- 组合模式
spring定义了CompositeCacheManager来统一处理,把CacheManager当做“子树”,把Cache当做“叶子”,内部维护了一个List集合,向集合中添加元素时,即可以是CompositeCacheManager本身(spring考虑了可能根据不同的业务,需要独立、隔离CacheManager的需求),也可以是其他的CacheManager实现类(一个CacheManager可以有不同的实现),比如:NoOpCacheManager、CaffeineCacheManager等。
2023-03-02 10:30:00 241
原创 【设计模式实践系列】组合模式
通过上面的案例可以体会到,组合模式将机构和员工视为一组对象,其中员工为单个对象,机构为组合对象,把他们统一进行处理,利用树结构的特点,递归处理每个“子树”,简化客户端的操作,解耦了复杂对象的处理过程,同时高层模块调用简单,节点增加自由,易于扩展,不过组合模式只适用于类似树形结构的业务数据,实际应用场景有限。
2023-02-28 10:00:00 161
原创 使用ES Term query查询时一定要注意的地方
使用Term query可以根据精确值查找相关文档数据,不过Term query查询与查询还是有区别的,有时候你会发现用可以查到,换成Term query却不行,本文整理一些使用Term query容易出错的点供参考。如果你查看Term query的官方文档,你就会发现,官网首先对Term query做了3项明确说明。避免是对text属性的字段使用Term query查询。会因为分词器的原因改变字段的值,所以如果想要精确匹配text类型的字段将会很难。如果查询text类型的字段,建议使用。
2023-01-03 14:00:00 1592
MySQL突击面试宝典
2023-08-03
如何写好代码的一些建议(Java版)
2023-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人