自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于Kotlin协程在Java项目中,是否有效的小测试

从日志打印结果来看,3000个协程任务都在正常运行,没有像普通线程池那样出现排队等待的情况,而且每一轮各个任务几乎都同时打印出日志。

2023-11-02 01:06:47 179

原创 使用Go+UDP实现一个Gossip协议工具包(Gossip集群谣言传播与反熵传播的具体实现)

工具包Github链接https://github.com/dpwgc/pekonode什么是Gossip?Gossip是一种具有随机性、传染性的网络协议。Gossip的特点使用简单,扩展性强,容错率高,去中心化,最终一致性。Gossip是如何同步信息的?当一个新节点A连接到Gossip集群内的某个节点B时,A节点会将自己的信息发送给B节点,然后B节点会在集群中随机选取几个节点,向他们广播A节点的信息(传染),集群中的其他节点收到A节点的信息后,又会像B节点那样广播A节点的信息给其他集群节点(

2022-05-20 22:25:26 937

原创 Innodb 什么是Next-Key Lock

Innodb 什么是Next-Key LockInnodb的锁机制Innodb有三种锁:Record Lock:对单行记录上锁。Gap Lock:间隙锁,锁定记录附近的一个范围,但不包括记录本身。间隙锁的目的是为了防止同一事务内的两次当前读之间,出现新数据插入而导致幻读的情况。比如说我要更改status=1的记录,间隙锁会给所有目标记录附近的记录上锁,避免在目标记录周围出现插入和删除操作影响update。Gap Lock只能阻止其他事务在被上了间隙锁的记录行附近插入记录,无法阻止其他事务对该

2022-02-27 19:02:21 442

原创 什么是脏读、幻读、不可重复读,怎么解决?

脏读一个事务访问到了其他事务未提交的数据更改例:事务A对一个数据进行了修改操作,但事务A未提交,事务B在查询时却查到了修改后的数据。脏数据:事务B查询到事务A修改后的数据,但是事务A回滚了,此时事务B查询出来的数据就是脏数据。幻读在一个事务中进行了两次查询操作,得到的行数不一致例:一个事务进行两次查询操作,在两次查询之间,另一个事务插入了新数据并提交事务,导致第二次查询多了一条数据。不可重复读在一个事务中进行了两次查询操作,得到的数据内容不一致例:事务A进行两次查询操作,在两次

2022-02-27 18:09:58 1413

原创 Go Context的简单使用与底层原理

什么是context?context(上下文)可以理解为是承接上下文的载体,可以被无限传递下去,Go中的context负责存放协程的当前信息(快照),其中包含着协程中的变量信息及函数调用。context的使用场景后端接收请求时,有时要将获取到的数据交由多个协程处理。例如登录验证时,将权限验证、密码验证、有效期验证分到三个不同的协程里处理,如果此时有一个协程处理失败了,其他协程也应该立即关闭,避免持续占用系统资源。而在Go中就可以用context来进行控制操作。context的底层结构// Co

2022-02-26 15:02:35 501

原创 JWT简介

JWT是什么?JWT是一种基于JSON的token验证标准,常用于分布式服务的单点登录。JWT的优势JWT不像session和redis token那样需要在服务端内存/Redis中保存数据用于鉴权,JWT无状态的,服务端不需要保存任何数据,这也意味着JWT认证机制不需要考虑用户在哪一台服务器上登录,非常适合于分布式服务。JWT鉴权流程用户端发送登录请求服务端验证登录信息验证通过,服务端生成一个token发送给用户端用户端存储token,每次请求都在头部加上这个token服务端验证tok

2022-02-26 13:38:06 3869

原创 OSI七层模型与TCP五层模型

OSI七层模型与TCP五层模型OSI七层模型应用层:负责为应用程序提供网络服务(HTTP、SSH等)。表示层:负责处理数据格式转换、数据压缩和数据加密(JPEG、ASCII等)。会话层:负责建立、维护、断开与管理通信会话;传输层:负责为上层协议提供端到端的可靠传输(TCP、UDP)。网络层:负责逻辑地址寻址,实现不同网络之间的路径选择(ICMP、IPV4、IPV6)。数据链路层:负责建立逻辑连接、根据MAC地址进行硬件地址寻址、差错校验等。利用物理传输介质为数据链路层提

2022-02-25 18:02:36 2844

