2024年4月7日

摘要: 事件驱动:客户端消息是如何处理的 Redis 系列目录:https://www.cnblogs.com/binarylei/p/11721921.html 现在,我们开始学习新的请求处理模块。相信大家一定都听说过,Reids 之所以快,一个重要的原因就是 NIO 网络模型和单线程处理,我们就带着这个 阅读全文
posted @ 2024-04-07 21:57 binarylei 阅读(84) 评论(0) 推荐(0) 编辑

2024年3月31日

摘要: 缓存过期 Redis 系列目录:https://www.cnblogs.com/binarylei/p/11721921.html 缓存过期 Redis 缓存过期有 2 种策略,被动过期和主动过期。 被动过期删除:客户端访问 Redis 时,发现 key 已经过期,需要删除数据 主动过期删除:Red 阅读全文
posted @ 2024-03-31 11:49 binarylei 阅读(55) 评论(0) 推荐(0) 编辑

2022年7月4日

摘要: 新规 超速 | 车型 | 普通道路 | 扣分 | 高速公路 | 扣分 | | | | | | | | 小车 | 20%~50% | 3 | 20%~50% | 6 | | | 50%以上 | 6 | 50%以上 | 12 | | 大车 | 10%~20% | 1 | 20%以下 | 6 | | | 阅读全文
posted @ 2022-07-04 09:01 binarylei 阅读(450) 评论(0) 推荐(0) 编辑

2020年12月9日

摘要: Dubbo 架构演进:从 RMI 到 Dubbo 谈谈你对 Dubbo 的认知?对于这个问题,你是怎么回答的呢? 我们知道 Dubbo 是从 RPC 起家,到现在则已经发展成为一个微服务的治理框架。所以,要回好上面的问题,关键是二点:Dubbo 是如何进行 RPC 通信,二是 Dubbo 是如何进行 阅读全文
posted @ 2020-12-09 17:53 binarylei 阅读(1799) 评论(0) 推荐(3) 编辑

2020年4月6日

摘要: 网络编程原理目录 一、NIO 1.1 NIO 入门 Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter 和 Gather Java NIO系列教程(五) 阅读全文
posted @ 2020-04-06 20:30 binarylei 阅读(759) 评论(0) 推荐(0) 编辑
摘要: 关闭连接:本质是取消 Channel 在 Selelctor 的注册 [toc] __Netty 系列目录()__ 1. 主线分析 1.1 主线 关闭连接分两种:主动关闭(正常关闭)和被动关闭(异常关闭)。 多路复用器(Selector)接收到 OP_READ 事件 处理 OP_READ 事件:Ni 阅读全文
posted @ 2020-04-06 19:35 binarylei 阅读(1771) 评论(0) 推荐(0) 编辑
摘要: 发送数据:自适应写和连接写同样是为了解决什么问题 [toc] __Netty 系列目录()__ 发送数据和接收数据比较类似,可以将这两部分结合起来学习。 "接收数据:自适应缓冲区和连接读是为了解决什么问题" 1. 主线分析 1.1 写数据要点 和读数据一样,写数据我们也会碰到以下问题: 1. 每次写 阅读全文
posted @ 2020-04-06 17:15 binarylei 阅读(749) 评论(0) 推荐(0) 编辑
摘要: 处理业务:事件是如何在 pipeline 中传播的 [toc] __Netty 系列目录()__ 在上一节 "接收数据:自适应缓冲区和连接读是为了解决什么问题" 中,我们知道 NioEventLoop 不断的轮询,接收 OP_READ 事件;然后将读取到的数据通过 pipeline.fireChan 阅读全文
posted @ 2020-04-06 10:49 binarylei 阅读(1871) 评论(0) 推荐(1) 编辑
摘要: 接收数据:自适应缓冲区和连接读是为了解决什么问题 [toc] __Netty 系列目录()__ 到目前为止,我们已经启动服务,并接收了客户端连接,双方已经可以正式通信。下面就要处理请求:接收数据、业务处理、发送数据。 1. 主线分析 1.1 读数据技巧 接收数据我们会碰到以下问题: 1. 缓冲区大小 阅读全文
posted @ 2020-04-06 08:36 binarylei 阅读(922) 评论(0) 推荐(0) 编辑
摘要: 构建连接:NioSocketChannel 是什么时候激活的 [toc] __Netty 系列目录()__ 在上一节中,我们分析服务器的启动过程,接下来就是开门迎客。 1. 主线分析 1.1 主线 NioEventLoop 不断的轮询,接收 OP_ACCEPT 事件;ServerBootstrapA 阅读全文
posted @ 2020-04-06 08:30 binarylei 阅读(549) 评论(0) 推荐(0) 编辑

