自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 BIO、NIO、AIO

文章目录同步 VS 异步同步异步阻塞 VS 非阻塞阻塞非阻塞同步阻塞 BIO设计原理具体实现同步非阻塞 NIO设计原理NIO + 单线程Reactor模式NIO + 多线程Reactor模式NIO + 主从多线程Reactor模式select、poll、epollselectpollepoll异步非阻塞 AIO同步 VS 异步同步和异步概念以 “调用者的行为方式” 做区分同步调用者发起一个调用后,主动等待被调用者返回的结果。异步调用者发起一个调用后,被动接收调用者结果。如回调函数,状态,消息等

2022-01-23 22:35:20 699

原创 CGLIB-多重代理

文章目录前言如何实现CGLIB与JDK动态代理相结合类Spring AOP方式前言这里所说的多重代理,是指代理的代理,即Proxy外再包一层Proxy。由于CGLIB本身的设计,无法实现在Proxy外面再包装一层Proxy(JDK Proxy可以),通常会报如下错误:......Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file target/MyTarget$$Enha

2021-12-10 01:13:42 1174 1

原创 静态代理与JDK动态代理

文章目录概述定义与结构静态代理软件设计原则动态代理JDK动态代理的一个简单例子JDK动态代理源码分析总结概述代理模式是一种常用的设计模式,在AOP、RPC等诸多框架中均有它的身影。根据代理类的创建时机和创建方式的不同,可以将其分为静态代理和动态代理两种形式:在程序运行前就已经存在的编译好的代理类是为静态代理,在程序运行期间根据需要动态创建代理类及其实例来完成具体的功能是为动态代理。代理模式的目的就是为真实业务对象提供一个代理对象以控制对真实业务对象的访问,代理对象的作用有:代理对象存在的价值主要

2021-12-10 01:06:52 502

原创 CGLIB动态代理

文章目录概述CGLIB组织结构CGLIB动态代理示例分析代理类分析FastClass 机制MethodProxy.invoke(Object obj, Object[] args)分析CGLIB动态代理碰到的问题问题1:异常Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type问题2问题3总结概述CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,

2021-12-10 01:04:50 3384 2

原创 NGINX平滑加权轮询算法

文章目录问题描述NGINX平滑加权轮询算法算法涉及的几个概念算法逻辑算法证明权重合理性平滑性问题描述有三个节点{a, b, c},它们的权重分别是{a=5, b=1, c=1},发送7次请求,要求:根据权重分配:a会被分配5次,b会被分配1次,c会被分配1次分配尽可能平滑:尽可能均匀的分摊节点,节点分配不再是连续的,如{a, a, a, a, a, b, c},即前5次可能选中的都是a,这可能造成权重大的服务器造成过大压力的同时,小权重服务器还很闲NGINX平滑加权轮询算法算法涉及的几个概念

2021-12-01 23:46:26 3087

原创 java正则表达式

文章目录匹配模式:贪婪、勉强、占有Greediness(贪婪型):最大匹配Reluctant(Laziness)(勉强型,又叫非贪婪型,忽略优先量词):最小匹配Possessive(占有型,占有优先量词):完全匹配X?+、X*+、X++、X{n,}+ 是完全匹配,在 Greediness 模式之后添加 + 就成完全匹配。 Possessive 模式与 Greediness 有一定的相似性,那就是都尽量匹配最大范围的内容,直到内容结束,但与 Greediness 不同的是,完全匹配不再回退尝试匹配更小的范

2021-11-26 00:47:01 725

原创 Collections.sort与Arrrays.sort

文章目录概述Collections.sortList.sort总结概述来看看Collections.sort与Arrrays.sort的排序算法,本文基于JDK1.8。Collections.sort容器工具类Collections.sort提供了以下几种方式:public static <T extends Comparable<? super T>> void sort(List<T> list) { list.sort(null);}publ

2021-11-26 00:45:37 582

原创 Java安全机制

文章目录启动安全策略使用java.security.AccessController#doPrivileged(java.security.PrivilegedAction)启动默认情况下,Java的安全模型是不启用的。为了使用Java的安全模型,需要通过初始化安全管理器(SecurityManager)来启用Java安全模型。编码式初始化SecurityManager// 获取安全管理器,如果安全管理器未安装,则返回nullSecurityManager manager = System.g

2021-11-26 00:43:58 3701

原创 TCP三次握手和四次挥手