原创 MVCC实现原理笔记

MVCC是通过全局事务ID、表中隐藏的版本列、undolog和read view结合实现的。全局事务IDInnodb每开启一个事务都会随机生成一个自增事务版本号。表中隐藏的版本列DB_TRX_ID: 记录操作该数据事务的事务ID;DB_ROLL_PTR:指向上一个版本数据在undo log 里的位置指针;DB_ROW_ID: 隐藏ID ,当创建表没有合适的索引作为聚集索引时,会用该隐藏ID创建聚集索引;undologundolog是个逻辑日志,他记录的是与SQL操作相反的语句,用于事务的

2022-02-25 12:28:29 407

原创 Go sync.Map笔记

Go sync.Map底层原理sync.Map的实现原理基于map,采用空间换时间的方法,设置两个map(read只读表、dirty脏表),read只读,dirty可读可写,写操作全部在dirty上进行,读操作先在read上查找,read没有数据再从dirty里查找,实现读写分离。sync.Map的结构体type Map struct { // 当涉及到脏数据(dirty)操作时候,需要使用这个锁 mu Mutex // read是一个只读数据结构,包含一个ma

2022-02-22 20:56:08 360

原创 MySQL主从同步流程详解

MySQL主从同步流程详解从库进行配置,设置从库要从主库binlog的哪一个位置开始请求数据,这个位置信息包括主库binlog文件名及偏移量。从库开始执行主从同步,这时从库会开启两个线程,一个是IO线程,一个是SQL线程。IO线程负责与主库建立连接,连接建立后,从库向主库发送身份信息、所需的binlog文件名及偏移量。主库开启一个dump线程,与从库建立连接(当主库连接了多个从库时,主库会为每一个当前连接的从库建一个dump线程)。连接后校验从库的身份信息,然后根据从库发来的binlog文

2022-02-19 22:31:50 1057

原创 RocketMQ三种刷盘策略笔记

PageCache高速页缓存:Linux会将一部分内存作为PageCache。同步刷盘:只有当消息被持久化到磁盘后才会响应ACK。异步刷盘:消息在被写入PageCache后就会响应ACK,由后台将PageCache里的消息刷入磁盘。异步刷盘+缓冲区:RocketMQ将一部分内存当做缓冲区,消息被写入缓冲区后就返回ACK,...

2022-02-19 22:02:24 887

原创 Go 值类型与引用类型

Go 值类型与引用类型值类型int/uintfloatboolstringinterface结构体数组指针函数值类型的特点值类型变量直接存储值,在初始化值类型变量的同时会赋予该变量一个零值。对值类型变量进行拷贝,然后对拷贝后的变量进行修改操作,不会影响原变量的值。引用类型slicechanmap引用类型的特点引用类型零值为nil(还未被make之前)引用类型底层通常由一个结构体实现,这个结构体内部有个指针,指向了引用类型数据存储的内存空间。引用类型通

2022-02-19 02:09:30 280

原创 如何手搓一个简易的Redis客户端(RESP协议原理及使用)

如何手搓一个简易的Redis客户端(RESP协议原理及使用)完整代码(已封装成模块包,可直接导入使用)Gitee:https://gitee.com/dpwgc/easy-go-redisGithub:https://github.com/dpwgc/easy-go-redis什么是RESP协议RESP是一个基于TCP的应用层协议,通过TCP传输数据并根据规则解析数据。Redis服务端与客户端之间就采用RESP通讯。RESP的优点简单、易读、二进制安全、解析速度快、可序列化多种类型的数据(

2022-02-19 00:45:59 733

原创 为什么Innodb用B+树而不用跳表

为什么Innodb用B+树而不用跳表(1)Innodb出来时跳表还没发扬光大,所以没选跳表?(2)B+树的一个节点可以存储很多关键字,而且单个节点大小可以与磁盘页对齐(默认16kb),一次IO就能传输一整个节点(跳跃表可能会出现跨页IO),大幅减少磁盘IO次数,所以B+树更适合用于文件系统及关系型数据库。(3)跳跃表的索引层建立具有随机性,磁盘不能对链表进行预读,会产生大量随机IO。(磁盘预读:从本次被读取的位置开始,顺序向后读取一定长度的数据放入内存)(4)B+树检索效率比跳表高。...

2022-02-18 01:36:49 1342

原创 Redis为什么要设计成单线程的

Redis为什么要设计成单线程的因为Redis是基于内存存储数据的,它在插入数据的时候不需要像关系型数据库那样进行磁盘IO操作。在使用到磁盘IO的情况下,因为IO会导致当前线程阻塞,单线程程序会因为IO而频繁阻塞,在这种情况下多线程模型效率会更高。但是Redis中并没有频繁的磁盘IO操作,引入多线程反而会因为线程调度切换(上下文切换)影响性能。此外Redis也不是完全没有多进程,在进行AOF日志文件重做或者进行RDB持久化时,因为这两个操作都涉及磁盘IO,会阻塞当前线程。所以Redis会调用系统的for

2022-02-18 01:02:26 882

原创 Go 二叉树递归遍历输出(前序、中序、后序)

Go 二叉树递归遍历输出(前序、中序、后序)前序遍历:根结点 —> 左子树 —> 右子树中序遍历:左子树—> 根结点 —> 右子树后序遍历:左子树 —> 右子树 —> 根结点树结构体type TreeNode struct { Val int //值 Left *TreeNode //左子树指针 Right *TreeNode //右子树指针}前序(深度优先遍历)func kthLargest(root *TreeNode) {

2022-02-17 01:21:09 408

原创 面试题:介绍select、poll、epoll

面试题:介绍select、poll、epollIO多路复用概念IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。它们三的作用提供一种IO复用的方式。即让单个进程可以监视多个文件描述符,一旦某个fd就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。fd是什么?fd:文件描述符文件描述符(file descriptor)是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统

2022-02-16 21:59:44 1220

原创 Go Mutex加锁流程笔记

Go Mutex加锁流程笔记Mutex是一种基于CAS的自旋锁获取锁——步骤(1)协程调用Lock()函数。(2)判断这个锁是否未初始化,如果该锁没有初始化,则对该锁进行初始化设置,然后获取锁,Lock()函数返回。如果该锁已被初始化过,则进入下一步操作。(3)判断锁与协程的当前状态,如果该锁处于加锁状态且当前协程不处于饥饿状态,则尝试获取该锁的协程会进入自旋状态(最多自旋4次)。(4)自旋完成后,计算当前锁的状态,协程尝试获取锁,如果获取成功,Lock()函数返回。如果获取失败

2022-02-16 18:39:52 951

原创 Go GC垃圾回收笔记(三色标记)

Go GC垃圾回收笔记Go 1.3标记清除法进行STW,从main函数开始查找内存占用(根可达算法遍历)。标记所有可以到达的内存占用。标记完成后,清除这些内存占用。结束STW,程序继续运行。Go 1.5后三色标记法从根部(main函数)开始查找根可达对象,将这些可达对象标记为灰色,并放入灰色对象队列。从灰色对象队列中取出灰色对象,并将其标记为黑色。同时将其引用的对象标记为灰色,放入灰色对象队列中。重复以上两个步骤,直到灰色对象队列为空,此时剩下的所有黑色对象就是

2022-02-14 19:50:14 291

原创 Go map的底层原理(存储、扩容)

Go map的底层原理map的实现原理map的底层结构map的扩容机制map的实现原理数组+链表、拉链法map的底层结构hmap 哈希表hmap是Go map的底层实现,每个hmap内都含有多个bmap(buckets桶、oldbuckets旧桶、overflow溢出桶),既每个哈希表都由多个桶组成。type hmap struct { count int //元素的个数 flags uint8 //状态标志 B u

2022-02-14 18:39:28 4970 1

原创 mmap零拷贝知识点笔记

以传统的IO方式将本地文件发送到网络共发生4次拷贝,4次内核态与用户态的上下文切换。调用read()方法,程序从用户态下陷到内核态。将磁盘中的文件拷贝到内核缓冲区(DMA copy)。将内核缓冲区中的数据拷贝到用户缓冲区(CPU copy),程序由内核态转为用户态,read()方法返回。调用write()方法,程序再次从用户态下陷到内核态,并将用户缓冲区中的数据拷贝到socket缓冲区(CPU copy)。将socket缓冲区中的数据拷贝到网卡发送(DMA copy),程序由

2022-02-14 14:46:21 507

原创 Go chan的底层原理

Go chan的底层原理什么是channel?chan是Go中的一种特殊类型,不同的协程可以通过channel来进行数据交互。channel分为有缓冲区与无缓冲区两种。如果当前协程向无缓冲区chan发送一条消息,但是这个chan没有就绪的接收协程时,当前协程就会被阻塞,直到出现一个接收者协程就绪,并从chan中接收这条消息。channel的底层实现channel是基于环形队列实现的。type hchan struct { qcount uint // 当前队列中剩余元素个

2022-02-14 00:51:00 1227

原创 面试题:B树与B+树的区别,为什么Innodb要用B+树而不是B树

面试题:B树与B+树的区别,为什么Innodb要用B+树而不是B树B树B树是一种平衡的多路查找树,它的所有叶子节点都在同一层。B树是由平衡二叉树演化而来,B树的每个节点可以存储多个关键字,每个节点都带有完整的数据。B树将节点大小设为磁盘页的大小,每次读取磁盘页时就能读取到一整个节点,减少了磁盘IO次数。由于B树的每个节点都存储着多个关键字,树的深度会远小于一般的平衡二叉树,进而减少了磁盘IO次数。B树在进行搜索关键字操作时,先将指定的那一个节点从磁盘读取到内存中(这个节点包含了多个关键字和数据),

2022-02-13 18:54:24 1220

原创 MySQL为什么需要两阶段提交

MySQL为什么需要两阶段提交两阶段提交图解为什么需要两阶段提交?保证binlog与redolog的数据一致性。如果没有两阶段提交:先写redolog,再写binlog:redolog写完,还没来得及写binlog,MySQL宕机。重启以后,redolog里有记录,MySQL判断事务提交成功,但binlog里没有记录,binlog与redolog出现数据不一致。由于binlog是追加写入日志,往后的时间里binlog会一直缺失这条数据。如果在以后使用binlog恢复这个时间点的数据,会出现

2022-02-13 17:56:01 918

原创 MySQL三大日志知识点总结

MySQL三大日志知识点总结binlog 二进制日志redolog 重做日志undolog 回滚日志binlog什么是binlog?binlog是MySQL Server层的二进制日志,用于记录MySQL执行的所有写入性操作。无论MySQL使用什么存储引擎,写入性操作都会记录到binlog。binlog是逻辑日志,新来的写入性操作通过追加的方式进行写入。如果当前binlog文件过大,MySQL会创建一个新的binlog文件来记录MySQL操作。可以将binlog理解为一个记录所有写入性s

2022-02-13 17:07:58 1064

原创 Redis AOF与RDB知识点总结

Redis AOF与RDB知识点总结Redis拥有两种持久化方式:AOF与RDBAOFAOF的存储方式AOF是以写日志的方式记录每次写命令,客户端所执行的每一条写命令都将记入AOF日志,类似于MySQL binlog。AOF的数据恢复如果发生宕机重启的情况,Redis会通过顺序执行AOF日志中的所有写命令的方式来进行数据恢复(操作回放)。AOF与WAL的区别关系型数据库中大多使用WAL预写日志(写前日志),先写日志,再执行语句。而Redis的AOF是写后日志,先更新内存里的数据,再将这一条写

2022-02-13 02:41:40 290

原创 Redis五种数据类型的底层结构

Redis五种数据类型的底层原理string 字符串redis字符串的存储方式有两种:SDS(简单动态字符串)、直接存储(存储对象为整数时使用)string的编码:int、raw、embstr直接存储int:存储对象为整数时使用SDS存储raw:存储对象为长度大于32位的字符串时使用embstr:存储对象为长度小于等于32位的字符串时使用list 列表(队列)在redis 3.2之前,list底层采用ziplist(压缩列表)与linkedlist(双向链表)

2022-02-12 23:10:19 1451

原创 基于Go Gin+WebSocket+消息队列实现即时通讯多人群聊功能模块

基于Go Gin整合gorilla的WebSocket即时通讯消息推送模块

2022-01-25 22:44:25 5583

原创 Redis查询缓存与延时双删的实际应用(Golang)

使用GO结合Redis实现数据库复杂查询缓存、缓存延时双删操作。

2022-01-21 18:22:23 1166

原创 用Go语言、令牌桶算法和CAS整一个接口限流器

使用atomic原子操作结合令牌桶限流算法实现一个Golang限流器。

2022-01-16 22:17:05 307

空空如也

空空如也

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

TA关注的人

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