- 博客(57)
- 收藏
- 关注
原创 MySQL产生死锁的根本原因及解决方法
优化后该语句执行计划如下:优化后的执行计划使用了索引查找,将大幅提升该查询语句的性能,降低了锁定资源的时间,同时也减少了锁定资源的范围,这样就降低了锁资源循环等待事件发生的概率,对于预防死锁的发生会有一定的作用。一个进程被杀死,它的事务被取消,它的锁被释放,死锁中涉及到的另一个进程就可以完成它的工作并释放锁,所以就不具备产生另一个死锁的条件了。而语句1则获取了1686247页上的更新锁在等待1689766页上的更新锁,两个语句等待的资源形成了一个环路,造成死锁。2. 对语句更新的相关字段建立包含索引。
2024-03-08 09:34:00
1134
原创 mysql中select、from、where、group by、having、order by 、limit执行顺序
【代码】mysql中select、from、where、group by、having、order by 、limit执行顺序。
2024-03-07 11:13:46
815
原创 关于php原生开发与主流php框架使用心得
本人是主要做php项目的,以前是从来不屑于用框架的,由于项目原因,这几年对比较流行的框架,都涉猎了一下,毕竟甲方是老大,人家制定让用什么,你必须要用,有时候你可以劝他们改变初衷,但有时候你只能遵从或者放弃,…至于因为这点原因放弃,那是不可能的,不过好在硬着头皮用了一遍之后,发现在开发效率方面确是大大提高。现在就谈一下我的一点感受。
2024-03-04 17:50:31
1239
原创 mysql优化
1.找到项目中的慢查询sql,设置一条sql语句查询超时多少秒就属于慢查询,然后将其记录到日志系统2. 使用explain分析每一条慢查询语句的性能:查询的序列号:查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。
2024-02-27 12:09:16
822
原创 Go的CSP并发模型实现M, P, G简介
G: goroutine(协程,也叫用户态线程)M: 工作线程(内核态线程)P: 上下文(也可以认为是cpu,逻辑cpu数量,可以在程序启动的时候设置这个数量,gomaxprocs函数设置)
2024-02-26 10:44:39
1068
1
原创 Go Module常用命令
go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等使用go module之后我们可不用将代码放置在src下了。
2024-02-24 23:32:35
1038
1
原创 五分钟带你了解啥是JWT
1. JSON Web Token是什么JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。2. 什么时候你应该用JSON Web Token下列场景中使用JSON Web Token是很有用的:2.1: Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资
2022-04-20 17:38:31
185
原创 golang 第三方包的选择方式
当开发一个项目的某一个功能的时候,需要使用到当三方的package,在GitHub上面找的时候相同功能的package有很多个,这个时候以什么方式来帮助我们选择使用那个包呢?star 数越多越好issue 数越低越好项目维护活跃,最后更新日期越接近越好有清楚的版本区分(查看项目的 Releases 标签)...
2021-02-03 21:35:34
262
原创 Go Modules 日常使用
1.初始化go mod init2. Go Proxy因国内访问外网受限,一般我们都会配合 Go Proxy 使用,以防止使用 go get 获取源码包时花费时间过长或无法下载:go env -w GOPROXY=https://goproxy.cn3.go.mod每一次的 go get 都会同时修改 go.mod 和 go.sum 文件。这两个文件是下载依赖包的主要依据。go.mod 类似于 PHP 中的 composer.json ,而 go.sum 则是 composer.lock。
2021-02-02 11:17:27
135
原创 golang 导入包的下划线和点的区别
在golang进行导入包时,我们有时会遇到包的前面需要加下划线或者点,一直不明白是什么意思,随即进行了搜索:包前是下划线_:当导入一个包时,该包下的文件里所有init函数都会被执行,但是有时我们仅仅需要使用init函数而已并不希望把整个包导入(不使用包里的其他函数)包前是点.:import(.“fmt”)这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”)可以省略的写成Println(“hello wo
2021-02-01 22:11:21
414
原创 Go和PHP之间的主要区别
Go基本上是一种可用于快速机器代码编译的编程语言,而PHP基本上是服务器端脚本,也是一种用于Web开发的通用编程语言。Go是一种静态类型的语言,而PHP是一种动态类型的语言PHP将核心PHP语言用于模板目的,因此浏览器通过发送的HTML代码处理PHP代码,并将输出发送到浏览器,而对于GO,通常使用简单的模板系统。Go语言得到了社区的广泛支持,并且由于它也得到了Google的支持,因此其社区支持比PHP有所增加。PHP是动态类型的,而Go为采用类似于动态语言的模式的环境提供了支持。Go具有在PHP.
2021-01-31 20:37:36
2649
原创 Rpc和Http的区别
一.远程调用方式无论是微服务还是分布式服务(都是SOA,都是面向服务编程),都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?常见的远程调用方式有以下几种:RPC:Remote Produce Call远程过程调用,类似的还有RMI(Remote Methods Invoke 远程方法调用,是JAVA中的概念,是JAVA十三大技术之一)。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型RPC的框架:webservie(c
2021-01-30 21:39:03
896
原创 怎么用go代码使用protoc编译器编译proto文件生成的pb.go文件
package mainimport ( "fmt" "ProtocDemo/example" "github.com/golang/protobuf/proto" "os")func main() { fmt.Println("Hello World. \n") msg_test := &example.Person{ Name: proto.String("Davie"), Age: proto.Int(18), From: proto.String("Chi
2021-01-29 21:48:29
650
原创 热加载调试 Hot Reload
Python 的 Flask框架,有 debug 模式,启动时传入 debug=True 就可以热加载(Hot Reload, Live Reload)了。即更改源码,保存后,自动触发更新,浏览器上刷新即可。免去了杀进程、重新启动之苦。Gin 原生不支持,但有很多额外的库可以支持。例如github.com/codegangsta/gingithub.com/pilu/fresh这次,我们采用 github.com/pilu/fresh 。go get -v -u github.com/pilu/
2021-01-28 22:08:49
751
原创 Golang timer定时器
timer 计时器用于在指定的Duration类型时间后调用函数或计算表达式。如果只是想指定时间之后执行,使用time.Sleep()使用NewTimer(),可以返回的Timer类型在计时器到期之前,取消该计时器直到使用<-timer.C发送一个值,该计时器才会过期定义计数器timer := time.NewTimer(time.Second * 2)停止定时器timer.Stop()强制的修改timer中规定的时间timer.Reset(0) ticker 周期性的ti
2021-01-27 22:03:04
614
原创 slice的用法以及和数组的区别
slice是go的一个语言特性,其实有点类似于cpp的vector,可变长度,可以扩展空间。今天详细看了下,做下总结。slice本质上是一个区间,原型是[]T,大致的实现是这样的:type slice struct { first *T len int cap int}可以看到的是是一个指向数组的指针,那么在修改slice的时候会改变数组的值。和数组的用法差别不是太大。基于数组的创建:var myArrary [3]int = [3]int{1,2,3}var
2021-01-26 21:19:03
1156
原创 goroutine
原始版本:func add(a int) int { //假设处理业务逻辑需要100ms time.Sleep(time.Millisecond * 100) return a}func main() { sum := 0 start := time.Now().UnixNano() / 1e6 for i := 0; i < 100; i++ { sum += add(i) } end := time.Now().UnixNano() / 1e6 fmt.Printf("
2021-01-25 22:29:44
82
原创 go递归循环遍历文件夹
/**dirname 目录名称level 层级关系 */func listFiles(dirName string,level int) { //level用来记录当前递归的层次,生成带有层次感的空格 s :="|--" for i:=0;i<level;i++ { s = "| "+s } fileInfos,err := ioutil.ReadDir(dirName) if err != nil { log.Fatal(err) } for _,fi := ran
2021-01-24 12:09:12
460
原创 go复制文件的三种方式
方法一:io包下的Read()和Write()方法实现我们可以通过io包下的Read()和Write()方法,边读边写,就能够实现文件的复制。这个方法是按块读取文件,块的大小也会影响到程序的性能该函数的功能:实现文件的拷贝,返回值是拷贝的总数量(字节),错误func copyFile1(srcFile,destFile string)(int,error){ file1,err:=os.Open(srcFile) if err != nil{ return 0,err } file2,er
2021-01-23 19:04:34
686
原创 time包的使用
package mainimport ( "fmt" "math/rand" "time")func main() { //1.获取当前时间 t1 := time.Now()//time.Time//结构体类型 fmt.Printf("%T\n",t1)// fmt.Println(t1) //2.获取指定时间 //调用的只是time包下的函数Date(),返回一个结构体对象 t2 := time.Date(2009,7,15,16,30,28,0,time.Local)//
2021-01-22 15:56:24
163
原创 go Panic & Recover
PanicGo 的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等。这些运行时错误会引起painc异常。一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。通常,我们不需要再次运行程序去定位问题,日志信息已经提供了足够的诊断依据。因此,在我们填写问题报告时,一般会将panic异常和日志信息一并记录。由于pan
2021-01-21 18:23:17
196
原创 使用golang errors包自定义错误
发现Golang很多开源的package都是使用Error来定义错误,其实我自己更加的习惯利用返回的值进行判断。 虽然这么说,但Golang的error定义还是有意思的,合理就返回nil,不合理就返回Error的错误下面说说Golang的自定义错误的用法。在go里定义错误的方式有这么两种,但都需要你的返回值是error类型的1. 第一种方式是使用golang标准库包errors 来定义错误。使用方法很是简单,只需要 return errors.New(“string”) 。 这样就是一个最简单的错误返
2021-01-20 17:20:02
428
原创 go中make和new的区别
make和new都是golang用来分配内存的內建函数,且在堆上分配内存,make 即分配内存,也初始化内存。new只是将内存清零,并没有初始化内存。make返回的还是引用类型本身;而new返回的是指向类型的指针。make只能用来分配及初始化类型为slice,map,channel的数据;new可以分配任意类型的数据...
2021-01-19 20:35:20
376
原创 float32和float64的本质区别
首先我们需要知道何为bits和bytes?1. bits:名为位数2. bytes:为字节3. 简单的数就是MB和G的关系!那么8bits=1bytes,下面是各个单位的相互转化!那么float32和float64有什么区别呢?1. 数位的区别2. 一个在内存中占分别32和64个bits,也就是4bytes或8bytes3. 数位越高浮点数的精度越高它会影响深度学习计算效率?float64占用的内存是float32的两倍,是float16的4倍;比如对于CIFAR10数据集,如果采用fl
2021-01-18 19:27:36
6953
原创 Int8,Int16,Int32,Int64 有啥不同呢?看了立马就懂!
大家有没有写了很久代码,还不知道这个Int8,Int16, Int32, Int64有什么区别呢?或者是为什么后面的数字不一样呢?初步了解了一下,才清楚这个东西。先来扫盲一下计算机存储单元,在计算机内部,信息都是釆用二进制的形式进行存储、运算、处理和传输的。信息存储单位有位、字节和字等几种。各种存储设备存储容量单位有KB、MB、GB和TB等几种计算机的基本的存储单元有:位(bit):二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。二进制的一个“0”或一个“1”叫一位。字节(Byt
2021-01-18 19:23:59
2108
原创 回调函数和闭包
回调函数和闭包当函数具备以下两种特性的时候,就可以称之为高阶函数(high order functions):函数可以作为另一个函数的参数(典型用法是回调函数)函数可以返回另一个函数,即让另一个函数作为这个函数的返回值(典型用法是闭包)一般来说,附带的还具备一个特性:函数可以作为一个值赋值给变量。f := func(){...}f()由于Go中函数不能嵌套命名函数,所以函数返回函数的时候,只能返回匿名函数。先简单介绍下高阶函数,然后介绍闭包。高阶函数示例例如,将函数作为另一个函数的
2021-01-17 17:24:22
488
原创 字符串和编码
字符编码我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。由于计算机是美国人发明的,因此,最早只有127个字符被
2021-01-17 13:42:50
123
原创 strconv函数
func main() { /* strconv包:字符串和基本类型之间的转换 string convert */ //1.bool类型 s1 := "true" b1,err := strconv.ParseBool(s1)//将字符串转换为bool类型 if err != nil { fmt.Println(err) return } fmt.Printf("%T,%t\n",b1,b1) ss1 := strconv.FormatBool(b1)//将bool类型转
2021-01-16 21:51:48
333
原创 字符串函数
s1 := "helloworld" //1.是否包含指定的内容--》bool fmt.Println(strings.Contains(s1, "woc"))//false //2.是否包含chars中任意的一个字符即可 fmt.Println(strings.ContainsAny(s1, "abcd"))//true //3.统计substr在s中出现的次数 fmt.Println(strings.Count(s1, "llo"))//1 s2 := "20190525课堂笔记.tx
2021-01-16 21:26:49
85
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人