- 博客(40)
- 收藏
- 关注
原创 MySQL与Oracle对比及区别
性能卓越,服务稳定,很少出现异常宕机;开放源代码无版本制约,自主性及使用成本低;历史悠久,社区和用户非常活跃,遇到问题及时寻求帮助;软件体积小,安装使用简单且易于维护,维护成本低;品牌口碑效应;支持多种OS,提供多种API接口,支持多种开发语言,对流行的PHP,Java很好的支持。
2024-11-12 11:43:55 1324
原创 云原生架构图
云原生(Cloud Native) 是一种软件架构和开发方法论,旨在充分利用云计算环境的优势,使应用程序更具有弹性、可伸缩性、可靠性和效率。其中,“Cloud Native” 应用程序通常采用微服务架构,使用容器技术进行部署,倡导自动化运维和持续集成/持续部署。整个设计思想旨在使应用程序能够更好地适应云环境中的快速变化和不断增长的需求。
2024-11-09 16:51:07 249
原创 Go 中的 Context实现原理以及正确使用方式
在 Go 语言中,Context 包是用于传递请求范围数据、取消信号和截止时间的机制。它通常被用来处理 goroutine 之间的通信和取消。Context 包是 Go 语言内置的,它可以很方便地使用,而不需要额外的依赖。Context 包是一个轻量级的工具,它提供了一个标准的接口,用于在 goroutine 之间传递请求范围的数据、取消信号和截止时间。Context 包实现了一种类似于树状结构的数据结构,其中每个节点都表示一个请求范围。
2024-11-05 22:07:38 1423
原创 Go 位运算符的使用
假如一个列表中有2*N+1个数,其中一个数字只出现了一次。位清空的意思是 **假如有 两个变量 var1 &^ var2 作位清空运算 **,第一位如果为0结果为0 第一位如果结果为1 结果为1 利用这个特性数值右移一位 循环计算即可。两个运算符左侧总是为要进行位移操作的变量,右侧为需要移动的位数值。就有点懵,以为是0左移32位 不明白为什么结果为32,就是因为把32当做要位移的位数了。当两个数二进制位有一个为1时当前位置1,同为0的时候当前位才会置0。当两个数二进制位同为1的时候当前位置1,否则置0。
2024-11-04 21:57:59 430
原创 Golang channel底层原理
假如channel为缓冲区通道,从channel缓冲区头部(recvx)读数据,将sudog对应写协程数据,写入缓冲区尾部(sendx),唤醒写协程。默认情况下,读写未就绪的channel(读没有数据的channel,或者写缓冲区已满的channel)时,协程会被阻塞。但是当读写channel操作和select搭配使用时,即使channel未就绪,也可以执行其它分支,当前协程不会被阻塞。当存在阻塞读协程,直接把数据发送给读协程,唤醒并将其放入协程可运行队列中等待调度运行。从环形缓冲区读数据。
2024-11-03 21:25:33 1092
原创 Golang gRPC
我们的第一步(正如您从gRPC 简介中了解到的那样)是使用协议缓冲区定义 gRPC服务以及方法请求和响应类型。有关完整的.proto文件,请参见。要定义服务,您需要在.proto文件中指定一个名为service的服务...然后,您在服务定义中定义rpc方法,指定它们的请求和响应类型。gRPC 允许您定义四种服务方法,所有这些方法都在RouteGuide服务中使用简单 RPC,其中客户端使用存根将请求发送到服务器并等待响应返回,就像普通的函数调用一样。服务器端流式 RPC。
2024-11-03 13:01:07 1007
原创 Golang new() make var []int 使用的具体区别
初始化数组为nil,可以append插入数据,不能用下标t[i]=1插入数据;初始化数值长度为0,没有append方法,t[0]=1也会在编译时报错;初始化数组长度>0,没有append方法,用下标t[i]=1的方法可以正常插入数据;初始化一个长度为0容量为nil的切片即make([]int, 0) ,t = appeng(t,1)可以正常插入数据;初始化一个长度为0容量为nil的切片即make([]int, 0,0),t = appeng(t,1)可以正常插入数据;
2024-11-01 08:30:00 1674
原创 数组排序简介-桶排序(Bucket Sort)
桶排序的稳定性取决于桶内使用的排序算法。如果桶内使用稳定的排序算法(比如插入排序算法),并且在合并桶的过程中保持相等元素的相对顺序不变,则桶排序是一种。以 [39,49,8,13,22,15,10,30,5,44] 为例,演示一下桶排序算法的整个步骤。将待排序数组中的元素分散到若干个「桶」中,然后对每个桶中的元素再进行单独排序。对于数据分布不均或空间限制严格的场景,选择桶排序时需谨慎评估其适用性。反之,则桶排序是一种。
2024-10-31 20:23:22 196
原创 数组排序简介-归并排序(Merge Sort)
采用经典的分治策略,先递归地将当前数组平均分成两半,然后将有序数组两两合并,最终合并成一个有序数组。
2024-10-31 17:54:17 303
原创 数组排序简介-计数排序(Counting Sort)
数组排序简介-计数排序(Counting Sort) 定义一个大小为排序范围的计数数组 countscounts,用于统计每个元素的出现次数。其中:数组的索引值 num−nums_min 表示元素的值为 num。数组的值 counts[num−nums_min] 表示元素 num 的出现次数。
2024-10-30 08:58:16 611
原创 数组排序简介-堆排序(Heap sort)
数组排序简介-堆排序(Heap sort) 借用「堆结构」所设计的排序算法。将数组转化为大顶堆,重复从大顶堆中取出数值最大的节点,并让剩余的堆结构继续维持大顶堆性质。
2024-10-30 08:18:05 574
原创 数组排序简介-快速排序(Quick Sort)
采用经典的分治策略,选择数组中某个元素作为基准数,通过一趟排序将数组分为独立的两个子数组,一个子数组中所有元素值都比基准数小,另一个子数组中所有元素值都比基准数大。然后再按照同样的方式递归的对两个子数组分别进行快速排序,以达到整个数组有序。
2024-10-29 11:36:10 893
原创 数组排序简介-希尔排序(Shell Sort)
将整个数组切按照一定的间隔取值划分为若干个子数组,每个子数组分别进行插入排序。然后逐渐缩小间隔进行下一轮划分子数组和对子数组进行插入排序。直至最后一轮排序间隔为1,对整个数组进行插入排序。
2024-10-29 11:24:16 582
原创 数组排序简介-插入排序(Insertion Sort)
数组排序简介-插入排序(Insertion Sort) 将数组分为两个区间:左侧为有序区间,右侧为无序区间。每趟从无序区间取出一个元素,然后将其插入到有序区间的适当位置。插入排序在每次插入一个元素时,该元素会在有序区间找到合适的位置,因此每次插入后,有序区间都会保持有序。
2024-10-28 22:45:54 160
原创 数组排序简介-选择排序(Selection Sort)
将数组分为两个区间:左侧为已排序区间,右侧为未排序区间。每趟从未排序区间中选择一个值最小的元素,放到已排序区间的末尾,从而将该元素划分到已排序区间。
2024-10-28 22:35:59 376
原创 数组排序简介-冒泡排序(Bubble Sort)
冒泡排序(Bubble Sort) 经过多次迭代,通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面,值较大的元素从前面移到后面。
2024-10-28 22:10:12 348
原创 go.mod 与go.sum作用
go.sum文件在 Go 模块管理中起着至关重要的作用,它主要用于确保依赖模块的完整性和一致性。当使用go mod进行依赖管理时,go.sum文件记录了每个直接依赖和间接依赖模块的版本哈希值。这些哈希值是根据特定的哈希算法(通常是 SHA-256)计算得出的,用于验证下载的模块内容是否与预期一致。例如,假设你的项目依赖了模块,在go.sum。其中,v1.7.4是模块的版本号,后面的一大串字符是该版本模块内容的哈希值。2、内容结构。
2024-10-25 11:16:07 1579
原创 goalng框架Gin解析
本文通过案例的形式,说明gin框架的基本用法,主要列举后端的案例,前端和相对简单的知识点未在此分析;过完案例后可以有个基本的印象:就是封装和简便。
2024-10-24 16:10:47 647
原创 链表基础知识
链表中间插入元素」的操作需要将 curcur 从链表头部移动到第 ii 个链节点之前,操作的平均时间复杂度是 O(n)O(n),因此,「链表中间插入元素」的时间复杂度是 O(n)O(n)。「链表中间删除元素」的操作需要将 curcur 从链表头部移动到第 ii 个链节点之前,操作的平均时间复杂度是 O(n)O(n),因此,「链表中间删除元素」的时间复杂度是 O(n)O(n)。:一种线性表数据结构。「链表头部插入元素」的操作与链表的长度无关,因此,「链表头部插入元素」的时间复杂度为 O(1)O(1)。
2024-10-23 21:25:26 1085
原创 数据结构概述
所谓数组,是有序的元素序列。如将有限个类型相同的变量的集合命名,那么这个名称就是数组名。数组是用于存储多个相同类型数据的集合。通常用Array表示,也称之为。
2024-10-22 17:49:46 435
原创 MySQL 存储引擎
存储引擎就是存储数据、建立索引、更新 / 查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可称为表类型。(MySQL5.5 之后默认的存储引擎 ——InnoDB查询当前数据库的存储引擎在创建表时指定存储引擎#语法-- 建表语句末尾使用ENGINE关键字,指定存储引擎。CREATE TABLE 表名(字段1 字段1类型 [COMMENT 字段1注释],字段2 字段2类型 [COMMENT 字段2注释],字段3 字段3类型 [COMMENT 字段3注释],...
2024-10-22 10:29:43 1749
原创 MySQL事务隔离级别
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔 离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就 越好, 但并发性越弱.数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ。
2024-10-21 22:32:01 272
原创 MySQL通配符使用
如,”[abc]” 则匹配”a”、”b”或者”c”,“[a-z]”匹配任何小写字母,而“[0-9]”匹配任何数字。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。“_” 匹配单个字符,”\_” 匹配”_”“.” 匹配任何单个的字符。— 查寻以 三 结尾的名字。
2024-10-20 22:11:50 264
原创 MySQL 基础查询
按照ID去重,DISTINCT的字段要放在前面,不会再继续在FIRST_NAME上去重判断;如果需要多字段去重,需要用到group by,这个后面讲;
2024-10-17 21:44:31 573
原创 Golang协程池
Go语言以其轻量级的协程(goroutine)机制著称,使得并发编程变得简单而高效。然而,无限制地创建goroutine可能会导致资源耗尽,特别是在高并发场景下。因此,设计并实现一个协程池成为管理和优化程序性能的关键。
2024-10-16 21:14:19 1070
原创 Golang面试题_03
在Go语言中,channel是一种类型,它可以用来在协程之间传递数据。值传递 引用传递;Go 语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct 等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan 等这些),这样就可以修改原内容数据。
2024-10-16 20:49:34 406
原创 Golang面试题_02
在多个Goroutine并发访问共享资源时,为了保证数据的一致性,我们可以使用互斥锁(Mutex)来控制对共享资源的访问。并发是Golang的一大特点,也是其在处理大规模数据和高并发场景下具有优势的重要原因。通过使用Goroutine和Channel,我们可以将任务分解为多个独立的执行单元,并利用Channel进行数据传输和同步。这样可以避免不必要的内存分配。通过在循环外部定义和初始化变量,并在迭代中重复使用,可以降低内存分配的频率。通过使用Golang提供的异步IO机制,可以实现非阻塞的系统调用。
2024-10-16 09:52:11 1226
原创 Golang面试题_01
Map在编程过程中往往需要存储大量的键值对数据。当存储的键值对数量超过了map的初始容量时,map就会自动进行扩容。扩容是指当map达到一定的负载因子时,系统自动重新分配更大的内存,并将原有的键值对重新映射到新的内存空间上。这样可以避免因为数据过多而导致的性能下降。
2024-10-15 18:12:06 1949
原创 Golang标准库和常用第三方包
基于 ringbuffer 的无锁 golang workpool。msgfmt (格式化字符串,将 % 更换为变量名)基于 ringbuffer 实现的队列。go 性能上报到 prometheus。go 性能上报到 influxdb。go 性能上报到 influxdb。可配置的 HTML 标签过滤。根据 IP 获取地理位置信息。可取消的 goroutine。生成 mock server。结构化日志处理 (json)打印 go 的详细数据结构。字符串格式处理(驼峰转换)命令行程序框架 cobra。
2024-10-14 22:46:45 769
原创 Golang GMP调度器原理
面对之前调度器的问题,Go 设计了新的调度器。在新调度器中,除了 M (thread) 和 G (goroutine),又引进了 P (Processor)。Processor,它包含了运行 goroutine 的资源,如果线程想运行 goroutine,必须先获取 P,P 中还包含了可运行的 G 队列。在 Go 中,线程是运行 goroutine 的实体,调度器的功能是把可运行的 goroutine 分配到工作线程上。
2024-10-14 12:15:32 881
原创 Golang垃圾回收机制及原理
一.Golang 垃圾回收回收算法:三色标记+混合写屏障1.回收算法演变 Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的**STW(stop the world)**,STW的过程中,CPU不执行用户代码,全部用于垃圾回收,这个过程的影响很大,Golang进行了多次的迭代优化来解决这个问题Go V1.3之前的标记-清除(mark and sweep)算法 缺点: STW,stop the world;让程序暂停,
2024-10-12 23:25:54 1014
原创 Golang 内存模型与内存分配机制
Golang 内存模型与分配机制 计算机存储体系 --->TCMalloc(Thread Cache Malloc的简称,是Go内存管理的起源) ---> Go内存管理(Go内存管理源自TCMalloc,但它比TCMalloc还多了2件东西:逃逸分析和垃圾回收) Page Span mcache mcentral mheap
2024-10-12 22:18:54 748
原创 Golang基础_02
闭包中的函数常常会引用外部的变量,这些变量可能是局部变量或函数的参数。如果闭包中的函数将这些外部变量持久化(返回函数、存储到全局变量等),那么这些变量就逃逸到了堆上,因为它们在函数执行完后仍然可以被访问。在闭包中,内部函数可以访问外部函数的变量,即使外部函数已经执行完毕,内部函数仍然可以使用外部函数的变量。因此,在设计闭包时,需要注意避免不必要的变量逃逸,尽量减少对堆的依赖,以提高代码的性能和效率。闭包定义的时候并不是真正的在执行,只有当我们调用的时候才真正的执行,每次执行的时候他都会去找到他。
2024-10-11 11:29:01 837
原创 golang 基础案例
golang 案例 sync.Map 的底层实现是通过哈希表来实现的 make 和 new 的区别 RPC pprof http UDP协议 闭包(Closure) 类型转换 ini error panic
2024-09-10 14:16:07 1091
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人