- 博客(483)
- 资源 (8)
- 收藏
- 关注
原创 【分布式】分布式事务
尽管提交阶段时间很短,但这仍是一段明确存在的危险期,如果协调者在发出准备指令后,根据收到各个参与者发回的信息确定事务状态是可以提交的,协调者会先持久化事务状态,并提交自己的事务,如果这时候网络忽然断开,无法再通过网络向所有参与者发出Commit指令的话,就会导致部分数据(协调者的)已提交,但部分数据(参与者的)未提交,且没有办法回滚,产生数据不一致的问题。TCC 事务具有较强的隔离性,避免了“超售”的问题,而且其性能一般来说是本篇提及的几种柔性事务模式中最高的,但它仍不能满足所有的场景。
2024-11-29 17:10:15
1082
1
原创 【分布式】如何理解远程服务调用RPC?
远程服务将计算机程序的工作范围从单机扩展至网络,从本地延伸至远程,是构建分布式系统的首要基础。//远程服务调用(Remote Procedure Call,RPC)
2024-10-24 18:57:22
992
原创 Java中的锁机制:ReentrantLock 和 synchronized
所谓锁的升级、降级,就是 JVM 优化 Synchronized 运行的机制,当 JVM 检测到不同的竞争状况时,会自动切换到适合的锁实现,这种切换就是锁的升级、降级。当没有竞争出现时,默认会使用偏斜锁。JVM 会利用 CAS 操作(compare and swap),在对象头上的 Mark Word 部分设置线程 ID,以表示这个对象偏向于当前线程,所以并不涉及真正的互斥锁。这样做的假设是基于在很多应用场景中,大部分对象生命周期中最多会被一个线程锁定,使用偏斜锁可以降低无竞争开销。
2024-09-30 18:05:13
778
原创 Redis 哨兵挂了,主从库还能切换吗?
通常,我们在解决一个系统问题的时候,会引入一个新机制,或者设计一层新功能,就像 redis 为了实现主从切换,引入了哨兵;为了避免单个哨兵故障后无法进行主从切换,以及为了减少误判率,又引入了哨兵集群;哨兵集群又需要有一些机制来支撑它的正常运行。基于 pub/sub 机制的哨兵集群组成过程;基于 INFO 命令的从库列表,这可以帮助哨兵和从库建立连接;基于哨兵自身的 pub/sub 功能,这实现了客户端和哨兵之间的事件通知。对于主从切换,当然不是哪个哨兵想执行就可以执行的,否则就乱套了。
2024-08-27 15:35:00
1127
原创 Redis 中的 String,为什么不好用了?
redis 中 String 并非“万金油”,在什么场合都适用。如果在保存的键值对本身占用的内存空间不大时(例如这节课里提到的的图片 ID 和图片存储对象 ID),String 类型的元数据开销就占据主导了,这里面包括了 RedisObject 结构、SDS 结构、dictEntry 结构的内存开销。针对这种情况,我们可以使用压缩列表保存数据。
2024-07-30 13:53:18
1087
原创 【索引】数据库索引之散列索引
顺序文件组织的一个缺点是我们必须访问索引结构来定位数据,或者必须使用二分法搜索,这将导致过多的 I/O 操作。基于散列(hashing)技术的文件组织使我们能够避免访问索引结构。//使用散列可以减少查找的次数。所谓散列,其实就是键值对的映射,而映射效果由散列函数决定在散列中,散列桶(bucket)用来表示能存储一条或多条记录的一个存储单位。通常一个桶就是一个磁盘块,但也可能小于或大于一个磁盘块。
2024-06-27 20:01:52
1139
原创 【索引】数据库索引之顺序索引
聚簇索引的数据和索引存储在一个文件中, 它的叶子节点包含实际的数据记录本身,而不是指向数据记录的指针。这不同于非聚簇索引,非聚簇索引的叶子节点包含指向数据记录位置的指针。
2024-06-19 16:24:34
2042
原创 【Gradle】Gradle的本地安装和使用
Gradle 完全兼容 Maven 和 Ivy 仓库,你可以从中检索依赖也可以发布你的文件到仓库中,Gradle 提供转换器能把 Maven 的构建逻辑转换成 Gradle 的构建脚本。
2024-05-31 17:22:19
7195
原创 【应用层】文件传送协议FTP/TFTP
FTP 提供交互式的访问,允许客户指明文件的类型与格式,如指明是否使用 ASCII 码,并允许文件具有存取权限,如访问文件的用户必须经过授权,并输入有效的口令。FTP 屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件。基于 TCP 的 FTP 和基于 UDP 的简单文件传送协议 TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存取一个文件,就必须先获得一个本地的文件副本。如果要修改文件,只能对文件的副本进行修改,然后再将修改后的文件副本传回到原节点。
2024-05-30 10:13:44
1220
原创 【应用层】域名系统DNS
域名系统 DNS (Domain Name System) 是互联网使用的命名系统,用来把便于人们使用的机器名字转换为 IP 地址,域名系统其实就是名字系统。互联网的域名系统 DNS 被设计成为一个联机分布式数据库系统,并采用客户服务器方式。DNS 使大多数名字都在本地进行解析(resolve),仅少量解析需要在互联网上通信,因此 DNS 系统的效率很高。
2024-05-27 11:01:09
1161
原创 【网络安全】网络安全协议和防火墙
至今为止,大多数部署的 IDS 主要是基于特征的。但事实是不可能阻止所有的入侵行为,有必要采取措施在入侵已经开始,但还没有造成危害或在造成更大危害前,及时检测到入侵,以便尽快阻止入侵,把危害降低到最小。例如,一个邮件网关在检查每一个邮件时,会根据邮件地址,或邮件的其他首部,甚至是报文的内容(如,有没有“导弹”“核弹头”等关键词)来确定该邮件能否通过防火墙。只有使用不加密的 IP首部,互联网中的各个路由器才能识别 IP 首部中的有关信息,把 IP安全数据报在不安全的互联网中进行转发,从源点安全地转发到终点。
2024-04-25 14:02:44
2431
6
原创 【网络安全】在网络中如何对报文和发送实体进行鉴别?
鉴别(authentication)是网络安全中一个很重要的问题。一是要鉴别发信者,即验证通信的对方的确是自己所要通信的对象,而不是其他的冒充者。这就是实体鉴别。实体可以是发信的人,也可以是一个进程(客户端或服务器)。因此这也常称为端点鉴别。二是要鉴别报文的完整性,即对方所传送的报文没有被他人篡改过。
2024-04-23 16:46:13
1804
原创 【网络安全】对称加密、非对称加密以及密钥分配
在 2001 年,NIST 曾有一个大致的估计,就是假定有一台高速计算机,仅用 1 秒钟就能够破译 56 位的 DES,那么要破译 128 位的 AES,就需要。//就比如你向你的朋友转账(通信),首先必须知道对方的账号(公钥),然后把钱转到对方的账户上(公钥加密),这样你的朋友使用密码就可以取得到你转账的钱(私钥解密)在许多应用中,人们需要对纯数字的电子信息进行签名,表明该信息确实是某个特定的人产生的。的方案,把一个 64 位明文用一个密钥加密,再用另一个密钥解密,然后再使用第一个密钥加密,即。
2024-04-23 16:25:53
5979
4
原创 【运输层】TCP 的流量控制和拥塞控制
当拥塞窗口 cwnd = 24 时,网络出现了超时(图中的点②),这就是网络发生拥塞的标志。这或者是增大网络的某些可用资源(如业务繁忙时增加一些链路,增大链路的带宽,或使额外的通信量从另外的通路分流),或减少一些用户对某些资源的需求(如拒绝接受新的建立连接的请求,或要求用户减轻其负荷,这属于降低服务质量)。需要注意的是,慢开始的“慢”并不是指 cwnd 的增长速率慢,而是指在 TCP 开始发送报文段时,只发送一个报文段,即设置 cwnd=1,目的是试探一下网络的拥塞情况,然后视情况再逐渐增大 cwnd。
2024-04-18 17:36:32
2225
原创 【运输层】TCP 的可靠传输是如何实现的?
如上图所示,B 收到了序号为 32 和 33 的数据,但序号为 31 的数据没有收到(也许丢失了,也许滞留在网络中的某处)。请注意,B 只能对按序收到的数据中的最高序号给出确认,因此 B 发送的确认报文段中的确认号仍然是 31(即期望收到的序号)。若收到的确认是对重传报文段的确认,但却被源主机当成是对原来的报文段的确认,则这样计算出的 RTTs 和超时重传时间 RTO 就会偏大。同样,若收到的确认是对原来的报文段的确认,但被当成是对重传报文段的确认,则由此计算出的 RTTs 和 RTO 都会偏小。
2024-04-08 13:53:46
1625
原创 【运输层】传输控制协议 TCP
TCP 是面向连接的运输层协议。这就是说,应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。(2)每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。(3)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。(4)TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。
2024-04-07 10:03:59
1513
原创 【运输层】网络数据报协议 UDP
下图中在两个运输层之间有一条虚线,表示在两个运输层之间可以进行通信,而不是一条连接。但这种通信是不可靠的通信,即所发送的报文在传输过程中有可能丢失,同时也不保证报文都能按照发送的先后顺序到达终点。这正是 UDP 通信的特点:简单方便,但不可靠。
2024-04-03 14:39:30
1317
原创 Docker Desktop 在 Windows 上的安装和使用
WSL 指 “”,这是一个在 Windows 10\11 上能够运行原生 Linux 二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发的,旨在使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。这极大地拓展了Windows系统的功能,使用户能够在Windows环境中享受到Linux的强大功能。//Linux容器。
2024-03-29 11:36:31
49095
2
原创 【Logback】Logback 中的 Appenders
Appender组件负责处理Logback日志写入的任务,该组件必须实现接口,该接口的主要方法总结如下://主要是解决将日志写到哪里去的问题//核心方法Appender接口中其实就一个最核心的方法,即doAppend()方法,且该方法只有一个参数,也就是类型为 E 的对象实例。泛型 E 的实例类型需要根据 logback 的具体模块进行决定,在模块内,E 的类型为ILoggingEvent(日志记录事件),在模块内,E 的类型为。
2024-03-06 13:26:03
2325
原创 【Logback】Logback 的配置文件
首先,DefaultJoranConfigurator 会尝试查找“logback.configurationFile” 系统属性上指定的文件。如果可以找到该文件,则会读取并解释该文件,然后进行配置。如果没有找到上述文件,DefaultJoranConfigurator 将尝试在类路径上查找配置文件 “logback-test.xml” 。如果可以找到该文件,则会读取并解释该文件,然后进行配置。如果没有找到上述文件,配置器将继续尝试在类路径中查找配置文件
2024-03-01 18:04:29
3882
原创 【Logback】Logback 日志框架的架构
目前,logback 分为三个模块,和。logback-core (核心)模块为其他两个模块奠定了基础。模块扩展了。模块是 log4j 日志的改进版本。logback-classic 模块实现了 slf4j API,因此使用 slf4j API 时,可以轻松地在 logback 和其他日志框架之间来回切换例如 JDK 1.4 中引入的 log4j 或 java.util.logging(JUL)//核心+核心拓展模块用于与 Servlet 容器集成,用来提供日志功能。
2024-02-23 15:06:40
2214
原创 【Logback】如何在项目中快速引入Logback日志?
Logback 是 Java 社区中使用最广泛的日志框架之一。它是其前身 Log4j 的替代品。Logback 比所有现有的日志框架速度更快,占用空间更小,而且比其他日志框架提供了更多了功能。//日志框架出现的历史顺序:log4j --> JUL–> JCL–> slf4j --> logback--> log4j2。
2024-02-22 13:39:01
2890
原创 【CentOS】Linux 文件与目录管理命令
在 Linux 中操作与管理文件及目录,需要在不同的目录间进行切换、还要能够建立与删除目录、建立与删除文件,同时还能够寻找文件、查看文件内容等等,这篇文章将介绍以上这些操作的基本命令。
2024-02-19 14:49:59
1560
1
原创 【CentOS】Linux 文件权限与权限修改命令
用户与用户组是Linux文件权限的重要组成部分。首先,一定要明确用户与用户组的概念:Linux 一般将文件可读写的身份分为三个类别,分别是:拥有者(owner)所属群组(group)其他人(others),且三种身份各有读(read)写(write)执行(execute)等权限。那么,为什么要这样设置呢?这是因为,Linux 是个多人多任务的系统,因此常常会有多人同时使用一台主机的情况,所以需要对用户及其权限进行控制。
2024-01-24 10:29:56
5270
原创 【CentOS】Linux 在线帮助文档命令:help、man 命令与文档汉化
Linux 系统中有非常多的命令,而且不同版本的 Linux 命令也稍有不同,那,这么多的命令都需要我们去死记硬背吗?答案是:当然不需要,我们只需要知道知道怎样使用联机文档就可以了。
2024-01-22 14:37:40
1528
1
原创 【网络层】IP 协议和地址解析协议 ARP
互联网网络层采用的设计思路是这样的:网络层要设计得尽量简单,向其上层只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。在网络层在发送 IP 数据报时不需要先建立连接,每一个 IP 数据报都独立发送,与其前后的 数据报无关(不进行编号),且网络层不提供服务质量的承诺。所以,网络层主要提供两种服务:数据包(IP数据报)路由和转发。该层传输的主要是IP数据报,所以本文主要介绍IP数据报的相关知识点。
2024-01-19 14:36:11
1319
原创 【链路层】点对点协议 PPP
图右方的绿色方框给出了对 PPP 协议的几个状态的说明。从设备之间无链路开始到先建立物理链路,再建立链路控制协议 LCP 链路。经过鉴别后再建立网络控制协议 NCP 链路,然后才能交换数据。由此可见,PPP 协议已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容。
2024-01-15 10:48:03
1591
原创 【Java8】Java 中新的日期和时间 API
Java 旧的日期时间类 java.util.Date 和 java.util.Calendar 存在可变性,导致在多线程环境下使用时会存在线程安全问题。在新的 API 中,几乎所有的类都是不可变的,从而保证了线程安全性。此外,旧的 API 命名不清晰,使得日期时间处理相对困难。新的 API 使用了更清晰和直观的命名,使得代码更易读、更易写。
2023-12-28 14:14:42
1152
原创 【Java8】Java 中的 Stream 流收集器
Java 中 Stream 流用来帮助处理集合,类似于数据库中的操作。在 Stream 接口中,有一个抽象方法collect,你会发现 collect 是一个归约操作(高级规约),就像reduce一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果。具体的做法可以通过Collector接口来定义。// collect和reduce都是Stream接口中的汇总方法,collect方法接收一个Collector(收集器)作为参数收集器(Collector。
2023-12-22 14:41:54
1693
原创 【Java】Java 中的 final 关键字和 static 关键字
这两个关键字编写代码时会经常用,正确的使用这些关键字,可以形成良好的编程习惯,保护好代码的封装性。
2023-12-15 15:17:43
1389
原创 Redis 主库挂了,如何不间断服务?
哨兵机制,是实现 Redis 不间断服务的重要保证。具体来说,主从集群的数据同步,是数据可靠的基础保证;而在主库发生故障时,自动的主从切换是服务不间断的关键支撑。Redis 的哨兵机制自动完成了以下三大功能,从而实现了主从库的自动切换,可以降低 Redis 集群的运维开销:监控主库运行状态,并判断主库是否客观下线;在主库客观下线后,选取新主库;选出新主库后,通知从库和客户端。
2023-11-28 22:20:24
1364
1
原创 Windows 使用的一些小技巧
优化电脑内存与核心数量,由于默认引导高级选项并没有检测优化内存与CPU,因此我们可以根据我们电脑配置进行优化,如果电脑是双核处理器,我们可以将处理器选择为 2 个,此处我直接选择处理器个数的最大数。Check Disk,简称“CHKDSK”,是一种Windows内置的实用程序,可以检查硬盘文件系统的完整性,并可以修复FAT16、FAT32和NTFS硬盘上的各种文件系统错误。然后,会弹出一个文件夹,里边存放的都是各种临时文件,可以手动删除,遇到删不掉的文件,点击跳过即可。
2023-10-29 18:43:54
2834
原创 使用 Redis 如何统计一亿个 keys ?
redis 中 Set、Sorted Set、Hash、List、Bitmap、HyperLogLog 的支持情况和优缺点汇总可以看到,Set 和 Sorted Set 都支持多种聚合统计,不过,对于差集计算来说,只有 Set 支持。Bitmap 也能做多个 Bitmap 间的聚合计算,包括与、或和异或操作。当需要进行排序统计时,List 中的元素虽然有序,但是一旦有新元素插入,原来的元素在 List 中的位置就会移动,那么,按位置读取的排序结果可能就不准确了。
2023-10-24 21:59:36
739
原创 并发编程7:线程池的使用
如果没有线程正在等待,并且线程池的当前大小小于最大值,那么ThreadPoolExecutor 将创建一个新的线程,否则根据饱和策略,这个任务将被拒绝。它提供了大量可调节的选项,例如创建线程和关闭线程的策略,处理队列任务的策略,处理过多任务的策略,并且提供了几个钩子方法来扩展它的行为。同样,当线程池中的任务是数据库连接的唯一使用者时,那么线程池的大小又将限制连接池的大小。如果某个线程的空闲时间超过了存活时间,那么将被标记为可回收的,并且当线程池的当前大小超过了基本大小时,这个线程将被终止。
2023-09-07 17:15:30
248
原创 并发编程6:任务或线程的取消与关闭
Java 提供了中断 (Interruption)协作机制,通过该机制能够使一个线程终止另一个线程的当前工作。这种协作式的方法是必要的,我们很少希望某个任务、线程或服务立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态。相反,在编写任务和服务时可以使用一种协作的方式:当需要停止时,它们首先会清除当前正在执行的工作,然后再结束。这提供了更好的灵活性,因为任务本身的代码比发出取消请求的代码更清楚如何执行清除工作。//中断操作应该由中断线程本身去决定何时中断。
2023-09-04 10:47:47
493
原创 并发编程5:如何执行任务?
大多数并发应用程序都是围绕来构造的:任务通常是一些抽象的且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种事务边界来优化错误恢复过程,以及提供一种并行工作结构来提升并发性。//目的:如何把一个工作拆解成多个任务,并发执行->清晰的任务边界(独立任务有利于并发)
2023-08-23 14:09:01
667
原创 并发编程4:Java 中的并发基础构建模块
委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。Java 平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)等。Java 并发类的 API 文档,。
2023-08-17 17:38:45
224
原创 并发编程3:如何设计线程安全的类
上边代码稍微改变了车辆追踪器类的行为,在使用监视器模式的车辆追踪器中返回的是车辆位置的快照,而在使用委托的车辆追踪器中返回的是一个不可修改但却实时的车辆位置视图。它并不关心底层的 List 是否是线程安全的,即使 List 不是线程安全的或者修改了它的加锁实现,ImprovedList 也会提供一致的加锁机制来实现线程安全性。为了防止多个线程在并发访问同一个对象时产生的相互干扰,这些对象应该要么是线程安全的对象,要么是事实不可变的对象,或者由锁来保护的对象。
2023-08-09 15:37:23
212
原创 并发编程2:如何进行对象共享?
“发布(Publish)”一个对象的思是指,使对象能够在当前作用域之外的代码中使用。例如,将一个指向该对象的引用保存到其他代码可以访问的地方,或者将引用传递到其他类的方法中。发布内部状态可能会破坏封装性,并使得程序难以维持不变性条件。例如,如果在对象构造完成之前就发布该对象,就会破坏线程安全性。当某个不应该发布的对象被发布时,这种情况就被称为逸出( Escape)。
2023-08-08 15:38:52
219
护眼插件-浏览器夜间模式
2022-09-08
apache-jmeter-3.1.rar
2020-04-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人