- 博客(437)
- 收藏
- 关注

原创 SpringAOP中@EnableAspectJAutoProxy注解的作用
理解@EnableAspectJAutoProxy注解的作用
2020-09-30 17:25:55
16859
1

原创 解析SpringBoot中的starter原理
SpringBoot其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,提供自动配置的“starter”项目对象模型以简化Maven配置。本文重点分析springboot利用starter把关键类加载到spring容器中的过程,希望通过一步步分析使大家能够更好的理解其中的原理。...
2020-07-09 16:13:04
3134

原创 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
11309
2

原创 kafka生产者性能相关的参数理解
batch.size当多条消息发送到batch后,batch的上限大小(字节为单位),当达到上限时则会发送给kafka broker,设置的过小则降低了kafka的吞吐量,设置的过大则消息的延迟时间会拉长、占用了过高的内存...
2020-05-25 19:34:41
6444
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
4887
原创 初识风控安全,你永远绕不开的话题
所谓的风险识别,主要是针对企业在运营过程中对于面向互联网的业务,可能由于运营人员的不规范操作,或系统本身存在漏洞,或业务规则存在漏洞,或被攻击,被褥羊毛等行为产生的损失。而风险识别就是为了能够快速发现、控制上述等行为的发生,尽可能的降低损失。本文将针对近些年来我们在日常的业务经营中发现的一些比较常见的风险事件进行梳理,并分享一些所采取的应对措施。
2024-10-24 08:37:40
1134
原创 递归思想入门-回归解决问题最简单的版本
递归思维实质上体现了一种逆向推理的逻辑方式,即从最终结果回溯至初始条件。在一步步的倒推过程中,我们发现每一步要解决的问题本质上都是一样的。通过将复杂的大问题分解为多个相似的小规模子问题,进而揭示出解决问题的最基本单元,为寻找最简化的解决方案提供了有效途径。接下来,本篇文章通过几个例子带你感受下利用递归思维解决问题的魔力。
2024-10-21 09:00:00
1754
原创 千万不要错过,优惠券设计与思考初探
优惠券是一种使用频率最高的,用于营销类场景的工具。它有几个比较突出的特点:① 灵活易用,使用门槛低,规则简单,核算方便。② 可针对不同人群发不同券的方式,实现精细化运营,使利益最大化。③ 可承载多种多样的营销玩法,最终全部以优惠券的形式落地,比如金币-》券,积分-》券,XXX 值-》券等。④ 可快速实现以价格减免的方式完成交易,相比在定价上的调整,使用券则更简单。定价和优惠券都可以实现对价格上的调整,这里可以举一个简单的例子说明一下:假设,你是一个卖面包的,你制作了一款面包,成本价是 5 元。
2024-09-23 09:00:00
937
原创 最小化研发过程质量管理,质量与效率之间的平衡
是不是流程约束越多,效率越低?不然,如果因为缺了流程约束,而搞砸了质量,那么一切都将归零。所以找到一套适合自身的研发过程质量管理方式,在质量与效率之间趋向平衡是每个研发团队所必须要考虑的事情,本文是基于中小规模的企业环境中,研发团队不过百人而总结出来的一套最小化研发过程质量管理,以供有意者参加。
2024-07-22 09:00:00
1641
原创 掌握流量治理的法则,轻松驾驭热点、促销等高QPS场景
总之,流量治理是贯穿整个系统链路的过程,每个环节不但要各司其职,还要保证互不影响,稳定、可靠始终应当放在第一优先级来考虑,是关乎生死的问题,至于在保障稳定、可靠的前提之下,能做到多大的吞吐量,就取决于各自的能力了,从短期来看这是关乎业务能否继续扩大的问题,从长期来看,如果业务不能扩大,那一样是生死问题。
2024-05-23 09:00:00
794
原创 LeetCode-DFS-树类-简单难度
本题基于后序遍历进行处理,终止条件为当前节点为空,或者当前节点就是目标节点,所以如果左右子树都有返回值,则说明各自都找到目标节点,那最近公共祖先自然就是当前root节点。另一类情况就是一个为空,一个不为空,言下之意就是,一个找到了目标值,一个未找到目标值,那自然得返回找到目标值的那一个,最后递归逻辑会带着其中一个返回的目标值,与另一个带着其中一个返回的目标值,命中左右子树都不为空的条件,即可返回root。2.优先遍历左右子树,如果左子树为空,则返回右子树的深度,如果右子树为空,则返回左子树的深度。
2024-05-07 09:00:00
1003
原创 解码数据世界:统计学入门与应用指南
最后,希望本篇文章能为读者打开学习统计学的大门。通过掌握统计学的基本原理和技术,你将能够更好地理解和分析数据,从而在业务分析、商业决策以及日常生活中做出更加明智的选择。记住,统计学不仅仅是关于数字,更是关于洞察力和解释的艺术。随着不断学习和实践,你将能够更有效地利用统计学来解决各种问题,并发现数据背后蕴藏的真谛。
2024-04-23 18:30:00
1109
原创 LeetCode-数组-前缀和-中等难度
前缀和是一种利用预处理的方式来减少整体实现复杂度的方法。(i)(i - 1)(i)(i)(0 ~ i)0 < i < j(i ~ j)(j)(i - 1)根据这样的关系,在某些应用场景上我们就可以利用前缀和进行快速求解。
2024-03-08 09:15:00
971
原创 裂变增长秘诀:揭秘如何轻松实现用户裂变与高效拉新
据统计2022年我国手机上网人数10.65亿人,互联网普及率为75.6%,其中农村地区互联网普及率为61.9%,居民使用互联网的平均时间为2小时42分钟,城镇居民3小时23分钟,农村居民1小时38分钟,流量的规模虽然看起来如此之大,但实际上却是被少数巨头垄断,比如微信、微博、头条、抖音等,对于大多数企业来说,能够通过自身获取流量的能力实在有限,留也留不住,买也买不起是普遍现象。所以,拥有持续的获客方式就变得非常的重要,而移动互联网时代最重要的获客方式是什么?那一定是裂变拉新,
2024-03-04 09:15:00
1214
原创 揭秘统计数据:如何用数据魔法揭示生活中的奥秘?
你有没有遇到过,某天报表的数据突显异常,排查后发现原来是单位弄错了。你有没有遇到过,某组数据看起来没啥感觉,但做成报表组合到一起看问题则会非常明显。你有没有遇到过,有些凭直觉来感受的统计信息与仔细验算后的统计信息,最终得出的结论截然相反。你有没有遇到过,某些根据统计结果得出的结论看起来没问题,但总觉得哪里不对劲。我相信,只要你常看一些数据统计报表,或者会常做一些数据统计方面的工作,那你一定遇到过,大家常说数据不会骗人,但真的是这样吗?本篇文章主要就来揭秘一些既有趣、又能迷惑人的常见手段。
2024-02-22 09:45:00
946
原创 LeetCode-数组-定长滑动窗口-中等难度
一般我们在学习滑动窗口时,可以把它分为定长与不定长来针对性练习,滑动窗口实际上也可以看作是双指针,尤其是不定长的滑动窗口,本篇文章主要整理了一些比较有代表性的定长类滑动窗口的题型,以供练习。
2024-02-04 09:30:00
863
原创 如何打赢稳定性之战?
随着23年年末期间,各大厂争先恐后的出现的各种线上故障,一时间“降本增笑”、“开猿节流”成为了大家调侃的话题,我自己所在的公司其实也因为在年中时出现了几次线上故障,而面临着系统稳定性的考验。因此,也就想借本文跟大家分享、探讨一下到底如何才能打赢稳定性之战?
2024-01-15 09:00:00
1069
原创 LeetCode-数组-双指针-中等难度
双指针一般是指利用两个变量,通过在线性的结构上进行遍历来解决某些特定的问题,按照遍历的方式一般多采用:同向遍历,相向遍历两种方式,例如冒泡排序、选择排序、插入排序都是用了两个变量同向遍历来实现,快排则是通过相向遍历来实现。要求可接的雨水处的水量,可以先分别求出位于此处两侧最长柱子的高度,然后取其较短的一根即表示其可接水量的上限,因此完全可以通过不断的左右遍历(收缩较短的柱子)的方式计算出每个位置可接的水量。个后,再进行比较,所以快指针逻辑不变,只需要让慢指针在比较时每次往前取两位即可。左右指针,相向遍历。
2024-01-04 14:00:00
1047
原创 LeetCode-数组-重叠、合并、覆盖问题-中等难度
我认为区间类的题型,大多数考验的是思维能力,以及编码能力,该类题型本身并无什么算法可言,主要是思维逻辑,比如本题实际上你只需要能够总结出重叠与不重叠的含义,再加上一点编码技巧,便可完成。
2023-12-09 11:25:22
540
原创 LeetCode-周赛-思维训练-中等难度
整个实现逻辑,实际上就是分别考虑了两种情况,一种是数组中的元素本身可以维持连续性,一种是数组中的元素本身无法维持连续性,需要补齐。在有了前一题的基础上,再来做这一题,就简单了许多,本题可以看作当数组无法构造连续整数,且又未达到。我们先抛开原题不看,可以先完成一道简单的题目,假设现在就给你一个目标值X,问你能够构造出从。数组所包含的元素并不是按照最佳期望给的,但这并不影响整体的解题方式。时,你可以通过添加一些数字,使其满足要求,问你最少需要添加几次。现在,让我们回到原题中,虽然题目中给出的。
2023-12-06 20:30:00
245
原创 MySQL查询原理与优化
上一篇文章中(MySQL索引全解:从理论到实践,打造高效查询的指南),详细介绍了索引相关的内容,理解这部分知识对于实现高性能的查询来说必不可少,但这并不是全部,你还需要了解MySQL的查询流程,以及一些其他相关的查询机制,这样才能确保你不会写出一些性能糟糕的查询语句。所以,本篇文章就针对MySQL查询相关的内容进行介绍,包含:执行查询的过程、查询消耗的关键指标、查询的优化等,通过这些内容希望能够帮助你明白一些执行较慢的查询产生的原因,以及如何才能避开它们。从上一篇文章。
2023-11-13 09:45:00
380
原创 Spring事务最佳应用指南(包含:事务传播类型、事务失效场景、使用建议、事务源码分析)
这是一个典型的采用模板方法设计的抽象类,定义了关于事务的核心处理流程。下图展示了几个关键的抽象方法,其具体的逻辑处理都在子类中。下图是子类重写的doCommit和doRollback方法。Spring为我们提供的类,定义了事务处理的基本流程,对外暴露一个execute方法,并通过传入一个标记性接口来实现使用者的业务逻辑处理,大大简化了使用方式。而,很明显就是针对不同的ORM框架而定制的。所以定义是为了让事务使用更加方便,定义是为了让扩展更加的方便。
2023-11-06 09:45:00
439
原创 MySQL索引全解:从理论到实践,打造高效查询的指南
显然,索引并不是越多越好,否则也不多想,直接给所有列都加上索引就好了,之所以要限制索引的数量,主要是在新增、修改、删除等操作时,会因为需要同时维护索引而产生较高的消耗,我们知道每一个索引都会有一份独立的存储,索引越多也就意味着每添加一行数据,除了要记录本身的行数据之外,要写的索引文件也就越多,因此一定会对写入的性能造成一定的影响,尤其是那种写多读少的场景。通过前面的介绍,你应该明白索引也是需要存储的,索引长度首先影响的就是存储空间(不局限于磁盘上的存储,也关系到内存中的数据页能一次性加载多少索引键值)。
2023-10-22 10:23:12
423
原创 不讲故事的设计模式-责任链模式
通常一个商品在整个报价链路中会涉及到多种价格的计算,包括:基础价格、商家报价、平台报价、折扣价等,这其中每一种价格都有自己的计算逻辑,且有些价格是需要在前一个价格的基础上叠加计算,最终得出消费者到手价,所以可以运用责任链模式来处理。语句,代码看起来明显更加简洁直观,反观责任链模式将每个条件分支的处理逻辑封装在独立的处理节点中,反而增加了系统的复杂性和理解难度,特别是当链路比较长或者处理逻辑比较复杂时。很明显,上面的这种代码实现方式实在是不够优雅,每个具体的处理器类还得要处理对下一个处理器的调用,
2023-10-06 10:30:00
256
原创 方法设计时一定要考虑的几点
本文主要针对日常在进行代码review过程中发现的一些关于方法设计上的一些常见问题,改进这些问题能够有效的提升方法的可用性、健壮性、可维护性等方面问题。
2023-10-01 19:53:41
335
原创 不讲故事的设计模式-模板方法模式
模板方法模式是一种行为型设计模式,该设计模式的核心在于通过抽象出一套相对标准的处理步骤,并可灵活的将任意步骤交给子类去进行扩展,使得可以在不改变整体业务处理流程的前提下,通过定义不同的子类实现即可完成业务处理的扩展。我们可以举个简单的例子,比如对于下面定义的method方法中调用的a、b、c三个子方法,可以通过不同的子类实现来完成不同业务逻辑的处理。a();b();c();还可以这样定义,此时相当于b方法在父类中有一套默认的处理,子类可以根据需要选择重写或者不重写。a();b();c()
2023-09-26 09:45:00
214
原创 @Builder使用遇到的坑
注解的理解不深,但笔者认为在实际的业务开发中,难免会因为各种各样的原因而导致问题产生,对于一个方法的使用,不单单是要要求使用者能够完全了解,更重要的是方法本身在使用时会不会出现让使用者容易忽视的条件。反编译后发现(已过滤掉了部分无关代码内容),其实现方式就是通过。注解,就会缺少无参的构造方法,这严重违反了代码编写规范。主要是因为链式编程所带来的便捷性,实际上笔者更推荐使用。,它同样可以实现链式编程,同时还是避免多创建一个。通过反编译可以看出,问题就在于。方式构建,导致默认值丢失。对象,更重要的是可以避免。
2023-09-12 18:50:46
722
1
原创 Redis Bitmap:实现千万级用户签到的秘密武器
1. 在具体应用之前,有必要先了解一下什么是Redis Bitmap?Redis Bitmap是一种数据结构,它通过比特位来记录信息,每一位都代表一个布尔值,这样它可以在一些大规模数据的存储和查询场景中比常规的记录方式更节省内存和高效。2. Redis Bitmap常用的命令Bitmap在Redis中是通过字符串实现的,每个字符串都是一个固定大小的位数组,常用的命令如下:SETBIT:设置指定偏移量上的位值。。:指定的键名。:指定的偏移量。:要设置的值,0或1。
2023-08-31 14:30:00
1690
2
原创 12条必会技巧打造超高性能的接口API
CompletableFuture提供了一种优雅而强大的方式来处理并发请求和任务。然而,正如在处理高并发时使用过多的线程会导致资源浪费和效率下降一样,使用过多的 CompletableFuture 也会导致同样的问题。这种现象被称为 “线程调度问题”,它会导致性能下降和吞吐量下降(P99值较高)。因此,我们需要在使用 CompletableFuture 时考虑实际场景和负载情况,并根据需要使用恰当的技术来优化性能。
2023-08-26 20:30:00
1150
原创 server.max-http-header-size设置不当引发的线上OOM案例分析
向内存申请,也就是说每接收到一个HTTP请求,都会向内存申请200MB的空间,所以,当请求并发上来以后,必然会导致OOM。线上OOM后,dump内存快照,通过MAT工具进行分析,如下图所示,有多个200MB的。来设置HTTP message header的大小,其默认为8KB,并通过。对象存在,这很不合理。排查相关配置后发现,被设置为200MB。
2023-07-28 10:15:00
2042
原创 关于如何写好代码的一些建议与方法(中)
关于如何写好代码的一些建议与方法(上)关于如何写好代码的一些建议与方法(下)数据结构一般被分为:逻辑结构与存储结构(内存)逻辑结构:线性结构、树形结构、图形结构存储结构:顺序存储、链式存储线性结构包含:数组、链表、栈、队列,其特点是由一系列数据类型相同的数据元素组成的有序集合。线性结构的优点是操作简单、速度快,随机访问能力强,但缺点是一旦数据量增加后,要么访问的速度变慢,要么插入或者删除的速度变慢,因此线性结构通常用于处理简单的数据集合,例如Java语言中的等容器集合。树这种数据结构就比线性结构要复杂得
2023-07-27 10:47:48
265
原创 关于如何写好代码的一些建议与方法(下)
设计原则是一块比较难以理解与统一的编程规范,因为它不像其他规范一样,都有明确的准则、模板、公式等,设计原则更多的是理解,不同的人理解可能不一样,一段代码,有些人可能认为已经符合设计原则了,有些人则认为不符合,有些人认为封装的合适,有些人则认为是过度封装,所以对于设计原则更重要的应该是保持团队中的认知统一,让团队中的成员保持统一的衡量尺度,不断地提高团队的整体认知水平,这样才能充分发挥出设计原则的作用。
2023-07-27 09:30:00
850
原创 小心掉进微服务的“坑”
本文探讨了微服务架构的设计和优化,特别是在分分合合的过程中可能出现的问题,如沟通和协调问题、服务依赖关系问题、系统性能问题、部署和维护问题、集成问题和故障传播问题。针对这些问题,文章提出了链路追踪、应用架构设计优化和垂直域划分等解决方案,强调了在进行微服务改造时需要有架构演进的把控能力,并逐步完善和调整实施细节,积极听取组织内外的经验意见。
2023-07-22 19:45:00
465
原创 JVM关键知识点整理,从入门到提高到实践
Garbage-First (G1)是一款非常具有特殊意义垃圾收集器的技术发展体现,因为相比G1之前的垃圾收集器,G1首次打破了基于老年代或者新生代一整块内存进行收集的设计思想,G1设计上依然有分代的思想,但是在内存上不再进行分代上的物理划分,也就是在一块大的内存区域中,既有年轻代也有老年代,G1适用于具有大内存的多核服务器,G1虽然与CMS一样都是追求低停顿时间的垃圾收集器,但是由于G1在设计上的突破,使其能在更大的内存空间回收时,保持优秀的垃圾回收效率,这是G1之前的所有垃圾收集器所不能做到的。
2023-06-30 21:03:55
1529
MySQL突击面试宝典
2023-08-03
如何写好代码的一些建议(Java版)
2023-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人