2020年3月31日

摘要: 指令和运算 编译、链接和装载之程序装载:640K内存真的不够用么 [toc] 计算机组成原理目录: 在前面几节中,我们已经知道高级语言通过编译、链表生成可执行文件,但这个可执行文件只有先被加载到内存中,才能被 CPU 执行。但问题是内存是有限的,如何加载越来越多的程序呢? 比尔·盖茨在上世纪 80 阅读全文
posted @ 2020-03-31 12:34 binarylei 阅读(455) 评论(0) 推荐(1) 编辑
摘要: 指令和运算 编译、链接和装载之静态链接:代码复用成为可能 [toc] 计算机组成原理目录: 在第一小节中,我们分析了高级语言通过编译和汇编后,最终翻译成计算机指令。之后的两个小节,我们又知道 CPU 是如何执行计算机指令,包括指令跳转和函数调用的实现原理。我们知道编译、链接和装载是程序执行的必不可少 阅读全文
posted @ 2020-03-31 10:58 binarylei 阅读(487) 评论(0) 推荐(0) 编辑
摘要: 指令和运算 指令执行之函数调用:函数调用和递归调用是怎么实现的 [toc] 计算机组成原理目录: 1. 为什么我们需要程序栈 1.1 示例 同样编译一下 function_example.c 文件后,使用 objdump 查看汇编指令: 我们把这个程序编译之后,objdump 出来。我们来看一看对应 阅读全文
posted @ 2020-03-31 10:46 binarylei 阅读(883) 评论(0) 推荐(0) 编辑
摘要: 指令和运算 指令执行之指令跳转:条件分支和循环语句是怎么实现的 [toc] 计算机组成原理目录: 在上一节中,我们分析了高级语言是如何翻译成计算机指令,本节内容则是分析 CPU 是如何执行这些计算机指令的。除了最简单的顺序执行外,指令跳转是如何实现的呢? 1. CPU 是如何执行计算机指令 现代 I 阅读全文
posted @ 2020-03-31 10:45 binarylei 阅读(2129) 评论(0) 推荐(0) 编辑
摘要: 指令和运算 计算机指令:高级语言是如何翻译成计算机指令 [toc] 计算机组成原理目录: 本小节聚焦在高级语言是如何翻译成机器码,以及机器码的格式。之后的两小节则深入讲解 CPU 如何执行条件、循环、函数、递归这些完整的语句。 1. 机器码 vs 计算机指令 计算机只认知 "0" 和 "1",那我们 阅读全文
posted @ 2020-03-31 09:55 binarylei 阅读(2856) 评论(1) 推荐(1) 编辑
摘要: 计算机组成 性能指标:通过 CPU主频谈谈性能究竟是什么 [toc] 计算机组成原理目录: 1. 性能 = 1 / 响应时间 响应时间(Response time)或者叫执行时间(Execution time) 吞吐率(Throughput)或者带宽(Bandwidth) 2. 计算机的计时单位:C 阅读全文
posted @ 2020-03-31 09:44 binarylei 阅读(3615) 评论(0) 推荐(0) 编辑
摘要: 计算机组成 冯·诺依曼体系结构 [toc] 计算机组成原理目录: 计算机组成原理在整个计算机课程中的地位如下图所示: 图1:计算机体系结构 计算机组成原理这门课会围绕冯·诺依曼体系的五大组成部分展开,分别介绍运算器、控制器、存储器、输入设备和输出设备。 1. 冯·诺依曼体系结构 冯·诺依曼体系结构( 阅读全文
posted @ 2020-03-31 09:42 binarylei 阅读(3411) 评论(0) 推荐(0) 编辑
摘要: 存储器 I/O 性能指标:如何理解 IOPS [toc] 计算机组成原理目录: 1. I/O 性能指标 IO 性能、顺序访问和随机访问如果去看硬盘厂商的性能报告,通常会看到以下指标。 1. 响应时间(Response Time):程序发起一个硬盘的写入请求,直到这个请求返回的时间。 2. 数据传输率 阅读全文
posted @ 2020-03-31 09:40 binarylei 阅读(2446) 评论(0) 推荐(0) 编辑

2020年3月30日

摘要: 存储器 总线:计算机内部的高速公路 [toc] 计算机组成原理目录: 本文主要梳理计算机里不同的组件之间的通信问题,也就是总线机制。总线的设计思路,核心是为了减少多个模块之间交互的复杂性和耦合度。实际上,事件总线是一个常见的设计模式,通常事件总线也会和订阅者发布者模式结合起来,成为大型系统的各个松耦 阅读全文
posted @ 2020-03-30 20:24 binarylei 阅读(1070) 评论(0) 推荐(1) 编辑
摘要: 存储器 内存:程序的虚拟内存是如何映射到物理内存 [toc] 计算机组成原理目录: 程序运行时,指令和数据都需要先加载到内存里面,才会被 CPU 拿去执行。那程序中的虚拟地址最终是如何映射到内存中的物理地址呢?从简单页表,到多级页表,再到 TLB,都解决了那些问题? 1. 简单页表:类似数组,时间复 阅读全文
posted @ 2020-03-30 20:22 binarylei 阅读(7200) 评论(1) 推荐(6) 编辑

2020年3月29日

摘要: 存储器 缓存一致性 MESI 协议:如何让多核CPU的高速缓存保持一致 [toc] 计算机组成原理目录: 在上一篇 "存储器 高速缓存(CPU Cache):为什么要使用高速缓存" 中,我们分析了高速缓存(CPU Cache) 的数据结构,及如何进行读写操作。在写操作时,可以通过使用写回策略替换直接 阅读全文
posted @ 2020-03-29 08:01 binarylei 阅读(1904) 评论(0) 推荐(1) 编辑

2020年3月28日

摘要: 存储器 高速缓存(CPU Cache):为什么要使用高速缓存? [toc] 计算机组成原理目录: 1. 为什么需要高速缓存 CPU 和内存访问性能的差距非常大。如今,一次内存的访问,大约需要 120 个 CPU Cycle。这也意味着,在今天,CPU 和内存的访问速度已经有了 120 倍的差距。 C 阅读全文
posted @ 2020-03-28 19:43 binarylei 阅读(8630) 评论(2) 推荐(3) 编辑
摘要: 存储器 金字塔层次结构:越靠近CPU速度越快,容量越小,价格越贵 [toc] 计算机组成原理目录: 1. 金字塔层次结构 现代计算机的存储设备一般有 Cache、内存、HDD(SSD) 硬盘。这些存储设备越靠近 CPU 速度越快,容量越小,价格越贵。 寄存器(Register):寄存器与其说是存储器 阅读全文
posted @ 2020-03-28 19:40 binarylei 阅读(11167) 评论(1) 推荐(3) 编辑
摘要: 计算机组成原理目录 本文是极客时间 "《深入浅出计算机组成原理》" 的学习笔记,感兴趣的可以订阅正版。 1. [基础概念] [1.0 计算机组成原理怎么学] "1.1 计算机组成 冯·诺依曼体系结构" "1.2 计算机组成 性能指标:通过 CPU主频谈谈性能究竟是什么" 2. [指令和运算] "2. 阅读全文
posted @ 2020-03-28 08:04 binarylei 阅读(1902) 评论(0) 推荐(1) 编辑

2020年3月23日

摘要: 锁原理 AQS 源码分析:有了 synchronized 为什么还要重复造轮子 [toc] 并发编程之美系列目录: 在前两篇文章中,我们主要是分析在并发编程问题上,计算机硬件、操作系统和编程语言分别提供了那些支持: 1. 计算机硬件: CAS 原子操作是基于已有的状态更新成另一个状态,如 count 阅读全文
posted @ 2020-03-23 21:20 binarylei 阅读(3455) 评论(2) 推荐(1) 编辑

2020年3月22日

摘要: 锁原理 信号量 vs 管程:JDK 为什么选择管程 [toc] 并发编程之美系列目录: 管程和信号量都能解决并发问题,它们是等价的。所谓等价指的是用管程能够实现信号量,也能用信号量实现管程。但是管程在信号量的基础上提供条件同步,使用更容易,所以 Java 采用的是管程技术。synchronized 阅读全文
posted @ 2020-03-22 08:29 binarylei 阅读(7720) 评论(4) 推荐(10) 编辑

2020年3月20日

摘要: 并发编程 可见性、原子性和有序性问题:并发编程 Bug 的源头 [toc] 并发编程之美系列目录: 本文是并发编程的第一篇,主要介绍为什么需要并发编程,同时分析并发编程问题的根本原因 可见性、原子性和有序性三个方面。下一章我们会继续分析 JVM 是如何解决这三个问题。 1. 并发程序幕后的故事 为什 阅读全文
posted @ 2020-03-20 18:38 binarylei 阅读(556) 评论(0) 推荐(0) 编辑

2020年3月13日

摘要: Java 算法 跳表:为什么 Redis 一定要用跳表来实现有序集合? [toc] __数据结构与算法之美目录()__ 推荐文章: √《 "Skip Lists: A Probabilistic Alternative to Balanced Trees" 》 "【Redis 源码分析 skipli 阅读全文
posted @ 2020-03-13 09:58 binarylei 阅读(1602) 评论(0) 推荐(0) 编辑

2020年3月10日

摘要: Java 数据结构 HashMap 源码解读:如何设计工业级的散列表 [toc] __数据结构与算法目录()__ 在 "Java 数据结构 散列表原理" 一文中,提到评价一个散列表的标准有三个:散列函数、散列冲突、加载因子(动态扩容)三个指标。那像 HashMap 这样工业级的散列表应该具有哪些特性 阅读全文
posted @ 2020-03-10 13:23 binarylei 阅读(455) 评论(0) 推荐(0) 编辑

2020年3月7日

摘要: Java数据结构 散列表原理 [toc] __数据结构与算法目录()__ 散列表(Hash table) 也叫哈希表,借助散列函数对数组进行扩展,利用的是数组支持按照下标随机访问元素的特性。散列表两个核心问题是散列函数和散列冲突。散列函数有 MD5、SHA、CRC 等哈希算法。散列冲突开放寻址法和链 阅读全文
posted @ 2020-03-07 09:56 binarylei 阅读(838) 评论(1) 推荐(0) 编辑

2020年3月6日

摘要: Java 算法 二分法查找 [toc] __数据结构与算法之美目录()__ 二分法查找是一种非常高效的查找方式,时间复杂度为 O(logn)。 唐纳德·克努特(Donald E.Knuth)在《计算机程序设计艺术》的第 3 卷《排序和查找》中说到:"尽管第一个二分查找算法于 1946 年出现,然而第 阅读全文
posted @ 2020-03-06 15:32 binarylei 阅读(4182) 评论(0) 推荐(2) 编辑
摘要: Java 排序算法 线性排序:桶排序和基数排序 [toc] __数据结构与算法目录()__ 前面我们介绍了时间复杂度分为 O(n2) 和 O(nlogn) 的排序算法,本文介绍的则是复杂度分为 O(n) 的排序算法:桶排序和基数排序。线性排序时间、空间复杂度分析起来也很简单,但是对要排序的数据要求很 阅读全文
posted @ 2020-03-06 15:27 binarylei 阅读(650) 评论(0) 推荐(0) 编辑

2020年3月5日

摘要: Java 排序算法 为什么快速排序要比归并排序更受欢迎呢? [toc] __数据结构与算法目录()__ 上一节分析了冒泡排序、选择排序、插入排序这三种排序算法,它们的时间复杂度都是 O(n2),适合小规模数据排序。今天,本文继续分析两种时间复杂度为 O(nlogn) 的排序算法:归并排序和快速排序。 阅读全文
posted @ 2020-03-05 13:52 binarylei 阅读(4739) 评论(0) 推荐(0) 编辑
摘要: Java 排序算法 为什么插入排序要比冒泡排序更受欢迎呢 [toc] __数据结构与算法之美目录()__ 对于大多数程序员来说,我们学习的第一个算法,可能就是排序。大部分编程语言中,也都提供了排序函数。在平常的项目中,我们也经常会用到排序。排序算法太多了,有很多可能连名字都没听说过,比如猴子排序、睡 阅读全文
posted @ 2020-03-05 09:29 binarylei 阅读(1357) 评论(0) 推荐(0) 编辑

2020年3月3日

摘要: Java 算法 递归算法 [toc] __数据结构与算法之美目录()__ 递归本质是借助栈的数据结构,加上一个简单的逻辑算法实现。 递归是一种应用非常广泛的算法,很多数据结构和算法都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。所以,搞懂递归非常重要,否则,后面复杂一些的数据结构和 阅读全文
posted @ 2020-03-03 21:07 binarylei 阅读(1368) 评论(0) 推荐(0) 编辑
摘要: Java 数据结构 队列 [toc] __数据结构与算法目录()__ 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的。 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构。使用队列时,在一端插入元素,而在另一端删除元素。 1.1 队列的主要特性 队列中的数据元素遵守 阅读全文
posted @ 2020-03-03 17:51 binarylei 阅读(568) 评论(0) 推荐(0) 编辑
摘要: Java 数据结构 栈 [toc] __数据结构与算法之美目录:__ 我们今天要讲的数据结构是栈,比如浏览器的前进后退功能就可以用栈来实现。 1. 什么是栈 栈是一种先进后出的线性存储结构,先进先出就是队列结构。 栈(stack)是限制插入和删除只能在一个位置上进行的线性表,该位置是表的末端,叫作栈 阅读全文
posted @ 2020-03-03 09:05 binarylei 阅读(480) 评论(0) 推荐(0) 编辑

2020年2月22日

摘要: Java 数据结构 数组 [toc] __数据结构与算法目录()__ 1. 什么是数组 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 1. 线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前 阅读全文
posted @ 2020-02-22 14:10 binarylei 阅读(513) 评论(0) 推荐(0) 编辑

2020年2月21日

摘要: Spring 注解原理(二)AutowiredAnnotationBeanPostProcessor:@Autowired @Value @Inject @Lookup [toc] __Spring 系列目录()__ AutowiredAnnotationBeanPostProcessor 是 Sp 阅读全文
posted @ 2020-02-21 17:09 binarylei 阅读(2784) 评论(2) 推荐(0) 编辑

2020年2月20日

摘要: Spring IoC 依赖注入(三)resolveDependency [toc] resolveDependency 是 Spring 进行依赖查找的核心 API。弄明白了 resolveDependency,基本上依赖注入的问题也就搞明白了一半。resolveDependency 本质是根据类型 阅读全文
posted @ 2020-02-20 19:45 binarylei 阅读(5426) 评论(3) 推荐(7) 编辑

导航