自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

善守者

扎根土壤,认真成长

  • 博客(327)
  • 资源 (2)
  • 收藏
  • 关注

原创 架构设计 高性能带来的复杂度

对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机,从电子管计算机到晶体管计算机再到集成电路计算机,运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高,相应的方法和系统复杂度也是越来越高。现代的计算机CPU集成了几亿颗晶体管,逻辑复杂度和制造复杂度相比最初的晶体管计算机,根本不可同日而语。软件系统也存在同样的现象。最近几十年软件系统性能飞速发展,从最初的计算机只能进行简单的科学计算,到现在Google能够支撑每秒几万次的搜索。与此同时,软件系统规模也从单台计算机扩展到上万台计算机;

2024-01-31 22:20:11 772

原创 面试题 - 动态代理是基于什么原理?

代理的发展经历了静态到动态的过程,源于静态代理引入的额外工作。因为反射机制使用广泛,根据社区讨论,目前,Java 9 仍然保留了兼容 Java 8 的行为,但是很有可能在未来版本,完全启用前面提到的针对 setAccessible 的限制,即只有当被反射操作的模块和指定的包对反射调用者模块 Open,才能使用 setAccessible,我们可以使用下面参数显式设置。如果熟悉设计模式中的代理模式,我们会知道,代理可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成。

2024-01-27 19:28:18 790

原创 多线程编程漫谈

具体实现是,调用 CountDownLatch 的 await 方法使自己处于阻塞状态,然后当具体的刷盘线程完成刷盘之后,通过调用 wakeupCustomer 方法,实际上调用了 CountDownLatch 的 countDown 方法,实现唤醒主线程的目的。在与用户交互的场景中,如果几十万个文件下载请求同时提交到线程池,当线程池中的所有线程都在处理任务时,无法及时处理的请求就会存储到线程池中的阻塞队列中。线程池自带一定的限流效果,因为工作线程数量是一定的,线程池允许的最大并发也是确定的。

2024-01-24 22:38:00 883

原创 程序员就应该懒惰

我还是先从你可能会忽略的问题入手,你的日常工作是给别人打造自动化,但你自己的工作够自动化吗?如果你写的代码要上线,会经过怎样的过程?懒惰,是一种品质,它会使你花很大力气去规避过度的精力消耗,敦促你写出节省体力的程序,别人也能很好地利用,你还会为此写出完善的文档,以免别人来问问题。急躁,是计算机偷懒时,你会感到的一种愤怒。它会促使你写出超越预期的程序,而不只是响应需求。不知道你是否感受到,程序员独有的幽默和透露出的那种骄傲:我做的东西就应该是最好的。傲慢,极度自信,写出(或维护)别人挑不出毛病的程序。

2024-01-23 22:13:15 313

原创 红黑树的应用 - TreeMap、LinkedHashMap、PriorityQueue

继续插入节点 30:当前节点 (0030)、父节点 (0025) 和叔叔节点 (0037) 都为红色,所以可以将当前节点的祖先 (0035) 的状态传递给子节点,变成上图第二个状态。继续插入节点 26:可以看到,现在的状态是,当前节点 (0026) 和父节点 (0030) 为红色,当前节点为左子树,父节点为右子树,并且叔叔节点并不为红色(组成一个大于号)。这时候我们也需要右旋,以当前节点为支点,将其父节点作为当前节点的右节点,当前节点重新充当其祖父节点的右节点,状态从图一转为图二。

2024-01-23 21:52:55 1000

原创 中间件存储设计 - 数组与链表

这带来的效果就是,如果 HashMap 有 32 个哈希槽,当前存储的数据也刚好有 32 个,这些数据却不一定全会落在哈希槽中,因为可能存在 hash 值一样但是不同 Key 的数据,这时,数据就会进入到链表中。不过,数组从严格意义上来说是面向过程编程中的产物,而 Java 是一门面向对象编程的语言,所以,直接使用数组容易破坏面向对象的编程范式,故面向对象编程语言都会对数组进行更高级别的抽象,在 Java 中对应的就是 ArrayList。其中,数组与链表是最底层的两种结构,是后续所有数据结构的基础。

2024-01-22 22:49:47 1235

原创 中间件-缓存、索引、日志

然后,在需要采集的机器中安装 Logstash 进程,通过 Logstash 将日志数据存储到 Elasticsearch 服务器,用户可以通过 Kibana 查询存储在 Elasticsearch 中的日志数据,这样,我们就可以有针对性地查询所需要的日志了。由于订单编号为 1 的订单信息存储在 order_db_00 中,但与这条订单关联的订单字表却存储在 order_db_01 中,而 Join 操作需要的笛卡尔积操作存在于不同的数据库实例中,所以我们就要将多个数据库中的数据统一加载到内存中。

