自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

猛犸象

一只不知疲惫的猛犸

  • 博客(17)
  • 收藏
  • 关注

原创 mb_ord 与 bin2hex

mb_ord返回的是字符在 Unicode 字典中的位置,对于单字节字符来说,这个值就是该字符在磁盘上实际存储的值,但是对于多字节而言,比如汉字,就不一定了,因为这还要取决于你使用的什么编码,比如 utf-8 ,不同的编码会导致存储和传输的规则不一样。比如我们实际存储的就是 utf-8 这一列,而 mb_ord 返回的是二进制这一列。参考所以说 mb_ord 并不能作为字符的二进制值。bin2hex它可以将字符转换成二进制,然后转换成十六进制,是实际存储的值,参考以上面的中字为例bin2h

2021-10-28 18:38:50 193

转载 补码原理-负数的二进制表示

文首我们都知道负数在计算机中是以补码(忘了补码定义的戳这里)表示的,那为什么呢?本文尝试了解补码的原理,而要想理解它,首先得理解算术中“模”的概念。所以首先看一下什么是模,然后通过一个小例子来理解补码。1 模(Modulo)1.1 什么是模数In mathematics, modular arithmetic is a system of arithmetic for integers, where numbers “wrap around” upon reaching a certain val

2021-10-27 16:33:57 964 1

原创 二进制,十六进制 PHP

二进制,十进制,十六进制之间的转换bindec 二进制转十进制decbin 十进制转二进制hexdec 十六进制转十进制dechec 十进制转十六进制二进制转十六进制dechex(bindec("1110")) // e 十六进制转二进制decbin(hexdec("f")) // 1111 base_convert(string $number, int $frombase, int $tobase) 任意进制之间的转换base_convert("11111111",

2021-10-22 16:50:53 224

转载 Go进程的HeapReleased上升,但是RSS不下降造成内存泄漏?

事情是这样的,线上一个服务,启动后RSS随任务数增加而持续上升,但是过了业务高峰期后,任务数已经下降,RSS却没有下降,而是维持在高位水平。那内存到底被谁持有了呢?为了定位问题,我把进程的各项Go runtime内存指标,以及进程的RSS等指标持续采集下来,并以时间维度绘制成了折线图:内存折线图本着DRY原则,我把采集和绘制部分专门制作成了一个开源库,业务方代码可以十分方便的接入,绘制出如上样式的折线图,并通过网页实时查看。git地址:https://github.com/q191201771/p

2021-10-21 16:55:10 1364

原创 查看程序连接了哪些动态链接库so

linux 系统:ldd /usr/sbin/nginxmac系统:otool -L /usr/local/bin/ffmpeg

2021-10-21 16:35:49 2716

转载 如何分析golang程序的内存使用情况

