- 博客(95)
- 资源 (17)
- 收藏
- 关注

原创 MySQL SQL基础入门-你想要的我尽可能覆盖全
关系型数据是一种数据库类型,关系型数据库存储和提供数据都是相互关联的。关系型数据库是通过关系模型来组织数据的。通常关系型数据通过多张表中的行和列来组织关系。表中的行也叫记录或者元组。列也叫属性。数据库是在按照数据模型来组织,存储和管理数据的集合。数据库一般由很多表组成,这些表之间有直接或者间接的关系。我们可以把表定义为图中的节点,关系为他们之间的边。数据库管理系统是数据库系统的核心部分,他复杂各种CRUD,没有它根本就不会存在数据库系统。
2024-04-12 22:52:44
3306

原创 强行让Java和Go对比一波[持续更新2024-04-10已更新]
很多Java开发如果想转Golang的话,比较让Java开发蛋疼的第一是语法,第二是一些思想和设计哲学的Gap,所以我这儿强行整理一波Java和Golang的对比,但是由于GO和Java在很多方面都有不同的设计,所以这些对比的项可以更好的让Java开发理解是什么。
2024-04-07 22:00:55
655

原创 Java与Go的并发世界:理解Work Sharing与Work Stealing
Work stealing可以提升并发和并行,因为空闲的线程会主动窃取其他线程中任务队列的任务从而提升并行处理能力。
2024-04-01 21:41:42
1264
1

