摘要: 更多内容,前往 IT-BLOG 在开发中,有些集合存在多种不同的对象实例(例如:男人、女人),且每个对象也存在多种不同的访问者或处理方式(性格:暴躁、温和)。这样的例子还有很多,例如:好声音节目中不同评委,以及评委对他们的评价的选项,等等。这些被处理的数据元素相对稳定,而访问方式多种多样的数据结构, 阅读全文
posted @ 2020-11-19 14:30 Java程序员进阶 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 软件开发中,通常会存在 “方法的请求者” 与 “方法的实现者” 之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。特别是针对行为进行(撤销、重做、记录)一系列操作时很不方便,因此 “如何将方法的请求者与方法的实现者解耦”,是命令模式的主要任务和功能。在现实生活中, 阅读全文
posted @ 2020-11-19 14:27 Java程序员进阶 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在面向对象程序设计过程中,程序员常常会遇到如下情况:设计一个系统时知道算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如:去医院看病一般都要经历以下流程:挂号、排队、就诊、取药等,其中挂号和排队对每个 阅读全文
posted @ 2020-11-19 14:26 Java程序员进阶 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 跟多内容,前往 IT-BLOG 备忘录模式(Memento Pattern):保存对象的某个状态,以便在未来需要的时候进行数据的恢复。相当容易理解,举个简单的例子:Word 软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态; 一、备忘录模式的基本介绍 【1】备忘录模式(M 阅读全文
posted @ 2020-11-19 14:24 Java程序员进阶 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是 “网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,班长和团支书等干部需要记住同学们的电话,且同学中如果有人的电话修改了,需要告诉所有干部,自己的手机号修改了,这叫作 “牵一发而动全 阅读全文
posted @ 2020-11-19 14:23 Java程序员进阶 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。简单工厂模式是由一 阅读全文
posted @ 2020-11-19 14:21 Java程序员进阶 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 生活中,许多事物不是单独存在的,其中一个事物发生变化可能会导致一个或多个其他事物的行为也发生变化。例如:公众号的博主与用户之间(每当推送一篇文章,我们就能被动的接收到一篇文章,前提是你关注了它)。在软件设计中也是一样,例如:MVC 模式中的模型与视图的关系。此类场景使 阅读全文
posted @ 2020-11-19 14:13 Java程序员进阶 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据 阅读全文
posted @ 2020-11-19 14:05 Java程序员进阶 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 一、什么是单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建(私有的构造器),这 阅读全文
posted @ 2020-11-19 14:03 Java程序员进阶 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 设计模式的目的是为了让程序,具有更好的代码重用性、可读性(编程规范性,便于后期维护和理解)、可扩展性(当需要增加新需求时,非常方便)、可靠性(增加新功能后,对原功能么有影响)、使程序呈现高内聚,低耦合的特性。设计模式包含了面向对象的精髓,“懂了设计模式,就懂得了面向对 阅读全文
posted @ 2020-11-19 13:57 Java程序员进阶 阅读(743) 评论(1) 推荐(1) 编辑
摘要: 更多内容,前往 IT-BLOG 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工差旅费的报销,可审批的领导有部门负责人、副总经理、总经理等,但每个领导能批准的金额不同,员工必须根据自己要批准的金额去找不同的领导签名,也就是说员工必须记住每 阅读全文
posted @ 2020-11-19 11:19 Java程序员进阶 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在现实生活中,常常会出现这样的事例:一个人的情绪高兴时,会做出一些助人为乐的事情。情绪低落的时候,会做出一些伤天害理的事情。这里的情绪就是状态,对应做的事情就是行为。在软件开发中也是类似的,有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而 阅读全文
posted @ 2020-11-19 10:45 Java程序员进阶 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 一、概述 死锁是指两个或两个以上的进程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力干涉它们将无法推进,如果系统资源充足,进程的资源请求能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。​ 死锁产生的原因:【1】系统资源不足;【2 阅读全文
posted @ 2020-11-18 20:55 Java程序员进阶 阅读(1775) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 一、并发编程模型的两个关键问题 【1】并发中常见的两个问题:线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:内存共享和消息传递;【2】在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存 阅读全文
posted @ 2020-11-18 20:45 Java程序员进阶 阅读(27) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 锁主要分为两种:乐观锁和悲观锁,而 synchronized 就属于一种悲观锁,每次在操作数据前都会加锁。乐观锁是指:乐观的认为自己在操作数据时,别人不会对当前数据进行修改,因此不会加锁。如果有人对数据进行了修改,则重新获取修改后的数据,进行操作。直到成功为止。而乐观 阅读全文
posted @ 2020-11-18 20:37 Java程序员进阶 阅读(2426) 评论(0) 推荐(0) 编辑
摘要: 系统性学习,移步IT-BLOG Java 对象拥有一组监视方法:wait()、wait(long timeout)、notify() 以及 notifyAll() 方法,这些方法与 synchronized 同步关键字配合,可以实现等待/通知模式,进行线程之间的通讯。Condition 接口也提供了 阅读全文
posted @ 2020-11-18 20:17 Java程序员进阶 阅读(39) 评论(0) 推荐(0) 编辑
摘要: 一、什么是 Fork/Join框架 更多内容,前往 IT-BLOG Fork/Join 框架是 Java7提供的一个用于并发执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果得到大任务结果的框架。我们通过 Fork和 Join这两个单词来理解一下 Fork/Join框架。For 阅读全文
posted @ 2020-11-18 19:37 Java程序员进阶 阅读(12) 评论(0) 推荐(0) 编辑
摘要: 对象头[每个对象都具有对象头] Mark:对象头的标记(32位),描述对象的 hash、锁信息、垃圾回收标记、年龄;内容包括:①、指向锁记录的指针;②、指向 monitor 的指针;③、GC 标记;④、偏向锁线程 ID;​ 一、偏向锁 偏向锁无法使用自旋锁优化,因为一旦有其他线程申请锁,就破坏了偏向 阅读全文
posted @ 2020-11-18 18:02 Java程序员进阶 阅读(71) 评论(0) 推荐(0) 编辑
摘要: 一、什么情况下会发生栈内存溢出 【1】线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError 异常。递归的调用一个简单的方法,不断累积就会抛出 StackOverflowError 异常。【2】如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出 OutOfMemo 阅读全文
posted @ 2020-11-18 18:01 Java程序员进阶 阅读(53) 评论(0) 推荐(0) 编辑
摘要: 一、整体架构 ​ 二、强引用(默认支持) 当内存不足,JVM 开始垃圾回收,对于强引用的对象,就算是出现了 OOM 也不会对该对象进行回收,死都不收。强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾回收器不会碰这种对象。在Java 中最常见的就是强引用,把一 阅读全文
posted @ 2020-11-18 17:51 Java程序员进阶 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 一、为什么要备份 【1】容灾恢复:硬件故障、不经意的 Bug 导致数据损坏,或者服务器及其数据由于某些原因不可获取或无法使用等(例如:机房大楼烧毁,恶意的黑客攻击或 Mysql 的 Bug 等)。【2】人们改变想法:很多人经常会在删除某些数据后,又想恢复这些数据。【3】审计:有时需要知道数据或 Sc 阅读全文
posted @ 2020-11-18 17:47 Java程序员进阶 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 更多内容,移步IT-BLOG 排查思路 【1】定位高负载进程 pid:登录进服务器使用 top 或 top -c命令[ps -ef | grep xxx 命令]查看当前 CPU消耗过高的进程,从而得到进程id。观察各个进程资源使用情况,可以看出进程id为18571的进程,有着较高的CPU占比。按P( 阅读全文
posted @ 2020-11-18 17:45 Java程序员进阶 阅读(309) 评论(0) 推荐(0) 编辑
摘要: kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 一、中间件常识 【1】消息系统分类(两种):1)、Peer-to-Peer:发送到队列中的消息仅仅被一个接收者接收。支持异步 “即发即弃” 的消息传送方式,也支持同步 “请求应答” 阅读全文
posted @ 2020-11-18 17:40 Java程序员进阶 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 一、消息队列的使用场景 ☞ 以下介绍消息队列在实际应用常用的使用场景。异步处理、应用解耦、流量削锋和消息通讯四个场景。【1】异步处理:场景说明:用户注册后,需要发注册邮件和注册短信。 引入消息队列后架构如下:用户的响应时间=注册信息写入数据库的时间,例如50毫秒。发注册邮箱、发注册短信写入消息队列后 阅读全文
posted @ 2020-11-18 17:39 Java程序员进阶 阅读(221) 评论(0) 推荐(0) 编辑
摘要: RabbitMQ 是实现高级消息队列协议(AMQP:Advanced Message Queue Protocol)的开源代理软件,也称为面向消息的中间件。支持多种操作系统、多种编程语言。RabbitMQ 服务器使用 Erlang 语言编写,其集群和故障转移是构建在开放电信平台框架上的。 AMQP 阅读全文
posted @ 2020-11-18 17:38 Java程序员进阶 阅读(81) 评论(0) 推荐(0) 编辑
摘要: 一、生产者发送消息的步骤 ​创建一个 ProducerRecord 对象,对象中包含目标主题和要发送的内容。还可以指定键或分区。在发送 ProducerRecord 对象时,生产者要先把键和值对象序列化成字节数组,这样它们才能够在网络上传输。接下来,数据被传给分区器。分区器直接把指定的分区返回。如果 阅读全文
posted @ 2020-11-18 17:36 Java程序员进阶 阅读(698) 评论(0) 推荐(0) 编辑
摘要: 一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一。下面将从 Kafka文件存储机制和物理结构角度,分析 Kafka是如何实现高效文件存储,及实际应用效果。Kafka 的基本存储单位是分区。在配置 Kafka 的时候,管理员指定了一个用于存储分区的目录清单 阅读全文
posted @ 2020-11-18 17:08 Java程序员进阶 阅读(563) 评论(0) 推荐(0) 编辑
摘要: 消费者不需要自行管理 offset(分组+topic+分区),系统通过 broker 将 offset 存放在本地。低版本通过 zk 自行管理。系统自行管理分区和副本情况。消费者断线后会自动根据上一次记录的 offset 去获取数据(默认一分钟更新一次 offset),同一个分组中的客户不能同时消费 阅读全文
posted @ 2020-11-18 16:17 Java程序员进阶 阅读(2510) 评论(0) 推荐(0) 编辑
摘要: 系统性学习,移步IT-BLOG 一、写日志引发故障 【故障现象】:应用服务集群发布后不久就出现多台服务器相继报警,硬盘可用空间低于警戒值,并且很快有服务器宕机。登录在线上服务器,发现 log 文件夹里面的文件迅速增加,不断消耗磁盘空间。【原因分析】:这是一个普通的应用服务器集群,不需要存储数据,因此 阅读全文
posted @ 2020-11-18 15:42 Java程序员进阶 阅读(71) 评论(0) 推荐(0) 编辑
摘要: 如果把查询看作是一个任务,那么它由一些列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数。通常来说,查询的生命周期大致可以按照顺序来看:从客户端到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其 阅读全文
posted @ 2020-11-18 15:28 Java程序员进阶 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 一、Mybatis 实现 start 的原理 首先在写一个自定义的 start 之前,我们先参考下 Mybatis 是如何整合 SpringBoot:mybatis-spring-boot-autoconfigure 依赖包: <dependency> <groupI 阅读全文
posted @ 2020-11-18 15:26 Java程序员进阶 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 索引有很多种类型,为不同的场景提供更好的性能。在MySQL中,索引是在存储引擎层而不是服务器层实现。不同存储引擎的索引其工作方式并不一样。也不是所有存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层实现也可能不同。 一、B-Tree 索引 我们通过提到索引时,多半说的都是 B 阅读全文
posted @ 2020-11-18 15:25 Java程序员进阶 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 系统性学习,移步IT-BLOG 一、什么是 Redis Cluster Redis 是在内存中保存数据的,而我们的电脑一般内存都不大,这也意味着 Redis 不适合存储大数据,适合存储大数据的是 Hadoop 生态系统的 Hbase 或者是 MogoDB 。Redis 更适合处理高并发,一台设备的存 阅读全文
posted @ 2020-11-17 07:26 Java程序员进阶 阅读(1496) 评论(0) 推荐(0) 编辑
摘要: Reids 所有的数据结构都以唯一的 key 字符串作为名称,然后通过这个唯一的 key 值来获取相应的 value 数据。不同的数据结构差异就在于 value 的结构不一样。 一、Redis 五大数据类型 【1】String(字符串):String 是 Redis 最基本的类型,一个 key 对应 阅读全文
posted @ 2020-11-17 07:17 Java程序员进阶 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 系统性学习,移步IT-BLOG 要进行 Redis 的故障定位,一般通过分析 Redis 日志、应用日志和 Redis 的监控信息来定位相关问题。 一、Redis 日志设置 【1】日志文件:Redis 默认日志在控制台打印,启动时即可看到对应日志打印到控制台上。建议修改 redis.config 的 阅读全文
posted @ 2020-11-16 23:54 Java程序员进阶 阅读(2410) 评论(0) 推荐(0) 编辑
摘要: 一、概述 【1】Redis 是基于 Reactor 模式开发的网络事件处理器:这个处理器被称为文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型: ■ 文件事件处理器使用 I/O 多路复用(multiplexing)机制监听多个 阅读全文
posted @ 2020-11-16 23:51 Java程序员进阶 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任 阅读全文
posted @ 2020-11-16 21:57 Java程序员进阶 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 一、稀疏数组的定义 稀疏(sparsearray)数组:可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组。 稀疏数组的应用场景:五子棋程序,有存盘退出和续上盘的功能,将五子棋盘转化成二维数组如下所示:分析上述问题:因为该二维数组默认的 阅读全文
posted @ 2020-11-16 21:55 Java程序员进阶 阅读(397) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。链表是有序的列表,但是它 阅读全文
posted @ 2020-11-16 21:45 Java程序员进阶 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 一、什么是堆 【1】堆是一个完全二叉树,特点是从上往下,从左往右以次排列的;【2】在堆的数据结构中,堆中的最大值总是位于根节点,所有父节点都满足大于等于其子节点; ​我们对堆 阅读全文
posted @ 2020-11-16 21:19 Java程序员进阶 阅读(238) 评论(0) 推荐(0) 编辑