自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一文带你理解Golang的内存分配

定义:外部碎片是指已经分配给进程使用,但因为不连续而无法被利用的"空闲内存间隙"假如你有一个停车场,总空闲时间=2m+1m+3m+4m=10米空间但是你无法停一辆6米长的卡车,因为没有连续的6米空间这就是外部碎片:总空闲内存足够,但分散成小片段,无法分配给大的请求。

2026-01-26 14:31:37 483

原创 深入剖析Kafka(二)

与生产者对应的是消费者,应用程序可以通过KafkaConsumer来订阅主题,并从订阅的主题中拉取消息。不过在使用KafkaConsumer之前需要先了解消费者和消费组的概念,否则无法理解如何使用KafkaConsumer。

2026-01-25 11:27:53 728

原创 kafka原理剖析(一)

我们知道,基于网络流传播的数据,大多传的都不是原始数据,而是经过序列化后的数据,在到达目的地后,在反序列化成原始数据。kafka也不例外生产者需要用序列化器把对象转换为字节数组进行传播,消费者则用反序列化器把字节数组还原成对象。生产者使用的序列化器和消费者使用的反序列化器是需要一一对应的,如果生产者使用了某种序列化器,而消费者使用了另一种序列化器,那么是无法解析出正确的数据的。

2026-01-24 12:01:46 658 1

原创 一文带你了解JWT

JWT(JSON Web Token)是目前最流行的跨域认证解决方案,是一种基于Token的认证授权机制。从JWT的全称可以看出,JWT本身也是Token,一种规范化之后的JSON结构的Token。JWT自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储Session信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。可以看出,JWT更符合设计RESTful API时的【Stateless(无状态)】原则。

2026-01-12 18:51:35 510

原创 kafka的整体架构

在这里介绍kafka的整体架构,后续再进行填充式学习。

2026-01-11 19:32:20 894

原创 彻底理解数据库和缓存一致性问题

缓存技术,既能减轻数据库访问压力,又能加快请求响应速度,这是一件两全其美的事情,所以稍具规模的系统,都会引入缓存机制来达成这两个目的。缓存技术从最初的本地缓存发展到如今,已经走进以Redis为代表的分布式缓存时代,尤其是现在的分布式系统,Redis这类中间件已经成为系统不可或缺的基础设施。但是任何技术有利必有弊,我们不能光盯着优势看,分布式缓存中最经典的就是缓存一致性问题。

2026-01-09 13:59:50 630

原创 一文彻底理解分库分表

分表方案主要是针对于单表字段过多或数据过多的情况去做的,通过垂直,水平分表的手段,能够很好解决单表由于字段,数据量过多产生的一系列负面影响,但无论是垂直分表还是水平分表,都必须建立在单库压力不高,但是单表性能不够的情况下进行的,如果是数据库整体压力都很大的情况,从而导致的查询效率低下,那不管再怎么做分表也无济于事。

2026-01-06 16:06:14 503

原创 你真的懂分布式的Raft理论吗?

压缩技术相信大家都有所接触,日常传输一个文件时,如果源文件较大,必然会影响传输效率,为了缩短传输时间,我们会将其打包成.zip或者.rar等格式的压缩包。同理,这个思想也可以用于Raft中,当日志序列较大时,我们可以通过压缩技术对其进行瘦身工作。但是传统的压缩技术并不能解决Raft所面临的难题,因为传统的压缩技术,最多只能在原大小的基础上"瘦身"30~40%,这对无限增长的日志而言用处并不大。因此,该如何有效解决客户端持续性操作,带来的日志无限增长问题呢?答案很简单。依靠Snapshot快照技术。

2026-01-05 15:09:02 733

原创 一文弄懂MVCC