文章目录三次握手握手过程问题为什么TCP客户端最后还要发送一次确认四次挥手挥手过程问题为什么客户端最后还要等待2MSL如果已经建立了连接,但是客户端突然出现故障了怎么办为什么建立连接是三次握手,关闭连接确是四次挥手三次握手握手过程TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;TCP客户进程也是先创建传输控制块TCB,然后主动向服务器发出连接请求报文,这是报文首部中的同步位SYN=1,同时选择一个初始序列号 seq=x ,此时,

2021-11-26 00:43:07 84

原创 HTTPS原理

文章目录概念HTTP访问过程HTTP 向 HTTPS 演化的过程对传输的信息进行对称加密对协商过程进行非对称加密怎样协商可以确定不同加密算法或密钥客户端怎么获取非对称加密公钥数字证书解决公钥被掉包问题数字证书数字签名客户端如何获取第三方机构公钥客户端如何获取数字证书总结概念HTTPS(HyperText Transfer Protocol over Secure Socket Layer)并不是一个新鲜的协议,可以理解为HTTP + SSL/TLS,即HTTP下加入SSL层,HTTPS的安全基础是SSL

2021-11-26 00:41:49 491

原创 HTTP缓存机制

文章目录强制缓存如何判断强制缓存数据是否失效ExpiresCache-Control对比缓存Last-Modified / If-Modified-SinceLast-ModifiedIf-Modified-SinceEtag / If-None-MatchEtagIf-None-Match优先级问题既然已经有了 Last-Modified 已经能够知道本地缓存是否是最新,为什么还需要 Etag ?总结Http 缓存机制是 web 性能优化的重要手段。HTTP缓存有多种规则,根据是否需要重新向服务器发起

2021-11-26 00:41:04 2041

原创 MYSQL问题:order by + limit分页时数据重复

MYSQL问题:order by + limit分页时数据重复

2021-11-26 00:35:46 1410

原创 数据库事务一致性问题和数据库隔离级别

文章目录数据库事务一致性问题第一类丢失修改脏读不可重复读第二类丢失修改幻读不可重复读与幻读的区别简述数据库的几种锁悲观锁使用性质分类共享锁(Share locks,S锁)排它锁(Exclusive locks,X锁)更新锁(U锁)意向锁(Intent locks,I锁)区间锁/间隙锁(gap locks)next-Key locks作用范围分类行锁表锁乐观锁版本号(version)时间戳(timestamp)待更新字段所有字段乐观锁几种方式比较数据库隔离级别READ_UNCOMMITTED(RU)锁分析RE

2021-11-26 00:34:26 991

原创 Redis持久化机制之RDB与AOF

文章目录Redis数据存储模式数据持久化的场景Redis持久化数据方式RDB优缺点持久化方式注意事项AOF优缺点持久化方式appendfsync同步频率的区别重写/压缩AOF文件验证RDB文件和AOF文件总结Redis数据存储模式Redis数据存储模式有两种:cache-only : 即只做缓存服务,不持久化数据,数据在Redis服务终止后将消失,此模式下也不存在数据恢复手段,是一种安全性低/效率高/容易扩展的数据存储模式;persistence : 内存中的数据持久化到磁盘文件,在Redis服务

2021-11-26 00:31:47 526

原创 git stash

文章目录git stashgit stash listgit stash pushgit stash cleargit stash drop stash@{num}git stash pop stash@{num}git stash apply stash@{num}git stashgit stash命令可临时保存和恢复被git跟踪的 工作区 or 暂存区 的修改,可跨分支。注:未被git跟踪的修改是不能被git stash临时保存git stash listdevelopmac@Develo

2021-11-26 00:30:16 105

原创 git add

git add将工作区的修改提交到暂存区git add . VS git add -A VS git add -u命令描述git add -u提交所有删除和修改的文件到暂存区git add .提交所有修改和新建的文件到暂存区git add -A提交所有删除、替换、修改和新增的文件到暂存区...

2021-11-25 00:19:58 107

原创 git diff

文章目录git diffgit diffgit diff --cached = git diff --stagedgit diff HEADgit diff <分支名1> <分支名2>git diff --stat具体某个文件的差异git diffgit diff显示工作区与暂存区之间的修改,即显示未被git add的修改注意:git diff能够显示的修改是要被git追踪的文件的修改,那些新增文件,未git add前,未被git追踪,git diff是无法显示其修改的De