2024-01-22 22:12:44 1265

原创 什么是中间件?

通过刚才的学习,我们知道了中间件的概念,它是为了解决系统中的技术需求,将技术需求与业务需求进行解耦,让我们专注于业务代码开发的一个个技术组件。中间件的存在,就是为了解决高并发、高可用性、高性能等各领域的技术难题。在项目中,合理引用中间件能极大提升我们系统的稳定性、可用性,但同时也会提升系统维护的复杂度,对我们的技术能力提出了更高的要求,我们必须要熟练掌握项目中引用的各种中间件,深入理解其工作原理、实现细节,提高对中间件的驾驭能力,否则一旦运用不当,很可能给系统带来灾难性的故障。

2024-01-20 22:07:48 1946 3

原创 Mybatis原理 - 标签解析

很多开源框架之所以能够流行起来,是因为它们解决了领域内的一些通用问题。但在实际使用这些开源框架的时候,我们都是要解决通用问题中的一个特例问题,所以这时我们就需要使用一种方式来控制开源框架的行为,这就是开源框架提供各种各样配置的核心原因之一。现在控制开源框架行为主流的配置方式就是 XML 配置方式和注解方式,MyBatis 有两方面的 XML 配置,一个是 mybatis-config.xml 配置文件中的整体配置,另一个是 Mapper.xml 配置文件中的 SQL 语句。

2024-01-20 21:28:59 886

原创 架构设计: 如何提供设计方案

最后,我把今天的“四步回答法”做个总结,加深每一步你需要掌握的注意点。1、在回答系统复杂度来源的时候,要注意结合具体的业务场景和业务发展阶段来阐述。业务场景表明了业务的独特性,发展阶段表明了业务的成熟度,因为同一业务场景在不同阶段产生的矛盾也是不同的。2、在回答解决方案的时候,有价值的解决方案一定是建立在明确复杂度来源基础之上的。所以在设计架构的时候才分主要问题和次要问题,主要问题是必须要解决的点,次要问题可以根据实际情况进行取舍。

2024-01-17 21:38:13 797

原创 架构设计 识别复杂度

注意,这里的设计目标设定为峰值的4倍是根据业务发展速度来预估的,不是固定为4倍,不同的业务可以是2倍,也可以是8倍,但一般不要设定在10倍以上,更不要一上来就按照100倍预估。实际上大部分场景下,复杂度只是其中的某一个,少数情况下包含其中两个,如果真的出现同时需要解决三个或者三个以上的复杂度,要么说明这个系统之前设计的有问题,要么可能就是架构师的判断出现了失误,即使真的认为要同时满足这三方面的要求,也必须要进行优先级排序。前浪微博的业务发展很快,系统也越来越多,系统间协作的效率很低。

2024-01-08 23:43:20 934

原创 大数据 Hive - 实现SQL执行

从图上看,join的MapReduce计算过程和前面的group by稍有不同,因为join涉及两张表,来自两个文件(夹),所以需要在map输出的时候进行标记,比如来自第一张表的输出Value就记录为<1, X>,这里的1表示数据来自第一张表。这样经过shuffle以后,相同的Key被输入到同一个reduce函数,就可以根据表的标记对Value数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出就是join的结果。问题的答案,也就是这个神奇的工具就是Hadoop大数据仓库Hive。

2024-01-08 22:00:55 1382 1

原创 大数据 Yarn - 资源调度框架

所谓高层模块和低层模块的划分,简单说来就是在调用链上,处于前面的是高层,后面的是低层。我们以典型的Java Web应用举例,用户请求在到达服务器以后,最先处理用户请求的是Java Web容器,比如Tomcat、Jetty这些,通过监听80端口,把HTTP二进制流封装成Request对象;然后是Spring MVC框架,把Request对象里的用户参数提取出来,根据请求的URL分发给相应的Model对象处理;再然后就是我们的应用程序,负责处理用户请求,具体来看,还会分成服务层、数据持久层等。

2024-01-07 21:11:52 1309 1

原创 架构设计的历史背景

理解了架构的有关概念和定义之后,就需要知道架构设计的历史背景。我认为,如果想要深入理解这个事物的本质,最好的方式就是去追寻这个事物出现的历史背景和推动因素。我们先来简单梳理一下软件开发进化的历史,探索一下软件架构出现的历史背景。

2024-01-07 20:59:21 914

原创 大数据 MapReduce如何让数据完成一次旅行?