前言本篇文章介绍如何分析golang程序的内存使用情况。包含以下几种方法的介绍:执行前添加系统环境变量GODEBUG='gctrace=1'来跟踪打印垃圾回收器信息在代码中使用runtime.ReadMemStats来获取程序当前内存的使用情况使用pprof工具注意,本篇文章前后有关联,需要顺序阅读。从十来行的demo开始package mainimport ( "log" "runtime" "time")func f() { container := make([]i

2021-10-21 16:11:41 7487 1

原创 golang中的定时器使用误区,定时器回收,select

golang的定时器虽然使用起来很简单,但是依然又一些细节需要注意的。首先来看一个例子func s1() { var count int for { select { case <-time.Tick(time.Second * 1): fmt.Println("case1") count++ fmt.Println("count--->" , count) case <-time.Tick(time.Second * 2) : fmt.Prin

2021-10-21 11:33:24 1125

原创 golang中的break与goto

终止循环for i := 0; i < 10; i++ { if i > 5 { break }}终止+跳转J: for j := 0; j < 5; j++ { for i := 0; i < 10; i++ { if i > 6 { break J //现在终止的是j 循环,而不是i的那个 } fmt.Pr

2021-10-20 17:35:21 256

原创 golang空结构体不占用内存

fmt.Println(unsafe.Sizeof(struct{}{})) // 0fmt.Println(unsafe.Sizeof("")) // 16fmt.Println(unsafe.Sizeof(0)) // 8fmt.Println(unsafe.Sizeof([]int{})) // 24fmt.Println(unsafe.Sizeof(map[string]string{})) // 8fmt.Println(unsafe.Sizeof(0.00)) // 8

2021-10-19 14:22:00 401

转载 Go实现 in_array

in 是一个很常用的功能,有些语言中可能也称为 contains,虽然不同语言的表示不同,但基本都是有的。不过可惜的是,Go 却没有,它即没有提供类似 Python 操作符 in,也没有像其他语言那样提供这样的标准库函数,如 PHP 中 in_array。Go 的哲学是追求少即是多。我想或许 Go 团队觉得这是一个实现起来不足为道的功能吧。为何说微不足道?如果要自己实现,又该如何做呢?我所想到的有三种实现方式,一是遍历,二是 sort 的二分查找,三是 map 的 key 索引。遍历遍历应该是我们

2021-10-19 11:43:34 3298

原创 go 的编译执行流程,build,run

build命令简述在Golang中,build过程主要由go build执行。它完成了源码的编译与可执行文件的生成。go build接收参数为.go文件或目录,默认情况下编译当前目录下所有.go文件。在main包下执行会生成相应的可执行文件,在非main包下,它会做一些检查,生成的库文件放在缓存目录下,在工作目录下并无新文件生成。介绍build选项编译流程的演示需要go build提供的几个选项协助,执行go help build查看。如下:$ go help build...-n 不执行地

2021-10-18 17:48:08 926

原创 尽量少用相对路径

相对路径,相对的是工作目录(working directory),也就是当前命令行所处的目录(pwd查看);目录结构:D:\dev\php\magook\trunk\server\testdira.php t/ b.php c.txt测试a.phpecho file_get_contents("t/c.txt");D:\dev\php\magook\trunk\server\testdir>php a.phpaaaaaaaaaaaaaaaD:\dev\php\ma

2021-10-18 14:42:38 216

原创 报错file_get_contents(): SSL operation failed with code 1

报错内容file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed这和本地环境有关,是否开启了ssl验证。解决方式:修改配置,或者修改代码$stream_opts = [ "ssl" => [ "verify_

2021-10-15 15:38:28 2212

转载 Go 中 net/http 包的timeout超时设置

这里主要强调的是作为客户端,发起http请求时的超时设置,特别是微服务场景下某下游的服务阻塞卡顿,这样会造成其他的级联上下游都雪崩了。先看代码package mainimport ( "bytes" "encoding/json" "fmt" "io/ioutil" "net" "net/http" "time")var tr *http.Transportfunc init() { tr = &http.Transport{ MaxIdleConns: 100

2021-10-11 16:48:04 5624 1

转载 真实环境下大内存 Go 服务性能优化一例(转载)

本文是在上家的 case, 以前很多人在公开大会上拿该案例做分享,所以觉得有印象的同学勿喷,虽然冷饭,但是原创,而且干货十足 _有时大家很不理解的现象,明明 call RPC 时设置了超时时间 timeout, 但是 Grafna 看到 P99 latency 很高,why ???不要犹豫,要么是 timeout 设置不合理,比如只设置了单次 socket timeout, 并没有设置 circuit breaker 外层超时。参考 你真的了解 timeout 嘛还有一种情况就是 GC 在捣乱,我们知

2021-10-11 15:32:55 219

原创 链路追踪工具 skywalking

链路追踪工具 skywalking一、关于应用性能监控 APM(Application Performance Monitor)对于单体应用,性能分析相对简单,不同的语言都提供了工具,在代码层面埋点,然后跑一个压力测试,最后以图形化的方式看到每个调用的耗时,以此来分析性能。对于微服务系统,在解决了单个服务的性能之后,各个服务之间的调用链的性能分析就变的错综复杂,于是需要有链路追踪系统。常见apm参考对比及工具选型SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现在是

2021-10-10 16:10:09 1770

原创 集群模式下,redis锁的问题,红锁

在使用redis来实现分布式锁的时候,如果redis是集群的,比如1主4从,这种主从模式就会存在延迟问题,导致加锁出现问题。此时就应该使用红锁的方案,即在代码中不依赖于主从,将这5台机器视为平等的,在代码中依次对这5台机器去加锁,只有成功的机器数大于一半就算加锁成功,其他机器也就没必要再去操作了,相反,如果大于一半的机器失败了,就算失败,其他机器也就没必要再去操作了。由于是遍历操作这5台机器,也就不用关心有没有机器挂掉了,因为挂掉了自然算加锁失败。红锁方案要求机器数为奇数。而且从原理上来看,每一个请求都

2021-10-10 12:06:53 1794

空空如也

空空如也

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

TA关注的人

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