- 博客(47)
- 收藏
- 关注

原创 go mutex.go 中 lock unlock 源码解析
go mutex.go 中 lock unlock 源码解析mutex 主要是根据锁状态已经信号量来做锁的优化以及锁的升级// 加锁的逻辑type Mutex struct { state int32 sema uint32}const ( mutexLocked = 1 << iota // mutex is locked mutexWoken mutexStarving mutexWaiterShift = iota // 3)
2020-12-22 16:42:06
431
2

原创 spring-security 以及 spring security oauth2 结合jwt 做 token验证 新手入门到深入
**推荐入门系列之spring-security**要了解 spring security oauth2 必须先弄懂 spring security ,spring security oauth2 是基于spring security做的更上一层的封装,而spring security oauth2 ,更像是一种第三方授权的协议规范,学习spring security可以阅读源码,这里推荐一个源码系列 https://blog.csdn.net/fengyilin_henu/article/de
2020-06-03 16:26:45
457

原创 一个刚刚配置好的虚拟机使用桥接模式(直接复制网络)来自定义网络ip地址
首先关闭虚拟机防火墙若主机地址为1~50则需要更改网络 ip地址vi /etc/sysconfig/network-scripts/ifcfg-ens33将以下内容写入该文件(IPADDR需选择设置主机地址为51~255之间,若不确定主机地址是否未被使用可以用ping 命令尝试,连接不上代表未被使用),如例IPADDR="192.168.1.233"NETMASK="2...
2019-09-09 15:09:35
707
原创 raft 协议和etcd实战
防止某个节点因为出现分区后,恢复后,再次发起leader选举,此处因为他会先进入prevote阶段,因为此时该阶段回去判断是否日志索引记录多少,因此该节点不能进入leader选举流程。集群成员变更的时候,下线C-old节点的时候,可能会因为暂时失联再发起leader选举。如果出现网络分区(注意分区后节点数还是和分区前是一样的)因为此时其他节点大概率还是保持和leader通信的。如果新分区的节点需要经过preVote。
2024-05-23 18:08:46
411
原创 cpu缓存一致性
volatile指令的作用cpp的volatile和java的特性不一致c++ volatile 的特性禁止编译器的优化禁止编译器的代码的重排序强制从缓存中读取,失效寄存器java volatile 的特性:是基于 LOCK 指令 实现的在cpp的特性的基础之上1、实现了一个全屏障(越过cpu的乱序执行、指令重排序等,保证了数据的顺序一致性)缓存的一致性保证是通过 MESI 协议(总线嗅探机制)+ 内存屏障 实现的,因此为什么说。
2024-01-08 19:31:04
1471
1
原创 item2使用expect 自动ssh登录并且使用rzsz下载问题记录
登录脚本login.sh (和expect 脚本放在同一个目录)expect 脚本item2配置如下图所示。
2023-06-28 19:50:13
390
原创 go 中快速查看 包/模块 依赖
要深刻理解 go 中,包和模块关系的不同模块是 module, 是工程包的综合,就是 go mod 文件中的第一句包是 一个module 下的一个一个目录。
2022-09-29 21:03:34
2683
原创 金字塔原理
分类,每一类分为 1-100 项,运用归纳法梳理出事项的共性,运用推理法推理出共性的原因,继续产生新的疑问和共性,以及因果链,最终找出问题或者结论,再寻找解决方案。二. 信息搜集(很重要)
2022-08-15 11:29:35
135
原创 理解 赋值拷贝构造函数,赋值拷贝构造运算符,移动赋值构造运算符,运算符重载 小例子
代码】理解 拷贝构造函数,右值拷贝构造函数,运算符重载 小例子。
2022-08-09 16:25:21
277
转载 Golang-Map中value是不可寻址可使用指针类型代替
Golang Map元素取址:package mainimport "fmt"type UserInfo struct { Uid string `json:"uid"` UserName string `json:"user_name"` Sex int `json:"sex"`}func main() { var user = make(map[string]UserInfo) uid := "0001" user[u
2022-04-27 16:30:57
664
原创 go老鸟也会经常出现 并发channal问题引起的协程泄漏
go中经常用于并发channal问题引起的协程泄漏例子:package mainimport ( "log" "runtime" "time")func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) go func() { for { log.Printf("当前 goroutine 数量为:%d\n", runtime.NumGoroutine()) time.Sleep(1 * time.Second)
2022-04-24 16:51:03
588
原创 理解 go defer和panic 使用的小例子
一个挺有趣的小例子package mainimport "fmt"func a() { defer b() fmt.Println("a")}func b() { defer c() panic("b")}func c() { defer catchPanic("f") defer f() panic("c")}func f() { [panic("f")](https://mp.weixin.qq.com/s/pxWf762ODDkcYO-xCGMm2g)}
2022-04-23 23:17:41
326
原创 网格服务 grpc 客户端封装-利用接口指针反射设置grpc客户端
// authsvr_grpc.pd.gopackage authsvrtype AuthClient interface {}// package handlerfunc TestInitRpcClient(t *testing.T) { var authclent authsvr.AuthClient // grpc serve 端口, grpc 客户端new 函数, grpc 客户端接口指针 InitMicroRpcClient(":9001", authsvr.NewAuthCl
2022-04-18 16:41:28
565
原创 go中 反射获取结构体变量值,组装cmd命令的小例子
// GocFlag is flag of profile APItype GocFlag struct { RootGocCmd GocCmd Name string `form:"name" json:"name"` Center string `form:"center" json:"center"` Force bool `form:"force" json:"force"` Servi
2022-04-03 13:03:45
669
原创 go中 **byte 转为 []byte 切片示例
const PtrSize = 4 << (^uintptr(0) >> 63)func main() { a := [...]byte{'1', '2', '3'} b := [...]byte{'a', 'b', 'c'} c := [...]byte{'A', 'C', 'D'} aptr := (*byte)(unsafe.Pointer(&a)) bptr := (*byte)(unsafe.Pointer(&b)) cptr := (*by
2022-02-15 10:55:23
721
原创 mysql 常见数据分析,统计数据 工作应用场景
-- 原始数据select c.system as `系统名`,a.srv_name as `服务`, DATE_FORMAT(a.created_at, '%Y %m') as `发布月份`, a.version as `制品版本` , pc.deploy_cluster_name as `发布集群` , b.`project_name` as `coding项目名称`, b.attribute as `发布特性`, a.created_at as `发布时间`, a.updated_at as `
2021-12-02 15:27:17
894
原创 awk 实际小例子的使用
awk 实际小例子的使用Fida Step-in Dog Harness Superior Reflective Puppy Vest60 59 58 57 56 50 49 48 59 47 26 47 50 20 56 59 58 49 50 26上面是原始数据,我会利用awk工具,提供一定的整理和修改将上面的数据为空的部分填充0awk -F'\t' -vOFS='\t' '{
2021-05-11 16:30:10
93
原创 Redis 原理难点
Redis 原理难点1、AOF rewrite 为什么要 写入aof_rewrite_buf、aof_buf两个缓存AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制。Redis 执行 fork() ,现在同时拥有父进程和子进程。子进程开始将新 AOF 文件的内容写入到临时文件。对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存(aof_rewrite_buf)中,一边将这些改动追加到现有 AOF 文件的末尾(即添加到aof_buf中):这样即使在重写的中途发生停机,
2021-04-08 20:31:28
412
原创 对于新建文件,重命名文件,出来对数据的落盘,还得保证父目录的落盘
对于新建文件,重命名文件,出来对数据的落盘,还得保证父目录的落盘对目录落盘代码(系统:mac M1,语言:go)var path = "./test/"f,err := os.Open(path)err = Fsync(f)if err != nil { log.fatal(err.error())}func Fsync(f *os.File) error { _, err := unix.FcntlInt(f.Fd(), unix.F_FULLFSYNC, 0) return er
2021-03-16 15:05:34
123
原创 slice的几个灵活运用的例子
slice的几个灵活运用的例子slice 的 中间添加 某个值 numbers := []int{1} copy(numbers[1:],numbers[0:]) fmt.Println(numbers) var index = 1 numbers = []int{1,3,6} numbers = append(numbers,0) copy(numbers[index+1:],numbers[index:]) numbers[index]=2 fmt.Println(number
2021-03-05 18:50:41
188
原创 写时复制copyonwrite的demo,示例
阅读etcd源码时候,看到一个写时复制的实现,纪录一下package mainimport "fmt"type pgid uint64type txid uint64type meta struct { magic uint32 version uint32 pageSize uint32 flags uint32 freelist pgid pgid pgid txid txid checksum uint64}func main()
2021-03-03 15:30:47
229
1
原创 作为 int,以及int扩展类型的 潜在类型可以作为 数组的索引
作为 uint64 潜在类型可以作为 数组的索引(骚操作)type pgid uint64arr := []byte{1,2,3,4}fmt.Println(arr[pgid(2)])
2021-03-01 20:00:36
144
原创 go 中 unsafe 操作中 切片参数越界并不会报panic
go 中 unsafe 操作中 切片参数越界并不会报panicfunc main() { var ids []int // 这里报错,panic: runtime error: index out of range [0] with length 0 // fmt.Println(ids[0]) fmt.Println("size of unsafe.Sizeof(ids[0]):", unsafe.Sizeof(ids[0]))}输出 : size of unsafe.Sizeof(id
2021-02-26 19:16:54
420
原创 go 利用 cas 无锁化顺序输出 数字
go 利用 cas 无锁化顺序输出 数字package mainimport ( "fmt" "sync" "sync/atomic")var a int64func main() { ch := make(chan int64,100) wg := sync.WaitGroup{} wg.Add(1) go func() { wg1 := sync.WaitGroup{} defer wg.Done() defer close(ch) for i := 0; i
2020-12-25 11:18:46
192
原创 go,java,c,c++ 当中分别对变量,指针和引用的使用
1、在Java 中 对象的使用2、在Go 中 结构体的使用3、在C 中 结构体的使用4、在C++ 中 结构体的使用1、在Java 中 对象的使用我们知道Java中只有引用,没有指针,Java new 一个对象 的内存空间是分配在堆上,有种说法是对象优先会分配在栈上面,基本类型肯定分配在栈上,而string类型的内存空间是分配在堆上,对string类型的+操作,只会生成新的string字符串。 由于java 对象中只有引用,所以当多个变量引用相同的对象是,可能会影响其他对象的值。
2020-12-17 11:22:33
245
原创 golang 源码中对 interface的灵活运用
interface的灵活运用工作期间阅读了一下 go 一个 mysql driver github.com/go-sql-driver/mysql@v1.5.0/errors.go:9 的 源代码,发现几个 interface 灵活应用的的小例子,特此记录一下1.struct TCPAddr 和 struct sockaddr 之间的灵活转换1. struct TCPAddr 和 struct sockaddr 之间的灵活转换我们先来看一下几个定义(都是定义在/usr/local/go/src/n
2020-12-16 13:58:26
244
1
原创 Kubernetes终止Pod生命周期以及执行流程
Pod 设置为Terminating状态,并从所有服务的Endpoints列表中删除此时,Pod停止,但是Pod中运行的容器不受影响PreStop Hook被执行preStop Hook发送容器特殊命令或者Http请求到Pod中此时,Kubernetes将向Pod中的容器发送SIGTERM信号,这个信号即通知容器他们很快将进行关闭。Kubernetes等待优雅的终止此时,Kubernetes等待指定的时间称为优雅终止宽限期。默认情况下是30秒(可以修改.spec.terminationG..
2020-11-02 12:08:32
754
原创 tcpdump 命令使用
tcpdump 命令使用tcpdump -i any (-s 0 不限制展示包大小,可省略)-n -tttt (-A 以文本形式输出内容,可省略) tcp port 3001
2020-09-03 18:03:57
879
原创 mysql 执行计划 explain 的 应用
mysql> explain select * from user where user_id = (select user_id from acticle where article_id = 33) union select * from user where user_id = (select user_id from acticle where article_id = 14) \G...
2019-11-30 16:55:24
111
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人