2021-11-25 00:18:04 290

原创 Java-JNI调用过程

文章目录原理为什么需要JNI使用JNI的问题JNI调用过程实现环境1. Java native本地方法定义2. 生成native方法头文件3. 创建具体CPP文件4. 将CPP文件编译为动态链接库4. 测试总结原理Java本地方法(Native Method)通过JNI(Java Native Interface)提供的一系列API调用其他语言的函数实现的相对底层的功能。为什么需要JNI当需要实现的功能依赖操作系统底层的特性,单纯依靠Java无法独立完成,需要借助其他语言;保证Java在跨平台

2021-11-25 00:16:56 4596

原创 Java-写时复制CopyOnWrite

文章目录介绍核心思想应用Vector 和 Collections.SynchronizedXxxJUC下的新一代并发容器 VS java.util老一代并发容器CopyOnWriteArrayList原理基本定义写操作读操作迭代器性能:CopyOnWriteArrayList VS Collections.synchronizedList分析验证CopyOnWriteArrayList优缺点优点缺点介绍写时复制(Copy-on-write,COW,奶牛)是一种计算机程序设计领域的优化策略。核心思想多

2021-11-25 00:16:24 1265

原创 fastjson对泛型的反序列化

文章目录具体告警分析告警影响fastjson未指定泛型具体类型fastjson TypeReference指定泛型具体类型可以看到fastjson反序列化时IDEA提示告警Unchecked assignment,怎么解决这个告警?两种方案:在方法or局部变量使用注解@SuppressWarnings("unchecked")抑制IDEA的告警:显然这是个偷懒的做法。fastjson反序列化时使用TypeReference指定泛型的具体类型:public static void mai

2021-11-25 00:15:32 7002

原创 CAS单点登入登出原理

CAS集中式认证服务(Central Authentication Service,CAS),单点登录协议,允许一个用户访问多个应用程序,而只需要提供一次凭证。具体实现框架有:OAuth2,Shiro等。普通CAS1.0登入详细流程流程解析:(1-2) 用户第一次通过浏览器Browser访问受保护的应用系统app1,应用系统app1发现访问请求中没有JSESSIONID or ST(service ticket) ,要求Browser重定向去CAS service获取ST;在每个受

2021-11-25 00:14:05 909 4

原创 关于零拷贝

文章目录传统IO用户态/内核态是什么?上下文切换是什么?DMA是什么?零拷贝mmap + writesendfilesendfile + DMA Scatter/Gather应用场景总结传统IOFile.read(fileDesc, buf, len);Socket.send(socket, buf, len);以上述操作为例,底层实际上通过调用read()和write()来实现。如图所示,整个过程发生了4次用户态/内核态的上下文切换和4次拷贝:用户进程通过read()方法向操作系统发起调

2021-11-25 00:11:35 109

原创 缓存一致性问题

文章目录目标先操作缓存再操作数据库1. 先删缓存后更新数据库2. 普通双删3. 延时双删先操作数据库再操作缓存4. 先更新数据库后删缓存5. 消息队列6. 监听binlog的消费队列设置缓存过期时间为什么是删除缓存而不是更新缓存总结目标保证缓存和数据库数据一致性有缓存的查询一般是这样的:先查询缓存,缓存不存在,去查询数据库,然后将数据库的值放入缓存。先操作缓存再操作数据库1. 先删缓存后更新数据库先删缓存后更新数据库问题:先删除缓存后,数据库没有更新成功之前,此时读取缓存,缓存不存在,然后去读

2021-11-25 00:10:27 104

原创 关于Maven依赖冲突

文章目录Maven依赖冲突场景场景1-重构同包同名类场景2-同包同名类与环境兼容性场景3-同包同名类内部逻辑不同综上Maven依赖传递Maven依赖传递包选择逻辑-仲裁机制Maven scope属性Maven冲突处理工具Maven依赖树命令Maven依赖冲突解决排除冲突依赖父pom中统一管理版本Maven可选依赖总结Maven依赖冲突场景场景1-重构同包同名类假设有两个业务B和C依赖基础包A,后维护基础包A的团队重构基础包A,并打了一个新的基础包D发布。在一次业务改动时,业务B引入新的基础包D,在开

2021-11-25 00:08:56 702

原创 关于UUID

