- 博客(361)
- 资源 (2)
- 收藏
- 关注
原创 网络带宽检测
client执行:iperf3 -c serverip。当前节点,根据连接统计流量:iftop -i eth0。当前节点,根据程序统计流量:nethogs。当前节点,实时的进出带宽统计:nload。server执行:iperf3 -s。测试两个节点之间的带宽上限。
2024-12-05 14:16:53
141
原创 go sync.WaitGroup
通过原子操作对协程计数器加减,若协程计数变为0,则将等待计数设置为0,并释放所有被信号量阻塞的协程。计数器:原子变量,高32位用于为协程计数,低32位为等待计数(被Wait阻塞等待)。若协程计数非0,则通过CAS将等待计数+1,并通过信号量阻塞协程。若协程计数为0,则直接跳过。信号量:用于阻塞协程。
2024-11-26 14:33:44
356
原创 go T 泛型
Go 语言在 1.18 版本引入了泛型(Generics)特性,可以编写更通用、可复用的代码,泛型可以用于:泛型函数、泛型结构体、泛型接口。
2024-11-12 11:44:40
600
1
原创 go reflect 反射
返回的是实际的值,它不仅封装了类型信息,还封装了该值的实际数据。此外,它还要处理值的可变性、指针封装等因素,因此它的开销通常大于。Go 的运行时会通过反射把数据和类型信息组合在一起,从而允许我们在运行时动态地访问或修改数据。它仅仅是对静态类型信息的封装,因此开销相对较低,特别是当类型信息已经在程序启动时加载到内存中的时候。对象,该对象封装了传入对象的实际数据(指向底层数据的指针)以及该数据的动态类型。会包含关于该类型的元数据信息,包括类型的大小、字段、方法等。的结构体,它是类型信息的底层实现。
2024-11-11 16:23:03
695
原创 go map 映射
它的数组是由一组桶组成,每个桶是一个链式结构,可以存储8个键值对,当发生hash冲突时首先存在桶内,如果桶满了,就在桶后面连接溢出桶来存储键值对。如果达到负载因子值或溢出桶的数量超过正常桶的数量(或者超过上限值1
2024-11-08 17:53:46
543
原创 go channel 通道
调度器会负责管理协程的状态,协程被channel阻塞时进入等待队列,此时调度器可以将其他可运行的 goroutine 调度到 CPU 上。:当一个 goroutine 执行接收操作时,Go 调度器会检查 channel 的状态,接收的 goroutine 会被挂起,并加入到。发送和接收队列是FIFO队列,阻塞线程按先进先出顺序被调度,活跃线程优先于阻塞队列中的线程被调度。:当一个 goroutine 执行发送被阻塞时,发送的 goroutine 会被挂起,并加入到。发送与接收是相对于协程而言的。
2024-11-05 18:01:43
425
原创 go sync.Cond 条件变量
条件判断:判断条件是否满足,满足则向下执行,不满足则执行wait方法,释放锁,并阻塞当前协程,等待条件满足。具体地,Go 的调度器会将该 goroutine 加入到一个等待队列,并让其挂起,直到条件变量被通知。:当一个等待的 goroutine 被唤醒时,调度器会将它的状态恢复为可执行状态,并将其重新调度。:当条件变量被通知时,当前 goroutine 会从挂起的状态中恢复执行,并重新获取锁,继续执行剩下的代码。)控制的,因此在被唤醒后,goroutine 会重新获取锁,然后继续执行。
2024-11-05 16:30:20
898
原创 yum 报错:error: rpmdb: BDB0113 Thread/process 32266/140516331530304 failed: BDB1507 Thread
【代码】yum 报错:error: rpmdb: BDB0113 Thread/process 32266/140516331530304 failed: BDB1507 Thread。
2024-04-30 12:54:40
256
2
原创 linux 配置服务开机启动
可以通过创建一个自定义的 Dockerfile,并在其中使用CMD或ENTRYPOINT指令来指定启动时运行的命令。编辑 /etc/rc.local 文件,并在exit 0语句之前添加你的应用程序路径。在运行docker run命令时,可以使用-d参数后跟启动命令来确保进程在后台运行。systemctl enable myapp.service #配置开启启动。ExecStart=/path/to/myapp #启动命令。WantedBy=multi-user.target #依赖。
2024-04-11 15:59:13
574
原创 go 二分查找、上下边界
1、标准库的二分查找func upperBound0(nums []int, target int) int { //upper := sort.SearchInts(nums, target) upper := sort.Search(len(nums), func(i int) bool { return nums[i] >= target }) return upper}func lowerBound0(nums []int, target int) int { //
2022-02-13 14:43:13
609
原创 go string和[]byte对比
1、性能对比string 是常量,修改值会重新分配内存地址做内存拷贝,本质是一个结构体,含指针、len;[]byte 是变量,修改值不触发内存地址变动,扩容时是2倍策略,因此减少了频繁的内存拷贝,本质是一个结构体,含指针、len、cap。2、特性string 可以进行比较,可以作为map的key[]byte 不能进行比较,不能作为map的key[]byte和string区别golang string和[]byte的对比...
2022-02-11 20:37:55
1198
原创 go 文件流转发
先读入内存再返回的方式,不仅耗时,而且会占用较大的内存; 直接通过文件流方式,读一点,返回给前端一点,这样的方式更高效。package testimport ( "fmt" "io" "io/ioutil" "log" "net/http" "os" "testing")func TestServer(t *testing.T) { http.HandleFunc("/download/remote/stream", downloadRemote...
2022-02-09 01:18:22
1112
原创 go 性能监控(pprof、profile、gc、trace)
2、对于接口性能测试,可以使用wrk进行压测:(https://github.com/wg/wrk 或 https://github.com/adjust/go-wrk)访问 http://localhost:8080/debug/pprof,可以查看相关性能参数,但是这里不是图形化的,看起来不直观。其中,profile的分析需要设置总采样时间,不设置的话默认是30s,采样频率默认是100,即10ms。1、导入 pprof 包,开启 pprof 的web服务,启动程序。
2022-01-25 00:31:29
170
原创 mysql 并发问题
1、查看并发连接数show processlist; -- 正在执行线程的列表show global status like 'Threads%'; -- 正在执行的线程的数量 Threads_connectedshowglobal status like '%connections%'; -- 查看历史最大连接数show global status like '%Max_used_connections%'; -- 查看历史最大连接数及其发生时间 Max_used_connections ..
2022-01-20 16:25:14
670
原创 gorutine 的9种状态
_Gidle = iota // 0_Gidle means this goroutine was just allocated and has not yet been initialized._Gidle 表示这个 goroutine 刚刚被分配,还没有被初始化。_Grunnable // 1_Grunnable means this goroutine is on a run queue. It is not currently executing user code. The sta
2022-01-15 23:49:40
1051
原创 go slice 切片
(1)扩容方式:当切片容量256时,约1.25倍扩容(1.25x+192)。(2)append 和 reslice 取片段,如果不引发扩容,就共用底层数组及cap(向后扩展),只是起始位置可能不一样,对新 slice 的操作会影响旧 slice。(3)append 和 reslice 取片段,如果引发扩容,新 slice 与原 slice 指向不同的底层数组。
2022-01-02 14:36:08
129
原创 幂等问题总结
1、什么是幂等接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。幂等是指一个操作无论执行多少次,产生的效果是一样的。幂等与是不是分布式高并发都没有关系,关键是所执行的操作是不是幂等的。2、开发中的幂等场景(1)页面上快速点击按钮重复提交表单、重复刷新页面,导致产生了多条重复的数据、放大了更新增量导致错误的结果。(2)接口调用超时,通常会增加重试。第一次请求接口超时了,请求方没能及时获取返回结果(此时有可能已经成功了),为了避免返回
2022-01-02 01:37:52
565
原创 Mysql 按逗号拆分
1、建测试表create table table_to_split ( `id` int unsigned auto_increment primary key, `name_list` VARCHAR(64));2、插入测试数据insert into table_to_split (id, name_list) values (1, 'name01,name02'), (2, 'name03,name04,name05');3、查询select * fro...
2021-12-22 13:02:13
1795
原创 mysql 备份表
1、备份mysqldump -u xxx -p xxx -h 127.0.0.1 -P 6379 dbName tbName> tbName.sql2、脚本#!/bin/bashdatetime=$(date "+%Y%m%d_%H%M%S")echo ${datetime}user=rootpass=roothost=127.0.0.1port=6379db=dbNamemysqldump -u ${user} -p${pass} -h ${hos
2021-12-01 16:35:10
895
原创 go 编译部署问题
1、go get 出现如下错误x509: certificate signed by unknown authority(1)切换代理GOPROXY=https://goproxy.ioGOPROXY=https://goproxy.cn
2021-11-27 15:01:18
303
转载 go 错误处理
对于Go语言(golang)的错误设计,相信很多人已经体验过了,它是通过返回值的方式,来强迫调用者对错误进行处理,要么你忽略,要么你处理(处理也可以是继续返回给调用者),对于golang这种设计方式,我们会在代码中写大量的if判断,以便做出决定。func main() { conent,err:=ioutil.ReadFile("filepath") if err !=nil{ //错误处理 }else { fmt.Println(string(conent)) }}
2021-11-22 22:45:47
159
原创 go 发布依赖到 git
1、新建本地项目,创建 module使用 github 标准格式:github.com/用户名/仓库名go mod init github.com/xiaozhu/hello // 指定名称,创建 module2、安装依赖,编写代码go tide // 安装缺少的依赖,清理无用的依赖go get // 安装缺少的依赖go get "xxx@v1.0.0" ...
2021-11-20 16:47:12
609
原创 git stash
1、暂存git addxxxgit stash #只会暂存已经 add(tracked)的内容,因此最好先 addgit stash save '暂存的名称' #指定暂存的名称2、查看所有暂存git stash list3、恢复暂存(1)指定暂存号恢复,并从 list 中删除git stash pop stash@{index}(2)指定暂存号恢复,但不从 list 中删除(建议)git stashapply stash@{i...
2021-11-11 14:35:48
3058
原创 gorm 事物锁
1、先读再写func UpdateUser(db *gorm.DB, id int64) error { tx := db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() } }() if err := tx.Error; err != nil { return err } user :=
2021-11-11 09:37:40
1097
leach+pegasis_ns234.patch
2020-01-16
stm32F407 SPI1/SPI2 DMA 方式读写 CH376S
2019-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人