专栏上一期我们聊到MapReduce编程模型将大数据计算过程切分为Map和Reduce两个阶段,先复习一下,在Map阶段为每个数据块分配一个Map计算任务,然后将所有map输出的Key进行合并,相同的Key及其对应的Value发送给同一个Reduce任务去处理。通过这两个阶段,工程师只需要遵循MapReduce编程模型就可以开发出复杂的大数据计算程序。那么这个程序是如何在分布式集群中运行起来的呢?MapReduce程序又是如何找到相应的数据并进行计算的呢?答案就是需要MapReduce计算框架来完成。

2024-01-06 16:42:31 1295

原创 Redis 持久化——AOF

AOF 重写指的是它会直接读取 Redis 服务器当前的状态,并压缩保存为 AOF 文件。例如,我们增加了一个计数器,并对它做了 99 次修改,如果不做 AOF 重写的话,那么持久化文件中就会有 100 条记录执行命令的信息,而 AOF 重写之后,之后记录一条此计数器最终的结果信息,这样就去除了所有的无效信息。

2024-01-06 15:55:33 1099

原创 你的代码写测试了吗?

这就意味着你的测试代码也要写得清晰,比如:良好的命名,把函数写小,要重构,甚至要抽象出测试的基础库,在 Web 测试中常见的 PageObject 模式,就是这种理念的延伸。比如,如果测试依赖于外部数据库或是第三方服务,测试 A 在运行时在数据库里写了一些值,测试 B 要用到数据库里的这些值,测试 B 必须在测试 A 之后运行,这就叫有依赖。更理想的情况是,质量保证是贯穿在软件开发全过程中,从需求开始的每一个环节,都将“测试”纳入考量,每个角色交付自己的工作成果时,都多问一句,你怎么保证交付物的质量。

2024-01-05 23:34:18 894

原创 Mybatis缓存实现方式

在创建 SoftReference 对象的时候,我们可以为其关联一个引用队列,当这个 SoftReference 指向的对象被回收的时候,JVM 就会将这个 SoftReference 作为通知,添加到与其关联的引用队列,之后我们就可以从引用队列中,获取这些通知信息,也就是 SoftReference 对象。**而只被软引用指向的对象是在 JVM 内存紧张的时候才被回收,它是可以经历多次 GC 的,这就是两者最大的区别。**如果为 null,则表示这个软引用指向的对象在之前的某个时刻,已经被 GC 掉了;

2024-01-05 23:10:07 829

原创 大数据 MapReduce是什么?

在Hadoop问世之前,其实已经有了分布式计算,只是那个时候的分布式计算都是专用的系统,只能专门处理某一类计算,比如进行大规模数据的排序。很显然,这样的系统无法复用到其他的大数据计算场景,每一种应用都需要开发与维护专门的系统。而Hadoop MapReduce的出现,使得大数据计算通用编程成为可能。我们只要遵循MapReduce编程模型编写业务处理逻辑代码,就可以运行在Hadoop分布式集群上,无需关心分布式计算是如何完成的。

2024-01-04 22:03:53 1272

原创 什么是架构设计?

软件架构指软件系统的顶层(Rank)结构,它定义了系统由哪些角色(Role)组成,角色之间的关系(Relation)和运作规则(Rule)。因为这个定义中的4个关键词,都可以用R开头的英文单词来表示,分别是Rank、Role、Relation和Rule,所以我把定义简称为“4R架构定义”,每个R的详细解释如下。第一个R,Rank。它是指软件架构是分层的,对应“系统”和“子系统”的分层关系。通常情况下,我们只需要关注某一层的架构,最多展示相邻两层的架构,而不需要把每一层的架构全部糅杂在一起。

2024-01-04 21:29:04 1076 4

原创 大数据 HDFS-存储的王者

DataNode会通过心跳和NameNode保持通信,如果DataNode超时未发送心跳,NameNode就会认为这个DataNode已经宕机失效,立即查找这个DataNode上存储的数据块有哪些,以及这些数据块还存储在哪些服务器上,随后通知这些服务器再复制一份数据块到其他服务器上,保证HDFS存储的数据块备份数符合用户设置的数目,即使再出现服务器宕机,也不会丢失数据。HDFS为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为3份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。

2024-01-03 23:37:48 1182

原创 Redis 持久化—RDB

RDB(Redis DataBase)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的过程。

2024-01-03 23:23:31 1082

原创 Mybatis-Mapper文件与Java接口如何相互映射?

