- 博客(45)
- 资源 (3)
- 收藏
- 关注
原创 管道模式与过滤器模式区别
首先,管道模式(Pipeline Pattern)是一种责任链模式(Chain of Responsibility Pattern)的变体,它将数据传递到一个加工处理序列中,每个步骤对数据进行加工处理后,再传递到下一个步骤进行进一步处理,直到全部步骤处理完毕。这种模式主要用于将复杂的进程分解成多个独立的子任务,像流水线一样去执行。管道模式关注的是数据的顺序处理和逐步转换,确保数据按照预定义的步骤依次通过每个处理阶段。
2024-04-12 11:24:11
712
2
原创 复杂度来源:高可用2
参考维基百科,先来看看高可用的定义。系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。这个定义的关键在于“”,但恰好难点也在“无中断”上面,因为无论是单个硬件还是单个软件,都不可能做到无中断,硬件会出故障,软件会有 bug;硬件会逐渐老化,软件会越来越复杂和庞大……除了硬件和软件本质上无法做到“无中断”,外部环境导致的不可用更加不可避免、不受控制。例如,断电、水灾、地震,这些事故或者灾难也会导致系统不可用,而且影响程度更加严重,更加难以预测和规避。
2024-03-21 11:03:33
649
原创 架构设计-复杂度来源:高性能
对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机,从电子管计算机到晶体管计算机再到集成电路计算机,运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高,相应的方法和系统复杂度也是越来越高。现代的计算机 CPU 集成了几亿颗晶体管,逻辑复杂度和制造复杂度相比最初的晶体管计算机,根本不可同日而语。软件系统也存在同样的现象。最近几十年软件系统性能飞速发展,从最初的计算机只能进行简单的科学计算,到现在 Google 能够支撑每秒几万次的搜索。
2024-03-15 22:40:09
1041
原创 架构设计的核心目的与意义
以史为鉴,对我们了解架构设计的目的很有帮助。谈到架构设计,相信每个技术人员都是耳熟能详,但如果深入探讨一下,“为何要做架构设计?”或者“架构设计目的是什么?”类似的问题,大部分人可能从来没有思考过,或者即使有思考,也没有太明确可信的答案。
2024-03-15 17:26:41
1388
原创 架构设计的历史背景
理解了架构的有关概念和定义之后,今天,我会给你讲讲架构设计的历史背景。我认为,如果想要深入理解一个事物的本质,最好的方式就是去追寻这个事物出现的历史背景和推动因素。我们先来简单梳理一下软件开发进化的历史,探索一下软件架构出现的历史背景。
2024-03-14 22:39:01
921
原创 谈谈你对Java平台的理解?
从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Write once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度?请你先停下来总结思考一下。今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?
2024-03-14 22:34:58
914
原创 读书笔记-父母的语言
芝加哥大学妇科及儿科教授,小儿人工耳蜗项目负责人,芝加哥大学医学院"3000万词汇倡议"机构的创始人和主任。她曾获得芝加哥大学医学院〞杰出项目创新的领导者”奖项,也是白宫的"结束成绩差距"倡议的发起人之•。本书是她30年的科学研究结晶,在美国学术界和教育界引起巨大反响。
2024-03-13 22:43:15
979
原创 互联网常见专业词汇汇总
是觉得备用数据中心只做备份太浪费了,所以让主备两个数据中心都同时承担用户的业务,此时,主备两个数据中心互为备份,并且进行实时备份。一般来说,主数据中心的负载可能会多一些,比如分担60~70%的业务,备数据中心只分担40%~30%的业务。公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)(转化量/点击量)*100%。原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器。
2024-03-12 22:55:13
556
原创 Bitmap实现原理&应用场景
用内存中连续的二进制位(bit),用0或1标识数据是否存在。长度为10的bitmap,1,2,3,4 在bitmap中存在。
2024-03-12 22:52:46
1360
原创 分布式架构-技术点概括
在上图中,当DB负载过高,我需要为Service机器加缓存时,就遇到一个基本问题:如果使用local的内存做缓存,则其他Service机器就没办法共用此缓存。在上图中,当我要存储客户端上传的图片文件时,就会遇到另一个基本问题:我不能把图片存在每个Tomcat的本地文件系统里面,这样的话,其他机器就没办法访问了。常用的消息中间件,比如老一辈的ActiveMQ/RabbitMQ, 新一点的,阿里的RocketMQ,LinkedIn的Kafka等。对上层屏蔽分库分表,sql的执行,像是在单库一样。
2024-03-11 22:53:52
1276
原创 设计模式-适配器模式
适配器模式的主要功能就是将原有不兼容的接口或类的功能适配到目标接口中,使得原有的类可以在不修改其代码的情况下,与其他代码协同工作。当系统中的两个接口不匹配时,引入适配器可以将一个接口的功能适配到另一个接口,使它们能够协同工作。当一个类的功能不符合当前系统的需求,但又不方便修改这个类时,通过适配器将其功能适配到目标接口,从而实现功能的复用。在系统中引入新的代码时,为了与已有的旧代码协同工作,可能需要使用适配器将新代码适配到旧代码的接口或规范。
2024-03-11 22:45:36
622
原创 常用的加密算法
名为.MD5 的文本或者一行字符,这行字符就是就是把整个文件当作原数据通过 MD5 计算后的值,我们下载文件后,可以用检查文件 MD5 信息的软件对下载到的文件在进行一次计算。RSA 加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广。输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下。非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。MD5 常常作为文件的签名出现,我们在下载文件的时候,常常会看到文件页面上附带一个扩展。
2024-03-10 08:59:38
435
原创 常见3大web漏洞
举一个简单的例子,select * from user where id=100 ,表示查询id为100的用户信息,如果id=100变为 id=100 or 2=2,sql将变为:select * from user where id=100 or 2=2,将把所有user表的信息查询出来,这就是典型的sql注入。想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的身份登陆,做一些破坏。
2024-03-10 08:29:56
849
原创 深入理解网络通信和TCP/IP协议
计算机网络的标准定义是:利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。计算机网络从覆盖范围上划分可以分为三类:局域网、城域网、广域网。局域网 LAN(作用范围一般为几米到几十公里)、城域网 MAN(界于 WAN 与 LAN 之间)、广域网 WAN(作用范围一般为几十到几千公里)。当然计算机网络划分不止这一种分类方式。拓扑结构分类(总线型、环型、星型、网状)
2024-03-10 08:28:23
1781
1
原创 JVM-垃圾收集器G1
主要针对配备多个处理器及大容量内存的机器拆分成很多大小相等的Region。每个Region大小计算规则?可设置垃圾回收预期时间。对象不停的在新生代里分配,新生代的Region会不断增加,Eden和Survivor对应的Region也会不断增加。对象在新生代躲过了很多次的垃圾回收大对象的Region叫Humongous区大对象的判定规则就是一 个大对象超过了一个Region大小的50%Humongous区专门存放短期巨型对象可以节约老年代的空间,避免因为老年代空间不够的GC开 销。
2024-03-08 22:40:26
1728
原创 JVM-垃圾收集底层算法实现
事实上并不只是新生代、 老年代之间才有跨代引用的问题, 所有涉及部分区域收集 (Partial GC) 行为的垃圾收集器, 典型的如G1、 ZGC和Shenandoah收集器, 都会面临相同的问题。显然在可达性分析刚刚开始的阶段, 所有的对象都是白色的, 若在分析结束的阶段, 仍然是白色的对象, 即代表不可达。在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑 色(,其对应的卡表的元素标识就变成1,表示该元素变脏,否则为0.
2024-03-08 22:34:46
921
原创 JVM-垃圾收集器
时,则证明此对象是不可用的。如下图所示,对象object 5、object 6、object 7虽然互相有关联,它们的引用并不为0,但是它们到GC Roots是不可达的,因此它们将会被判定为是可回收的对象。在初始标记阶段,仅仅会通过“replicaManager”这个类的静态变量代表的GC Roots,去标记出来他直接引用的ReplicaManager对象,这就是初始标记的过程。标记过程就是对象是否属于垃圾的判定过程(也可以反过来标记出所有需要回 收的对象,在标记完成后,统一回收掉所有被标记的对象)
2024-03-07 19:23:40
1000
原创 JVM-对象创建与内存分配机制深度剖析 3
当前放对象的Survivor区域里(其中一块区域,放对象的那块s区),一批对象的总大小大于这块Survivor区域内存大小的50%(-XX:TargetSurvivorRatio可以指定),那么此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代了,如果Java堆中的内存并不是规整的,已使用的内存和空 闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟 机就必须维护一个列表,记 录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例, 并更新列表上的记录。
2024-03-07 12:40:03
1254
原创 JVM-整体结构原理深度解析
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合 C/C++程序,Java诞生的时候是C/C++横行的时候,要想立足,必须有调用C/C++程序,于是就。主要是调用c或c++实现的本地接口。总体而言,具体的存储位置取决于Java虚拟机的实现版本,而在现代的Java虚拟机中,元空间是类元数据信息的存储区域。
2024-03-06 17:40:15
1052
原创 GraalVM 虚拟机-概述
Graal 编译器以及由此诞生的GraalVM,虽然目前还处在实验阶段,但是也是 Java 程序员们必须要了解的,因为他未来极有可能替代 HotSpot,成为 Java生态的下一代技术基础。
2024-03-05 23:28:50
1488
原创 提高Java应用性能的利器:AOT编译技术
与传统的JIT(Just-In-Time)编译方式不同,AOT编译技术可以在应用程序部署或运行之前,将Java代码转换为目标计算机体系结构和操作系统的本地机器码,从而直接由处理器执行,避免了JVM的解释和翻译过程。通过将Java代码预先编译为本地机器码,绕过JVM的解释和翻译过程,可以显著提高应用程序的性能和响应速度,为用户提供更加优质的使用体验。通过AOT编译,你可以绕过JVM的解释和翻译过程,直接将Java代码编译成本地机器码,从而获得更高的性能和更快的启动时间。,然后使用GraalVM的。
2024-03-05 22:54:00
1685
原创 UML-类图详解
聚合是整体和个体之间的关系,即has-a的关系,体现了A对象可以包含B对象,但是B对象不是A对象一部分;换句话说,部分对象可以存在独立于整体对象的上下文中,整体对象的生命周期不直接决定部分对象的生命周期。总体来说,聚合关系强调了整体对象和部分对象之间的松散关联,部分对象在某种程度上是独立的。这与强关联的组合关系不同,组合关系中部分对象是整体对象的一部分,其生命周期直接受整体对象的管理。是一种使用关系,即一个类的实现需要另一个的协助,Java中,方法参数需要传入另一个类的对象,就表示依赖这个类。
2024-03-05 18:15:29
1703
原创 Java-Static&final
类型的变量被赋值,就不能再修改其值。这有助于确保变量在使用过程中保持不变性,提高代码的可读性和安全性。所以,可以将这两个概念视为两种不同的调用机制,一种在运行时确定,另一种在编译时确定。关键字用于声明一个不可变的变量,或者一个只能被赋值一次的变量。静态方法和属性关注于类本身,因此在编译时已经确定了调用。覆盖关注于实例方法,而实例方法的调用在运行时确定。静态方法静态变量在使用的时候需要注意什么?
2024-03-05 14:29:53
334
原创 设计模式-builder模式
通过在构造器中传递不同数量的参数,从而实现构建不同属性组合的对象。简单直观,适用于属性较少的情况。随着属性增加,构造器的参数组合呈指数级增长,难以维护和理解。使用默认构造器创建对象,然后通过 setter 方法逐个设置属性的值。灵活性较强,属性可以逐个设置。可能导致对象在构建过程中处于不完整状态,可变性带来的线程安全性问题,无法保证对象的不变性。通过一个独立的 Builder 类负责构建对象,通过链式调用设置属性,最后调用build方法得到最终的对象。
2024-03-05 11:08:49
2272
原创 http-499状态码
状态码499的出现可能与用户的操作有关,比如用户在请求处理过程中关闭了浏览器或者导航到了其他页面。在这种情况下,虽然服务器已经成功处理了请求,但是无法将响应返回给客户端。因此,状态码499被视为一种提示,提醒开发者用户可能存在提前离开页面的情况,有助于改善用户体验。这个状态码是由Nginx服务器定义的,当客户端在等待服务器响应时关闭连接,Nginx会将此情况记录为499状态码。状态码499是非标准的HTTP状态码,通常由服务器返回,
2024-03-05 10:59:54
11789
原创 lookup注解 加在方法之后 为什么方法返回值不起作用
lookup注解 加在方法之后 为什么方法返回值不起作用@Lookup注解通常用于配合原型(prototype)作用域的Bean,因为它允许在每次调用时获取一个新的实例。如果在单例(singleton)作用域的Bean上使用@Lookup,它可能会在应用程序启动时导致循环依赖的问题。方法的返回值为null只是为了占位。实际上,在使用@Lookup注解时,方法的实际实现是由Spring在运行时动态生成的,而不是在编码阶段确定的。因此,为了让编译通过,方法的返回值可以是null,但在实际运行时,Spring
2024-03-05 10:43:40
397
原创 Markdown文章标题提取(Java版本)
在处理 Markdown 文章时,有时候我们需要提取文章中的标题,以便生成目录或进行其他处理。本文将介绍如何通过编程的方式提取 Markdown 文章的标题,包括使用正则表达式和简单的字符串处理。
2023-11-12 08:57:53
646
原创 深入理解并发、线程与等待通知机
为什么用户线程又被称为协程呢?我们知道,内核线程的切换开销是来自于保护和恢复现场的成本, 那如果改为采用用户线程, 这部分开销就能够省略掉吗?答案还是“不能”。但是,一旦把保护、恢复现场及调度的工作从操作系统交到程序员手上,则可以通过很多手段来缩减这些开销。
2023-11-11 11:11:54
120
原创 Mysql-数据库索引
1 概述索引帮助Mysql高效获取获取数据的数据结构(排好序的快速查找 数据结构)。我们平常所说的索引,如果没有特别指明,都是B树(多路搜索树,并不一定是二叉树)结构组织的索引,其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认使用B+树索引,统称索引。除了B+树索引之外还有哈希索引(hash、index)等。索引本生也很大,往往依文件的形式存储在磁盘上。2 优缺点...
2023-02-03 11:39:37
144
1
原创 db-mysql(sql语句)
http://8aa512c4.wiz03.com/share/s/2aFhb41ayQ4W29lNzu3wxPge1xxUnW2Lv4YE25hm1n0OFX5x时间范围数据检索1、查询当天数据SELECT * FROM items WHERE TO_DAYS(NOW()) = TO_DAYS(createtime) 2、查询昨天数据SELECT * FROM items...
2018-07-21 10:45:13
346
原创 Java-Exception(异常处理)
基础概念Error:指的是JVM运行时的错误,这时的程序并没有执行。Exception:指的是程序运行过程中产生的异常,用户可以使用异常处理格式进行处理异常处理的基本格式java中异常处理的基本格式:(1)try catch finally 如果try中产生异常,则到catch中匹配对应的异常,然后进行相应的处理。(2)不管程序是否发生异常finally语句块都会执行。finally可以省略不写(...
2018-04-29 22:54:56
2085
原创 Java-Collection
一、集合基本特性1 概述数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。2 数组与集合区别 (1)数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值; 集合只能存储引
2017-08-06 21:41:48
256
原创 HashMap与HashTable的区别
一 、Hashing概念是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为哈希法。二 、HashMap1 概述(1)HashMap是基于hash表的Map接口的非同步实现(非线程安全在多线程环境下需要手动同步)在单线程下效率较高。(2)元素是键值对(key-value)的形式,允许key,value为null类型。(3)不保证映射的顺
2017-08-06 21:35:32
317
原创 Java实现逆波兰表达式(Evaluate Reverse Polish Notation)
逆波兰表达式定义:传统的四则运算被称作是中缀表达式,即运算符实在两个运算对象之间的。逆波兰表达式被称作是后缀表达式,表达式实在运算对象的后面。逆波兰表达式:a+b ---> a,b,+a+(b-c) ---> a,b,c,-,+a+(b-c)*d ---> a,b,c,-,d,*,+a+d*(b-c)--->a,d,b,c,-,*,+a=1+3 ---> a=1
2017-05-08 17:23:13
2609
原创 Java基础知识总结(二)
1 数组产生的意义 与概念 (1)为了存储同种类型数据的多个值。 (2)数组可以看着是一个容器;数组既可以存储基本数据类型,也可以存储引用数据类型。2 数组的定义格式123数据类型[] 数组名 = new 数据类型[数组的长度]; int [] array = new in
2017-04-30 11:25:39
341
原创 java虚拟机(一)
栈:(1)java虚拟机栈是线程私有的,生命周期与线程相同;虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出入口(Java中main函数就是栈的起始点,也是程序的起始点)等信息。 (2)Java栈在保存局部变量时主要时保存基本数据类型的值;类的实例即对象的引用。 (3)由于进
2017-04-30 11:16:09
329
16、常用并发设计模式精讲(1).pdf
2024-02-28
jmm(1).zip
2024-02-28
disruptor.zip
2024-02-28
forkjoin.zip
2024-02-28
designpattern.zip
2024-02-28
15、CPU缓存架构详解&高性能内存队列Disruptor实战(1).pdf
2024-02-28
14、深入理解并发可见性、有序性、原子性与JMM内存模型(1).pdf
2024-02-28
11-线程池ThreadPoolExecutor底层原理源码分析(上)-周瑜.pdf
2024-02-28
13、线程池ForkJoinPool实战及其工作原理分析(1).pdf
2024-02-28
12-线程池ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf
2024-02-28
10、阻塞队列BlockingQueue实战及其原理分析.pdf
2024-02-28
9、并发容器(Map、List、Set)实战及其原理.pdf
2024-02-28
7、深入理解AQS独占锁之ReentrantLock源码分析(1).pdf
2024-02-28
6、JUC并发工具类在大厂的应用场景详解(1).pdf
2024-02-28
8、读写锁ReentrantReadWriteLock&StampLock详解.pdf
2024-02-28
2、导致JVM内存泄露的ThreadLocal详解
2024-02-28
从0开始深入理解并发、线程与等待通知机制
2024-02-28
Drools规则引擎技术分享
2023-11-12
分库分表+mysql+技术方案分享
2023-02-03
Kafka技术架构原理分享ppt
2022-06-09
关于#CUP利用不均衡#的问题,如何解决?
2024-03-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人