每次事务更新数据的时候,都会生成一个新的数据版本,并且把transaction id赋值给这个数据版本的事务ID,记为row trx_id【也就是下图的DB_TRX_ID】。解决【读–写】冲突的【无锁并发控制】,每次对A记录的写操作,都会给A保存一个快照版本,至于读操作,读的是哪个快照版本,看MVCC的实现原理【下面readview访问规则】Readview(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。检查trx_id>=max_trx_id?

2026-01-04 18:11:12 817

原创 你真的懂微服务的RPC吗?

拦截器的作用,是在执行核心业务方法的前后,创造出一个统一的切片,来执行所有业务方法锁共有的通用逻辑。此外我们还能够通过这部分通用逻辑的执行结果,来判断是否需要熔断当前的执行链路,以起到拦截的效果有关grpc拦截器的内容,其实和gin框架中的handlersChain是异曲同工的。req:业务处理方法的请求参数info:当前所属的业务服务servicehandler:真正的业务处理方法// 前处理校验err!= nil{// 前处理校验不通过,则拦截,不调用业务方法直接返回。

2025-12-30 15:08:51 1009

原创 从0到1理解位图!

先来看一个场景:有一个项目,需要支持查询某个用户是否在线。你会怎么做?第一个想法大概是使用哈希表存储所有在线的用户ID,然后查询用户ID是否在哈希表中来判断用户是否在线。这样当然可以,但是有没有更好的方法呢?先来看哈希表的瓶颈,假设用户ID我们用一个int32类型来存储,那么每个在线用户光key就需要4byte的存储空间(我们假设value为空结构体),而哈希表还有别的内存开销。假设我们有一亿个用户,那么哈希表光key占用的空间为4byte * 1亿 = 400MB,而且哈希表其它部分的内存开销更大。

2025-12-29 19:53:44 283

原创 真正理解Raft共识算法(上)

对于存储型系统来说,为了消除单点故障,提高可用性,系统会用集群方案部署,而数据则以副本形式存储在多个节点,那多个节点间的数据如何保证一致呢?答案就是使用共识算法。Paxos算法难以理解,所以Raft算法出现了。1. 问题分解 2. 状态简化。

2025-12-28 13:48:57 881

原创 一文带你彻底弄懂GMP调度模型!

在这里我们介绍了Go语言调度器中常见的数据结构,下面就介绍Go语言调度器是怎么运作的至此,GMP就大概结束了,但是我们发现,似乎所有调度路径,都要使用mcall()切换到g0栈才能执行,这是为什么?栈空间不足风险:用户G的栈是动态增长的,可能只剩几百字节schedule()函数本身调用链很深,需要大量栈空间可能导致栈溢出。所以此时我们要切换到g0,因为g0的栈空间通常比用户G的栈空间大破坏用户G的上下文schedule()内部可能会修改寄存器,调用其它函数,甚至触发GC。

2025-12-27 20:02:43 749

原创 彻底搞懂golang的IO复用(二)

单一线程阻塞等待时,只能处理一个IO读写请求,非阻塞+忙轮询,又会导致CPU大量空转,影响性能,那么,我们要怎么处理大量IO读写请求呢?

2025-12-26 13:28:29 261

原创 彻底理解Golang的IO多路复用(一)

这篇文章介绍一些基本概念,包括流,阻塞,非阻塞,忙轮询等。

2025-12-26 11:12:48 146

原创 一文带你了解两大分布式基本理论!

分布式架构相信大家或多或少都听说过或者开发迭代过程中应用过,这篇文章就介绍两个分布式领域的基础理论,即:CAP与BASE理论。

2025-12-24 17:15:21 803

原创 一文带你弄懂反射!

反射是指在程序运行期间对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获得自身的信息。对于没有反射机制的情况,程序运行时:知道内存里存了什么值(比如x=42)但不知道这个值对应的变量叫x也不知道x是int类型,属于哪个结构体,有没有方法等这是为什么呢?看下面的解释:对于变量name:=“rose”:编译器知道的:该变量的名字是name,类型是string。

2025-12-22 10:31:05 541

原创 你真的会Context吗?

context是golang中的经典工具,主要在异步场景中用于控制并发以及控制goroutine,此外,context还有一定的数据存储能力。本人在学习过程中,在许多地方都看到了context,大致了解了使用方法,但是不了解底层使我非常难受,这篇文章就探究一下context的底层原理。

2025-12-22 10:28:45 899

原创 Java学习笔记4

成员变量:成员变量是定义在类中,方法体之外的变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。一个类可以拥有多个方法,在上面的例子中:创建Java对象的模板。声明:声明一个对象,包括对象名称和对象类型。

2024-11-03 16:23:40 142

原创 JAVA学习笔记3

当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。类名:对于所有的类来说,类名的首字母应该大写。大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。方法名:所有的方法名都应该以小写字母开头。首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合。所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始。Java 所有的组成部分都需要名字。

2024-11-03 16:19:08 324

原创 JAVA学习笔记2

一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;下面看一个简单的 Java 程序,它将打印字符串 Helpublic class HelloWorld {方法:方法就是行为,一个类可以有很多方法。实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。类:类是一个模板,它描述一类对象的行为和状态。

2024-10-27 18:31:48 335

原创 JAVA学习笔记1

一、JAVA语言概述1.1 诞生类C语言发展和衍生的产物;纯粹的面向对象;舍弃C语言中的容易引起错误的指针;增加垃圾回收器功能;1.2 特征易学的;强制面向对象的;分布式的;健壮的;安全的;体系结构中立的;解释性的;性能略高的;原生支持多线程的;

2024-10-27 18:28:44 268

空空如也

空空如也

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

TA关注的人

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