文章目录介绍组成Java实现介绍UUID(Universally Unique Identifier,通用唯一识别码),由32位16进制数字构成,二进制共128位。其目的是让分布式系统中的所有元素都能有唯一的识别信息。如此一来,每个人都可以创建不与其它人冲突的 UUID。组成UUID共有5部分组成:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx,表现形式为8-4-4-4-12的32个字符。如:df623885-68f9-47e0-b13c-bbd9600b6e711

2021-11-25 00:07:39 1723

原创 Java异常处理

文章目录必要性finally中释放资源 or 使用 try-with-resources方法声明指定可能抛出的具体异常对异常进行文档说明抛出异常时带上描述信息首先捕获最具体的异常不要捕获Throwable不要忽略异常不要记录后直接抛出异常包装异常时不要抛弃原始的异常必要性异常不仅仅是一个错误控制机制,也是一个沟通媒介,制定异常规范能够让每个人都理解相关的通用概念并且能够按照同样的方式使用它们,并提升代码的可阅读性和api的可用性。异常捕获前:资源释放/关闭放在finally中 or 使用try-w

2021-11-24 00:22:30 307

原创 Java-热加载实现

文章目录什么是热加载热加载 VS 热部署部署方式实现原理使用场景准备Java类加载机制加载验证准备解析初始化如何实现热加载自定义类加载器为啥需要自定义类加载器如何自定义类加载器定时监控类修改优化解决方案什么是热加载热加载是指可以在不重启服务的情况下让更改的代码生效。热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于***热加载的不安全性,一般不会用于正式的生产环境***。热加载 VS 热部署热加载和热部署,都可以在不重启服务的情况下编译/部署项目,都是基于 Ja

2021-11-24 00:20:54 1387 1

原创 Java-Thread.sleep(0)作用

文章目录CPU调度算法时间片抢占式Thread.sleep(n)Thread.sleep(0)CPU调度算法时间片Unix系统使用时间片算法。所有的进程排成一个队列,操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。抢占式Windows系统使用抢占式算法。假设有若干

2021-11-24 00:20:02 260

原创 Java反射性能探讨

文章目录反射是否影响性能为什么反射影响性能method.invoke & field.set 性能Class.getMethod & Class.getDeclareField 性能测试结论反射如何影响性能如何避免反射导致的性能问题其他问题反射是否影响性能为了放大问题找到共性,采用逐渐扩大测试次数(executeCount)、每次测试多次取平均值(averageCount)的方式。针对同一个属性分别就直接调用方法操作属性、反射调用方法操作属性、直接操作属性、反射操作属性,分别从1-100

2021-11-24 00:19:54 2766

原创 MySQL-IP存储方式