原创 MySQL 锁合集与事务隔离级别
2. [排他锁(X 锁): 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁](https://fofcn.tech/2023/08/09/mysql-innodb-%e5%85%b1%e4%ba%ab%e8%af%bb%e9%94%81%e4%b8%8e%e6%8e%92%e4%bb%96%e5%86%99%e9%94%81%ef%bc%88s-lock-and-x-lock%ef%bc%89/)排他锁是比共享锁更严格的锁,当事务持有排他锁时,它可以对数据行进行更新操作。
2024-03-29 21:21:52
608
1

原创 网络编程核心挑战:同步发送与接收数据的解决策略
简单来说就是,同步发送与接收的问题是指在某个网络连接上同时进行数据发送和接收时保持数据同步的挑战。在并发场景下,可能会有多个数据包同时在传输,需要确保每个响应都与其对应的请求匹配。既然已经有了解决方案,我们也基于自定义协议来实现一个同步发送和接收的实现吧。
2024-03-23 21:31:00
940
原创 微服务边车模式深度解析:赋能云原生应用的终极指南(自己搞一个简单SideCar?)
通过使用Sidecar模式,我们能够实现对微服务架构的强化,也就是关注点分离,让你专注于开车,开好车,开快车。它提供了一种有效的方式去分摊微服务的辅助功能(如日志记录、监控、配置管理、网络通信等),而无需改动微服务的核心业务逻辑。这带来了显著的优点,包括简化开发复杂度、增强服务的可维护性和可伸缩性,以及提供了横切关注点(cross-cutting concerns)的统一管理。
2024-04-14 17:10:32
3863
原创 k8s 架构
想要学习k8s的使用还是有必要学习一下k8s的架构。文章这个图是官网上k8s的架构图,这个架构展示了所有k8s的组件。Kubernetes架构可以分为两个主要部分:控制平面(Control Plane)和数据平面(Data Plane)。控制平面和数据平面简单理解就是老板和员工的关系。老板负责指挥怎么干,员工就根据智慧干。也可以拆开来理解。是Kubernetes的大脑,负责集群的整体管理和协调。
2024-04-14 15:06:18
1068
原创 逐步学习Go-Slice(切片还可以多挖一下)
原地算法(in-place algorithm,也称就地算法)是不需要额外的数据结构就能变换输入数据的算法。不过,分配少量空间给部分辅助变量是被允许的。不是原地就是非原地,非原地就是要分配额外的内存空间来存储数据。
2024-04-13 21:43:59
996
原创 Go 认证与授权(Authentication)
处理认证和授权是业务系统场景的问题,不论你是在云上还是哪儿,同事各种编程语言和框架都会提供相应的解决方案,如Python的Flask-JWT, Java的自定义注解或拦截器,.NET的Attribute等。无论使用哪种方法,都需要对相关的技术有深入的理解,并且在编程时要时刻注意,防止忘记使用注解,或者把注解放错位置。阅读包含大量注解的代码也会变得困难,找不到注解的定义,或者感觉控制流程被隐藏起来了。Go语言提供了更简洁清晰的解决方案。Go允许我们直接定义一个认证处理器并将其附加到注册路由上。
2024-04-13 21:42:34
697
1
原创 MySQL limit N offset M 速度慢?来实际体验下
在对大表进行LIMIT和OFFSET操作时,随着偏移量(OFFSET)的增加,性能会显著下降。由于 MySQL 必须首先跳过OFFSET之前的所有行,才能获取到LIMIT指定的数据量,因此当OFFSET值较大时,这会导致显著的性能开销,尤其是在没有对排序列添加索引的情况下。通过性能测试得出,即使LIMIT的值相同,越大的OFFSET会使 MySQL 扫描的行数越多,因此执行时间越长。当没有索引支持ORDER BY子句时,即使是小范围的LIMIT查询,随着OFFSET的增加,查询性能会急剧下降。
2024-04-10 22:16:33
1411
原创 逐步学习Go-sync.RWMutex(读写锁)-深入理解与实战
Go中提供了读写锁:sync.RWMutex。sync.RWMutex是Go语言提供的一个基础同步原语,它是Reader/Writer Mutual Exclusion Lock的缩写,通常被称为"读写锁"。读写锁允许多个读锁同时拥有者,但在任何时间点只允许一个写锁拥有者,或者没有锁拥有者。
2024-04-10 13:24:05
2184
原创 深入理解k8s kube-proxy
k8s中的Pod是临时的,因为Pod中运行的是我们的应用,我们的应用可能随时会崩溃,崩溃了以后k8s会为我们重新创建,我们不能用Pod的IP通信,因为Pod每次崩溃重启IP会变更,而且Pod的数量也会改变。所以K8s就增加了Service来提供Pod统一的入口。Service提供了连接一个或者多个的Pod静态地址。我们可以这么理解:进入k8s集群的流量先到达Service,然后流量被重定向到Pod,同时Service保证流量不转发到不健康的Pod。
2024-04-09 15:02:29
1660
1
原创 逐步学习Go-WaitGroup(Goroutines协作的神器——Go WaitGroup浅析)
想象一下,你的应用程序启动了一大堆goroutines来处理各种任务,咱们的主goroutine需要等待它们都跑完才能继续进行。这时候,WaitGroup就登场了。简单来说,WaitGroup用来等待一组goroutines的结束。主goroutine会通过调用Add()方法来告知WaitGroup需要等待多少个goroutines。每当一个子goroutine完成任务后,就调用Done()方法表示它跑完了。主goroutine则可以通过Wait()方法阻塞自己,直至所有子goroutine都告一段落。
2024-04-05 20:16:28
772
原创 逐步学习Go-sync.Once(只执行一次)Exactly Once
sync.Once是一个会执行且仅执行一次动作的对象。该对象在第一次使用后不能再被复制。在 Go 内存模型的术语中,sync.Once的Do方法中的函数f返回的操作,相对于任何对once.Do(f)的调用返回的操作,都具有“同步优先”的顺序。简单来说,即使在并发环境下,函数f也只会在首次调用once.Do(f)时执行。每个sync.Once对象仅适用于执行一次动作。也就是说,如果多次调用了once.Do(f),仅第一次的调用会激发函数f的执行,即使每次调用once.Do(f)时函数f的值都有所不同。
2024-04-05 20:03:57
1161
原创 一次MySQL事务的旅程:Buffer Pool, Binlog, Redo Log揭秘
MySQL中一次事务涉及了各种Buffer,Log和表空间,主要涉及:Buffer Pool, Binlog, Undo Log, Redo Log以及表空间。我们来探讨下。Buffer Pool主要存放在内存中,它是一个缓存区域,用来缓存InnoDB读取的数据页和索引页。此外,它也暂存了那些待写入磁盘的修改后的数据页,也就是“脏页”。
2024-04-02 20:34:25
1323
原创 Docker工作流
我们需要将Dockerfile定义的步骤进行docker构建打包为docker镜像,打包镜像时我们需要使用Docker CLI或者一个构建工具(Docker Compose)或者CI/CD系统来基于Dockerfile构建Docker镜像。Docker容器是Docker镜像的实例,关系就像是程序和进程一样,Docker镜像是一个静态的程序,当基于这个镜像运行时就称为容器。一旦你的Docker镜像打包完成,那么就可以基于这个Docker镜像创建并运行Docker容器。
2024-04-01 21:44:03
1531
原创 MySQL 8.0 的魔法:即刻列操作——再也不用等待了
在MySQL 8.0.12版本之后我们不用为大表添加列问题担心了,然后MySQL 8.0.28版本之后我们不用为大表删除列而担心了。
2024-03-31 21:02:42
1307
原创 解决MySQL幻读?可重复读隔离级别背后的工作原理
在大多数情况下,MySQL的可重复读(RR)事务隔离级别为绝大多数业务场景提供了适当的一致性保证,并有效地通过MVCC和Next-Key Locks机制解决了幻读问题。尽管如此,RR隔离级别可能会由于锁机制而导致某些性能问题,特别是在密集型的写操作或高并发场景时。如果业务需求对数据的实时一致性要求不是特别严格或者你可以在应用层处理这些问题,并且更加关注于系统性能,可以考虑将事务隔离级别降低到读提交(RC)。读提交隔离级别在某些情况下可以提供更高的并发性,因为它只在必要时锁定数据行,以此减少锁争用。
2024-03-30 23:08:58
1865
1
原创 在Windows上使用WSL 2和VS Code搭建Linux开发环境
最近在Windows下使用golang开发一个网络通信工具,网络库使用了字节开源的netpoll,这个网络库实现了高性能的RPC解决方案,但是有一个小点影响了我Windows开发:不支持Windows(Windows这么受嫌弃~)。我开发的这个小工具本来也不会运行在Windows上,运行在Linux上。但是它不支持Windows难免会影响我的开发,所以我就在Windows上使用WSL启动了一个Ubuntu,然后VS Code安装了WSL插件就可以在直接连Ubuntu进行开发了。
2024-03-30 16:47:10
1396
原创 深入理解Docker-使用Docker有什么优势?
我们先给出Docker官网给出的定义来看下Docker是什么?Docker加速你应用的构建,共享和运行。
2024-03-30 16:44:43
936
原创 逐步学习Go-Select多路复用
这里又有多路复用,但是Go中的这个多路复用不同于网络中的多路复用。在Go里,select用于同时等待多个通信操作(即多个channel的发送或接收操作)。
2024-03-28 21:06:10
1086
原创 逐步学习Go-协程goroutine
协程并不是一个新概念了,协程已经被很多语言使用了,比如:Java 19的VirtualThread,Python的asyncio, JavaScript ES6中的async/await, C#, Kotlin,…协程就是轻量级线程,协程和操作系统的重量级线程的关系是M:N,一般M\
2024-03-27 23:35:01
840
原创 逐步学习Go-并发通道chan(channel)
"Communicating Sequential Processes"(CSP)这个词组的含义来自其英文直译以及在计算机科学中的使用环境。var channel名称 chan channel类型// 类型自动推断channel名称 := make(chan channel类型, buffer数量(int可以为0))COPY// 定义了一个channel,还没有make,不确定是否为有缓冲和无缓冲channel// 定义了一个chnnel, 容量为0,无缓冲channel。
2024-03-27 21:02:02
1012
原创 自增不再简单:深入探索MySQL自增ID的持久化之道
数据持久化和一致性的重要性设计系统时要考虑到异常情况,如果没有考虑到异常情况,出一些意料之外的问题你会很蒙蔽全局唯一ID的重要性,这个ID非常重要,要是混乱了,你的饭碗可能瞬间都没了,而且后面的就刷库吧。
2024-03-25 21:31:06
1381
原创 告别MySQL查询缓存:了解8.0版本改革背后的真相!
MySQL 从8.0版本开始彻底移除了查询缓存(Query Cache),是不是我们用太多Redis导致MySQL的查询缓存没有了用武之地?其实并不是这样,主要还是因为MySQL查询缓存对MySQL的可扩展性问题和性能瓶颈的影响。
2024-03-24 21:37:01
1650
原创 MySQL 排序的那些事儿
如果涉及排序,可以把sort_buffer_size设置大点如果使用Tmpfs就把MySQL物理内存配置的大点如果使用xfs/ext4就用高速SSD硬盘。
2024-03-23 23:59:23
1607
3
原创 MySQL 8.0-索引- 不可见索引(invisible indexes)
好了,那我们可以对不可见索引下定义了。不可见索引是MySQL 8.0引入的一个索引开关,主要是用来控制优化器在进行SQL优化时是否使用该索引,如果对索引设置了不可见,那么SQL优化器就不会使用这个索引。也就是说,这个索引对SQL优化器透明或者SQL优化器眼瞎看不到它。
2024-03-23 23:55:42
1224
原创 你是不是MySQL老司机?来看看这些explain结果你能解释吗?[害羞]
表结构表数据行数这里Extra为什么是Filesort?这里Extra为什么Using index从这儿你可以猜出我MySQL的版本吗?这里Extra为什么是NULL?这里Extra为什么是Filesort?你知道平时SQL该怎么写了吗?
2024-03-23 22:40:09
195
原创 Reactor 模式全解:实现非阻塞 I/O 多路复用
我们还是先使用文字拆解来看看每个词是什么意思吧。好了,有了以上的背景或许你已经对I/O多路复用有了自己的理解和定义。这儿我根据自己的理解来对I/O多路复用进行定义:I/O多路复用就是使用一个或者几个进程或者线程来完成大量通道或者数据源的事件监控和处理。非阻塞I/O是相对于阻塞I/O而言的,它们之间的区别就是你进行I/O操作时是否阻塞你后续的执行。非阻塞不会阻塞后续执行,而阻塞会。这就好比:你用某App网上下单到店取一样。假设你直接到店里面用手机下单,你必须在店里等待食物准备好。
2024-03-23 17:11:13
1494
1
原创 MySQL高效连接查询秘籍:掌握这四种Join算法
两个for循环进行简单联接 – Nested Loop Join排序好的数组,二分查找 -Index Join对数组进行排序,查找匹配 – Sort Merge Join对数组进行哈希,哈希查找 – Hash JoinMySQL主要使用了以上的Join算法,我们只是大概模拟,MySQL实现比我们代码复杂多了。算法名称时间复杂度描述O(M * N)适合小数据集,大数据集很慢。Index JoinO(M log N)适用于有索引的数据集。
2024-03-23 17:09:14
850
原创 Spring Boot是如何确定ApplicationType的
spring boot application type WebApplicationType source code 源码
2023-03-17 20:30:00
572
原创 Java NIO Buffer
但是有一个场景是,数据没有读取完成之前,你需要要先写入一些数据时,可以调用compact函数,这个函数会把没有读取完的数据拷贝到Buffer开始处,然后把position设置为n(n为未读取数据的长度),limit设置为capacity。每次调用一次put()或者putXXXX()时,position+n(n为你写入的字数,如果写入一个字,则position+1,如果你写入字数组,position+数组.长度)写模式下,posistion累加,limit和capacity不变,即可以写入的最大字数。
2023-03-16 12:30:34
378
原创 最近遇到的一个项目风险及解决方案
背景我参与的是一个软件项目,我在这个软件项目的角色是一个技术负责人。项目角色及人数构成产品经理1个前端开发2个后端开发2个,包括我测试2个问题在项目进行到中期的时候,由于一些原因测试从两个变更为一个,但是迭代的测试工作量并没有减少,项目还还要如期交付上线。但是两个测试设计了一百多条手动测试用例一个人无法执行完成,可能导致有线上问题,如果遇到线上问题客户不得暴躁如雷。解决方式首先,我们和客户开会说明了这个问题,并给出解决方案:全员参与测试1. 全员变
2023-03-08 21:40:35
175
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人