在Mybatis的使用过程中,我们会为每个 Mapper.xml 配置文件创建一个对应的 Mapper 接口,例如,订单系统示例中的 CustomerMapper.xml 配置文件与 CustomerMapper 接口,定义完 CustomerMapper 接口之后,我们无须提供 CustomerMapper 接口实现,就可以直接调用 CustomerMapper 对象的方法执行 CustomerMapper.xml 配置文件中的 SQL 语句。

2024-01-02 22:04:20 1324

原创 一个人最核心的能力

正如毛泽东所说:"只有当还没有出现大量的明显的东西的时候,当桅杆顶刚刚露出的时候,就能看出这是要发展成为大量的普遍的东西,并能掌握住它,这才叫领导。"只有拥有预见性,才能在竞争激烈的市场中取得优势,实现事业的成功。能力指的是将各种资源和人才协调起来,形成一个强大的团队,以实现共同的目标。所以,只有拥有整合能力,才能在团队中充分发挥每个人的才华,实现共同的愿景。最后,稳定的情绪也是一个人最核心的能力之一。正如曾国藩所说:“结硬寨,打呆仗”,只有在稳定的情绪状态下,才能做出正确的决策和行动,应对各种挑战。

2024-01-02 12:16:08 389

原创 怎么设计一个简单又直观的接口?

开放的接口规范是使用者和实现者之间的合约。既然是合约,就要成文、清楚、稳定。合约是好东西,它可以让代码之间的组合有规可依。但同时它也是坏东西,让接口的变更变得困难重重。接口设计的困境,大多数来自于接口的稳定性要求。摆脱困境的有效办法不是太多,其中最有效的一个方法就是要保持接口的简单直观。那么该怎么设计一个简单直观的接口呢?

2024-01-01 21:51:40 1200

原创 大数据规模存储的几个核心问题

大规模数据存储都需要解决几个核心问题,这些问题都是什么呢?

2024-01-01 21:20:23 1098

原创 大数据软件开发软件架构设计思路

但是每个用户之间的请求是独立的,只要网站的分布式系统能将不同用户的不同业务请求分配到不同的服务器上,只要这些分布式的服务器之间耦合关系足够小,就可以通过添加更多的服务器去处理更多的用户请求及由此产生的用户数据。大数据技术将移动计算这一编程技巧上升到编程模型的高度,并开发了相应的编程框架,使得开发人员只需要关注大数据的算法实现,而不必关注如何将这个算法在分布式的环境中执行,这极大地简化了大数据的开发难度,并统一了大数据的开发方式,从而使大数据从原来的高高在上,变成了今天的人人参与。我们再回过头来看大数据。

2024-01-01 20:51:50 1190

原创 Mybatis 事务接口

在修改完成之后,我们需要提交事务,完成整个事务内的全部修改操作,如果修改过程中出现异常,我们也可以回滚事务,放弃整个事务中的全部修改操作。当我们从数据源中得到一个可用的数据库连接之后,就可以开启一个数据库事务了,事务成功开启之后,我们才能修改数据库中的数据。的实现,其中维护了事务关联的数据库连接以及数据源对象,同时还记录了事务自身的属性,例如,事务隔离级别和是否自动提交。方法都是空实现,事务的提交和回滚都是依靠容器管理的,这也是它被称为。在日常使用数据库事务的时候,我们最常用的操作就是提交和回滚事务,

2023-12-31 14:42:49 448

原创 大数据应用领域:数据驱动一切

大数据出现的时间只有十几年,被人们广泛接受并应用只有几年的时间,但就是这短短几年的时间,大数据呈现出爆炸式增长的态势。在各个领域,大数据的身影几乎无处不在。今天我们通过一些大数据典型的应用场景分析,一起来看看大数据到底能做些什么,我们学大数据究竟有什么用,应该关注大数据的哪些方面。

2023-12-31 14:21:15 1027

原创 功能开发 -- 向埃隆·马斯克学习任务分解

对于马斯克来说,他的解决方案可能是成立一个公司,找到这方面的专家帮助他实现。对你的日常工作来说,你要清楚具体每一步要做的事情,如果不能,说明任务还需要进一步分解。比如,你要把一个信息存起来,假设你们用的是关系型数据库,对大多数人来说,这个任务分解就到了可执行的程度。但如果你的项目选用了一个新型的数据库,比如图数据库,你的任务分解里可能要包含学习这个数据库的模型,然后还要根据模型设计存储方案不过,在实际工作中,大多数人都高估了自己可执行粒度,低估任务分解的程度。

2023-12-31 00:51:03 848

原创 Redis 快速搭建与使用

Redis 是由 C 语言开发的,经常被用作等。Redis 因为其强大的功能和简洁的设计,深受广大开发者和公司的喜爱,几乎占领了内存数据库市场的所有份额。

