
架构
平静不绝望
ALOHA HEJA HE
-
原创 【LongAdder】Sentinel 使用的黑科技
LongAdder 源码LongAdder 到底用了什么黑科技能做到高性比 AtomicLong 还要好呢呢?对于同样的一个 add() 操作,上文说到 AtomicLong 只对一个 Long 值进行 CAS 操作。而 LongAdder 是针对 Cell 数组的某个 Cell 进行 CAS 操作 ,把线程的名字的 hash 值,作为 Cell 数组的下标,然后对 Cell[i] 的 long 进行 CAS 操作。简单粗暴的分散了高并发下的竞争压力。add() 操作步骤:如果 cells.2021-03-03 19:02:2451
0
-
原创 【红黑树】红黑树特征,哪里在用?为什么redis skiplist没有使用?
1 特征定义上两个图2 红黑树使用 java 8 hashMap 和 concurrentHashMap 都在使用3为什么redis skiplist没有使用 ? 看看作者怎么说吧? 1They are not very memory intensive,lessmemory intensive than btrees 内存不敏感 2 A sorted set is often target of many ZRANGE or ZREVRAN...2021-03-03 15:20:4328
2
-
原创 【设计】短链服务
1 文章结构原理 常用算法 小结2 短链基本原理: 当我们输入http://xxx/abc后DNS 首先解析获得 http://xxx 的 IP 地址 当 DNS 获得 IP 地址后,会向这个地址发送 GET 请求,查询短码 abc http://xxx 服务器上运行的服务会通过短码 abc 获取其原本的 URL 请求通过 Http 重定向(302)跳转到对应的长 URL,即可以正常访问啦重定向又分 301(永久重定向)和 302(临时重定向)。由于短地址一经生成就不会变化...2021-03-02 20:40:208
0
-
原创 【LRU】LinkedHashMap 实现 LRUCache
1 结构示意图2 源码实现package classloader.lc;import java.util.LinkedHashMap;import java.util.Map;/** * LinkedHashMap实现Map的接口,和HashMap不同的是维持了一个所有entries的双向链表, * 并持有一个该有序链表的迭代器,并有两个Entry<K,V>引用transient LinkedHashMap.Entry<K,V> head,tail..2021-02-25 15:08:0719
0
-
原创 【Mysql】意向锁
1 意向锁为什么要存在?意向锁主要是解决:表级锁 和 行锁(其他排它锁如间隙锁,next key gap锁)共存问题;2 举例说明事务A锁住了表中的行锁。事务B申请整个表的写锁,表级锁。为了保证A释放后,B才能获取锁,如何让B事务堵塞等待呢?数据库要怎么判断这个冲突呢?1:判断表是否已被其他事务用表锁锁表2:判断表中的每一行是否已被行锁锁住。但是2这一步时间复杂度实在是太高了,因为需要遍历整个表。于是出现了 意向锁。在意向锁存在的情况下,事务A必...2021-02-24 09:35:0114
0
-
原创 【charles】charles https还是unknown 解决办法
1 charles mac 端安装证书-->client 端安装证书, https还是unknown 解决办法!2 配置通配符 *.*:*2021-02-23 11:24:5015
0
-
原创 【netty与rpc】quick review rpc netty4 dubbo 同步转异步 all-in-one 知识库
1 Netty 原理Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞 的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。2 Netty 高性能在 IO 编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者 IO 多路复用技术 进行处理。IO 多路复用技.2021-02-20 17:48:3434
1
-
原创 【Mysql】quick review 分布式事务 存储 redo undo all-in-one
1 存储引擎存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated1.1 InnoDB(B+树):InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page,page大小是固定的, 一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。适用场景: 经常更新的表,适合处理多重并发的更新请求。 支持事务。 可以从灾难中恢复(通过 bin-log 日志等) 外键约束。只有他支持外键2021-02-19 18:40:1048
1
-
原创 【Spring】JSR-250 对Bean的生命周期影响@PostConstruct 、@PreDestroy
1 面试细节源码(生命周期:初始化如何完成的?)由上图初始化部分,跟进得到继续跟进初始化 invokeInitMethods 方法2 初始化小结1 初始化顺序一定是:@PostConstruct--->InitializingBean#afterPropertiesSet() -->自定义init-method 2 关于@PostConstruct 、@PreDestroy 来自 JSR-250 特征 3 参考UML图3 面试细节源码(生命周期:销毁方法如何注册2021-02-19 11:31:1226
0
-
原创 【Thread】Thread并发知识 JUC all-in-one
1 并发知识库2 JAVA 线程实现/创建方式继承Thread类,native start()方法; 实现Runnable接口(自己的类已经extends 另一个情况,new Thread()); ExecutorService、Callable<Class>、Future 有返回值线程(有返回值的任务必须实现 Callable 接口,类似的,无返回值的任务必须 Runnable 接口) 基于线程池的方式(线程和数据库连接这些资源都是非常宝贵的资源。那么每次需要的时候创建,不需2021-02-18 14:49:1943
0
-
原创 【ClassLoader】 类加载器all-in-one
1 类加载器的代理模式--Java 类是否相同两个类是由不同的类加载器实例来加载的,因此不被 Java 虚拟机认为是相同的。了解了这一点之后,就可以理解代理模式的设计动机了。代理模式是为了保证 Java 核心库的类型安全。所有 Java 应用都至少需要引用java.lang.Object类,也就是说在运行的时候,java.lang.Object这个类需要被加载到 Java 虚拟机中。如果这个加载过程由 Java 应用自己的类加载器来完成的话,很可能就存在多个版本的java.lang.Obj...2021-02-17 21:01:3139
0
-
原创 【zookeeper】一致性协调中间件
1 是什么?Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。 Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但 只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控与通知机制。Zookeeper 集群是一个基于主从复制的高可用集群.2 角色?LeaderLeader: 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader,它会发起并维护与各 F2021-02-17 18:37:0471
0
-
原创 【2020】年终总结-佩奇OFFER
1 收获: 较为完整的搭建了推荐系统,增强了业务sense,对关键的技术挑战有沉淀,并针对系统性能进行了持续优化,思路清晰,对用的基础技术原理也有一定的学习和理解。2 不足:对于一些服务的基础技术原理了解还不是很深。------待更新-------...2021-02-09 19:33:1338
0
-
原创 【限流】常用算法
1、漏桶算法漏桶作为计量工具(The Leaky Bucket Algorithm as a Meter)时,可以用于流量整形(Traffic Shaping)和流量控制(TrafficPolicing),漏桶算法的描述如下:● 一个固定容量的漏桶,按照常量固定速率流出水滴;● 如果桶是空的,则不需流出水滴;● 可以以任意速率流入水滴到漏桶;● 如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。可见这里有两个变量,一个是桶的大小,支持流量突发增多时可以存多少的水(b2021-02-15 09:03:0829
0
-
原创 【ALGO】快速排序算法复习
1 循环不变量import java.lang.reflect.Array;public class quickSort { private static final int[] array = new int[]{9,-8,7,6,500,1,2,3,4}; public static void quickSort(int[] array, int begin, int end){ if(begin >= end){ ...2021-02-13 13:24:5867
3
-
原创 【dubbo】dubbo bio nio socket netty 等方式调用dubbo server 附源码
1 该源码包含了 tcp 调用dubbo server的多种实现,以及dubbo协议的分析。2 主要包含:原生API,原生泛型,NIO Client, BIO Client 标准或者泛型方法的调用代码。 public static void main(String[] args) { // 当前应用配置 ApplicationConfig application = new ApplicationConfig(); applicati2021-02-07 11:57:5047
0
-
原创 【事件通知机制epoll】 epoll - I/O event notification facility 水平触发以及边缘触发存在的问题?
1 背景:分析epoll系统调用2 工具:使用strace分析 zk 客户端连接时,server发生的系统调用bin/zkCli.sh -server 172.16.208.137:2181 和zkserver连接以后3 监控分析过程:3.1 连接事件如下3.2 对于epoll_data疑惑:3.3op类型3.4events:(边缘处罚和水平出发,默认是level Triggerd)3.5 查看man手册第七部分 man 7 epoll...2021-02-06 11:13:1726
0
-
原创 【不懂就画,一千零一夜】dubbo 2.7.+ RPC 过程(全程图示)
1 Dubbo的RPC概览(其中包含 consumer provider registry netty 主从网络模型等核心模块)2 RPC 数据流--流程3 客户端启动4 服务端启动2021-02-06 10:01:1334
0
-
原创 [OS] IO 堵塞VS非堵塞 同步VS异步
自己认为最明确的答案:异步IO模型 -->异步模型:不需要自己去读IO数据,即 AIO, 通知并主动执行回调任务,业务thread不需要自己执行; 同步IO模型 -->同步模型:自己去读IO数据, BIO (poll,selector,epoll等多路复用器也是同步IO模型) 堵塞:thread线程被挂起,等待IO完成 非堵塞:thread 用户线程调用method 立马返回,通常-1无数据,或者ready的数据;...2021-02-02 23:42:1027
0
-
原创 [AQS] ArrayBlockingQueue put AQS signal 源码分析
1 put堵塞操作 (区分 offer(E e)非堵塞以及 中间状态 offer(E e, long timeout, TimeUnit unit))// 有异常addpublic boolean add(E e) { if (offer(e)) return true; else throw new IllegalStateException("Queue full");}2 源码分析 /** * Inserts t...2021-02-01 11:23:1027
0
-
原创 [AQS] ArrayBlockingQueue take AQS await 源码分析
1 take堵塞操作 (区分 poll() 非堵塞以及 中间状态 poll(long timeout, TimeUnit unit))2 源码分析public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while (count == 0) notEmpt..2021-02-01 11:00:0536
0
-
原创 [AQS]AQS 中断响应和不可中断 CLH 队列 对比
1 AQS 中断响应和不可中断 CLH 队列变化对比2 模拟第二种情况,中断响应public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException以java.util.concurrent.locks.AbstractQueuedSynchronizer#doAcquireNanos 为例,响应中断方式获取时.如果超时返回false,并执行java.util.concurrent.locks.Abst2021-01-31 15:35:0747
0
-
原创 【线程池】java 1.8 ThreadPoolExecutor 类源码解读
1 线程池:why?主要解决1 异步任务 2 生产者消费者场景2 参数详解2.1 核心线程数// 小于核心线程数:任务提交时创建新的线程,即使其他线程空闲;When a new task is submitted in method {@link #execute(Runnable)}, and fewer than corePoolSize threads are running, a new thread is created to handle the request, eve..2021-01-30 16:52:5959
2
-
原创 【jvm】中断深入理解,线程池,AQS都在使用的利器
1 线程中断:java中对于中断的大部分操作无外乎以下两点:设置或者清除中断标志位(对运行状态线程需要自检,堵塞状态会抛出异常) 抛出InterruptedException2 设置中断直接看源码 :对上面的两个操作说的很清晰了 /** * Interrupts this thread. * * <p> Unless the current thread is interrupting itself, which is * al2021-01-30 12:38:3057
0
-
原创 【volatile】Java内存模型-volatile型变量的特殊规则
1 是什么?关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制2 特征是什么?什么功能?使用场景?业务上怎么用?当一个变量被定义成volatile之后,它将具备两项特性: 第一项是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知 的。而普通变量并不能做到这一点,普通变量的值在线程间传递时均需要通过主内存来完成。比如, 线程A修改一个普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回写完成了...2021-01-30 02:20:2048
0
-
原创 【jvm】HotSpot的算法细节实现
1根节点枚举 我们以可达性分析算法中从GC Roots集合找引用链这个操作作为介绍虚拟机高效实现的第一个例 子。固定可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如 栈帧中的本地变量表)中,尽管目标明确,但查找过程要做到高效并非一件容易的事情。现在可达性分析算法耗时 最长的查找引用链的过程已经可以做到与用户线程一起并发。但根节点枚举始终还 是必须在一个能保障一致性的快照中才得以进行——这里“一致性”的意思是整个枚举期间执行子系统 看起来就像被冻结在某个时...2021-01-30 01:50:4345
0
-
原创 【jvm】垃圾收集算法
1分代收集理论当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection) 的理论进 行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分 代假说之上:1)弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。 2)强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消 亡。 3)跨代引用假说(Intergen.2021-01-30 01:32:2544
0
-
原创 【jvm】Java内存区域与内存溢出异常
1概述C、C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”, 又是从事最基础工作的劳动人民——既拥有每一个对象的“所有权”,又担负着每一个对象生命从开始 到终结的维护责任。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对 的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不 过,也正是因为Java程序员把控制内存的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问 题,如.2021-01-30 01:15:1643
0
-
原创 【CMS】垃圾收集-经典垃圾收集器Concurrent Mark Sweep 详解
1. 介绍CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很 大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为 关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非 常符合这类应用的需求。从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于标记-清除算法实现的,它的运作 过程相对于前面几种收集器来说要更复杂一些,整个过程分为四个步骤,包括..2021-01-30 00:47:3649
0
-
原创 【一千零一夜,不懂就画】redis 5.0 List 内存结构图
对应源码 struct redisCommand { char *name; // "lrange" redisCommandProc *proc; // lrangeCommand int arity; ..2021-01-29 15:34:3045
0
-
原创 【redis】3.2.8rehash存在的隐患,最新5.0+版本的改进-源码分析
此文链接至美团2021-01-29 08:56:2950
0
-
原创 【Nacos】nacos @NacosValue 动态配置刷新 源码解析
1 原理思想Nacos 采用的是 Pull 模式,但并不是简单的 Pull,而是一种长轮训机制,它结合 Push 和 Pull 两者的优势。客户端采用长轮训的方式定时发起 Pull 请求,去检查服务端配置信息是否发生了变更,如果发生了变更,则客户端会根据变更的数据获得最新的配置。所谓的长轮训,是客户端发起轮训请求之后,服务端如果有配置发生变更,就直接返回,如图所示。如果客户端发起 Pull 请求后,发现服务端的配置和客户端的配置是保持一致的,那么服务端会先 “Hold” 住这个请求,也就是服务端拿到2021-01-28 01:04:2899
0
-
原创 【Hash】loadbalance 一致性hash算法线上应用
1 小结:小心处理链接泄露问题 listener 监听更新要可能早于注入更新(可能是一定) 权重每次重分布都要更新2 源码:import com.alibaba.nacos.api.NacosFactory;import com.alibaba.nacos.api.config.ConfigService;import com.alibaba.nacos.api.config.annotation.NacosValue;import com.alibaba.nacos...2021-01-26 20:15:0836
0
-
原创 【mysql】 SQLException: Unable to load authentication plugin ‘caching_sha2_password‘.
Exception in thread "main" java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.如果是mysql 8.0<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</arti.2021-01-22 14:22:2235
0
-
原创 【ACID】C不属于ACID,一致性不属于ACID,为什么?
1 C 的含义The word consistency is terribly overloaded:重载含义四个• Replica consistency and the issue of eventual consistency that arises in asynchronously replicated systems . • Consistent hashing is an approach to partitioning that some systems use for rebal2021-01-21 09:12:1056
1
-
原创 【JVM】JDK 15 Disable and Deprecate Biased Locking 禁用和弃用偏向锁(终于废弃了偏向锁)
Disable and Deprecate Biased Locking 禁用和弃用偏向锁定1 结论Disable biased locking by default, and deprecate all related command-line options.默认情况下禁用偏向锁定,并弃用所有相关的命令行选项。2 GoalsDetermine the need for continued support of the legacy(传统) synchronization optim2021-01-19 19:43:1059
0
-
原创 【分布式技术】--分布式事务Seata-2
1 分布式事务seata just do it by yourself, keep in mind.https://github.com/seata/seata-samples/tree/master/springboot-dubbo-seata2 部署结果// http://172.16.208.224:8848/nacos/index.html#/serviceManagement?serverId=center&group=&dataId=&namesp2021-01-19 07:15:37128
0
-
原创 【nacos】springboot @Value @NacosValue 使用时可能无效
1 @NacosValue 自动刷新环境依赖版本<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativeP2021-01-13 08:16:22482
9
-
原创 【不懂就画一千零一夜】iftop 网络量分析利器
2021-01-08 18:06:3232
0
-
原创 【ZGC】G1停顿40ms很不错了?NO ZGC 10ms内! 厉害
1 系统环境os centos 8.1, jvm jdk hotspot 11, kernel (yum info kernel -q) Version : 4.18.0 2 最终配置流程: A:openjdk 11 install sudo yum install java-11-openjdk-devel sudo alternatives --config java B: 设置环境变量 cat > /etc/profile.d/java...2021-01-06 14:47:3548
0