文章目录VARCHARUNSIGNED INTVARCHAR VS UNSIGNED INT应尽量使用 UNSIGNED INT如何使用 UNSIGNED INT 存储IPv4MySQL层IP字符串 -> 整数:INET_ATON()IP整数 -> 字符串:INET_NTOA()应用层如何存储IPv6MySQL层方案4-VARBINARY应用层VARCHAR在人类可读的格式中,IP地址是一个字符串,最小长度为 7 个字符 (0.0.0.0),最大长度为 15 个 (255.255.2

2021-11-24 00:04:24 631

原创 MySQL-索引回表 & 覆盖索引 & 索引下推

文章目录准备索引回表覆盖索引索引下推准备实验平台:MySQL 5.6.35,Engine:innodbinnodb引擎使用B+树维护 聚簇索引 和 非聚簇索引:聚簇索引:聚簇索引树非叶子节点存储主键值,叶子节点存储整行数据(包括主键);非聚簇索引:非聚簇索引树非叶子节点存储非聚簇索引(辅助索引)值,叶子节点存储非聚簇索引(辅助索引)值和聚簇索引(主键)值;索引回表当所要查找的字段不存在于非聚簇索引树上时,在非聚簇索引树上拿到对应的主键值,然后回到聚簇索引树上找到对应的行数据。覆盖索引

2021-11-24 00:04:17 220

原创 MySQL-索引选择

文章目录说明select count(*)验证如何衡量成本最小IO成本CPU成本举例说明全表扫描成本optimizer trace 验证说明实验平台:MySQL 5.6.35下文说明了 当where_clause条件查询时,MySQL未必会选择开发人员自认为的索引,MySQL会优化选择成本最小的方式,但这个成本最小并不一定准确,不一定时间短,可以通过执行计划explain和optimizer trace工具来协助优化查询语句。select count(*)select count(*) fro

2021-11-24 00:04:10 672

原创 MongoDB-ObjectId生成原理

文章目录ObjectId基础ObjectId组成4 byte 时间戳3 byte 机器哈希2 byte 进程id3 byte 自增计数ObjectId基础MongoDB ObjectId的一个例子60c468e6101bf215dc9fa835一个24个字符组成的字符串,每个字符都是一个16进制字符,因此总共 96 bit = 12 byteObjectId组成4 byte 时间戳(timestamp) + 3 byte 机器哈希(machine hash) + 2 byte 进程id(proce

2021-11-24 00:04:03 389

原创 一台Linux服务器可并发支撑多少TCP连接

文章目录目的TCP连接构成限制系统资源限制系统文件描述符限制系统内存限制CPU限制目的一台Linux服务器可并发支撑的TCP连接数和什么有关;支撑高并发TCP连接数要如何配置;TCP连接构成限制TCP连接四元组是 源IP地址、源端口、目的IP地址 和 目的端口。任意一个元素发生了改变,那么就代表的是一条完全不同的连接了。拿Nginx举例,它的端口是固定使用80,Nginx所属主机IP也是固定的,这样目的IP地址、目的端口都是固定的,剩下源IP地址、源端口是可变的。所以理论上Nginx上最多可

2021-11-24 00:03:56 2038

原创 跳表原理设计与实现

文章目录跳表介绍关于链表跳表优化思路具体实现跳表节点定义跳表定义查改删增跳表展示测试跳表介绍跳表(SkipList,全称跳跃表)是用于有序元素序列快速搜索查找的一个数据结构,跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。它在性能上和红黑树,AVL树不相上下,但是跳表的原理非常简单,实现也比红黑树简单很多。应用:**Redis的有序集合(zset) **关

2021-11-24 00:03:49 428

原创 MySQL-left join 后 on 和 where 的区别

文章目录区别具体说明表1:tab1表2:tab2left join on whereSQL过程left join on andSQL过程总结区别数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用A left join B on ... and ...时,on 和 where 条件的区别如下:on条件是在通过笛卡尔积生成临时表时使用的条件,它不会过滤结果记录条数,它不管on中的条件是否为真,都会返回A表中的记录,根据on后的条件是否为真显示B表的

2021-11-23 00:17:29 175

原创 http无状态之路

参考:漫画 | 干掉session,爽死了!

2021-11-23 00:17:20 89

原创 算法:并查集

文章目录操作并查集快速查询 quick find快速合并 quick union按秩合并的快速合并 rank quick union路径压缩操作合并(Union):把两个不相交的集合合并为一个集合;查询(Find):查询两个元素是否在同一个集合中。并查集重要思想:用集合中的一个元素代表集合快速查询 quick find/** * 并查集 * 快速查找 * id数组存放集合元素 */public class QuickFindTest { private static b

2021-11-23 00:17:13 73

原创 用户状态 push or pull

文章目录用户状态好友状态同步客户端定时轮询拉取服务端推送群友状态同步按需拉取用户状态最基本的:在线、离线等,更详细的:隐身、忙碌、勿扰等。客户端如何与服务端同步用户状态?好友状态同步客户端定时轮询拉取优点:实现简单,适用实时性要求不那么高的场景;缺点:定时轮询,非实时;一次性拉取用户所有好友的状态,但是可能很多好友的状态没发生变化,因此拉取较多的无用数据,甚至多次无效轮询,低效;服务端推送优点:实时性较高;消息针对性较高,只推送客户端关心的数据;缺点:当用户有较多好友时,

2021-11-23 00:17:04 89

原创 设计模式-外观(门面)模式

文章目录外观模式适用场景示例外观模式外观模式也叫门面模式,是一种结构性设计模式,封装各子模块、子系统、子服务的功能,统一外观给调用者调用。避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。客户端和其他外观都可使用附加外观。适用场景调用方需要和多个复杂子系统直接交互,可以使用外观模式提供简单的入口;调用方如果和多个子系统直接交互,意味着和这几个子系统耦合了,使用外观模式可以解耦;层次化结构中,层与层之间直接交互,使用外观模式,层与层之间通过外观交互,实现层与层之间的解耦;示例

2021-11-23 00:16:56 71

空空如也

空空如也

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

TA关注的人

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