2023-12-30 20:11:51 1266

原创 优秀开源项目

【代码】优秀开源项目。

2023-12-30 14:37:47 1464

原创 Lamda 使用案例

统计以上所有:summarizingInt、summarizingLong、summarizingDouble。平均值:averagingInt、averagingLong、averagingDouble。求和:summingInt、summingLong、summingDouble。对集合进行数据统计,进行计数、平均值、最值、求和。最值:maxBy、minBy。

2023-12-30 12:48:13 388

原创 大数据应用发展史:从搜索引擎时代到机器学习时代

大数据技术的使用经历了一个发展过程从最开始的Google在搜索引擎中开始使用大数据技术,到现在无处不在的各种人工智能应用,伴随着大数据技术的发展,大数据应用也从曲高和寡走到了今天的遍地开花。Google从最开始发表大数据划时代论文的时候,也许自己也没有想到,自己开启了一个大数据的新时代。今天大数据和人工智能的种种成就,离不开全球数百万大数据从业者的努力,这其中也包括你和我。历史也许由天才开启,但终究还是由人民创造,作为大数据时代的参与者,我们正在创造历史。

2023-12-30 12:30:40 1593

原创 大数据技术发展史

如果有时间,你可以简单浏览下Hadoop的代码,这个纯用Java编写的软件其实并没有什么高深的技术难点,使用的也都是一些最基础的编程技巧,也没有什么出奇之处,但是它却给社会带来巨大的影响,甚至带动一场深刻的科技革命,推动了人工智能的发展与进步。图中的所有这些框架、平台以及相关的算法共同构成了大数据的技术体系,我将会在专栏后面逐个分析,帮你能够对大数据技术原理和应用算法构建起完整的知识体系,进可以专职从事大数据开发,退可以在自己的应用开发中更好地和大数据集成,掌控自己的项目。

2023-12-29 22:14:23 1052

原创 深入Mybatis数据源

其中封装了真正的 java.sql.Connection 对象以及相关的代理对象,这里的代理对象就是通过JDK 动态代理产生的。下面来看 PooledConnection 中的核心字段。

2023-12-29 21:55:56 853

原创 代码重复:搞定代码重复的三个绝招

业务同学抱怨业务开发没有技术含量,用不到设计模式、Java 高级特性、OOP,平时写代码都在堆 CRUD,个人成长无从谈起。每次面试官问到“请说说平时常用的设计模式”,都只能答单例模式,因为其他设计模式的确是听过但没用过;对于反射、注解之类的高级特性,也只是知道它们在写框架的时候非常常用,但自己又不写框架代码,没有用武之地。其实,我认为不是这样的。设计模式、OOP 是前辈们在大型项目中积累下来的经验,通过这些方法论来改善大型项目的可维护性。

2023-12-28 23:27:36 1133 2

原创 Redis 是如何执行的?

Redis是如何执行的?

2023-12-28 22:41:22 1791

原创 代码是如何变混乱的?

今天,我讲的内容是软件设计,很多代码的问题就是因为对设计思考得不足导致的。许多程序员学习设计是从设计模式起步的,但这种学法往往会因为缺乏结构,很难有效掌握。设计原则,是一个更好的体系,掌握设计原则之后,才能更好地理解设计模式这些招式。Robert Martin 总结出的“SOLID”是一套相对完整易学的设计原则。我以“SOLID” 中的单一职责原则为例,给你稍做展开,更多的内容可以去看 Robert Martin 的书。

2023-12-26 21:38:48 934

原创 IDEA Maven Helper插件 解决jar冲突

当在Maven项目中引入A的依赖,A的依赖通常又会引入B的jar包,B可能还会引入C的jar包。项目中同时引入了A和B两个依赖,它们间接都引入了Z依赖,但由于B的依赖链路比较短,因此最终生效的是Z(20.0)版本。如果两个依赖的路径一样,最短路径优先原则是无法进行判断的,此时需要使用最先声明优先原则,也就是说,谁的声明在前则优先选择。A和B最终都依赖Z,此时A的声明(pom中引入的顺序)优先于B,则针对冲突的Z会优先引入Z(21.0)。依赖链路一:A -> X -> Y -> Z(21.0)

2023-12-25 22:19:24 816

lamda-demo-main.zip

lamda-demo-main.zip

2023-12-28

Thinking in Java Idea版本.zip

Thinking in Java Idea版本,可以直接运行

2021-01-16

韩顺平_Java设计模式笔记.docx

韩顺平_Java设计模式笔记.docx

2021-01-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除