- 博客(62)
- 收藏
- 关注
原创 Raft与Gossip协议原理
通过Leader选举和日志复制,确保分布式系统的强一致性和高可用性。:通过随机传播和去中心化设计,实现大规模系统中的最终一致性。
2025-03-07 14:15:10
995
原创 接口性能优化
2.sql优化(select *、union all替换union、小表带大表、批量操作、多用limit、in中值太多、连接代替子查询、合理字段类型、索引数量不宜过大)4.重复调用(多次查数据库,加batch接口,死循环,无限递归代码bug)3.等待其他调用接口(并行调用、数据异构,数据冗余保存)1.索引(没加索引或索引失效、explain查看)11.日志条数及慢查询日志。
2025-02-10 11:44:46
137
原创 Go 闭包匿名函数
匿名函数是没有指定函数名称的函数,可以用其赋值和直接运行;用匿名函数一般是希望这个函数调用一次,定义匿名函数的时候直接调用,如果需要被多次调用,可将匿名函数赋值给一个变量(不常用,想多次调可直接去定义个普通函数);匿名函数多用于实现回调函数和。
2025-01-21 12:04:58
370
原创 Go CSP并发模型
Go语言采用了模型。并发单元(goroutine)之间不直接共享内存,而是通过来传递数据。Go语言通过实现了这种通信机制。
2025-01-20 12:56:47
1024
原创 Go channel关闭方法
1、不能在消费端关闭channel(基础原则,单生产者或多生产者均不能在消费端关闭);2、多个生产者时,不能对channel执行关闭;3、只有在唯一或最后唯一剩下的生产者协程中关闭channel,之后通知消费者没有值可以读,才能确保向一个已经关闭的channel中不再发送数据;
2025-01-20 11:50:37
502
原创 Go 并查集
return parent[x]=get(parent[x]) //路径压缩,向上查询根节点时,把路径经过的节点都 挂到根节点下,减少树高。秩合并,通过h[]数组记录每个集合的深度,树低的挂在树高下,如果相等都可以,一般优化get即可;var parent [size]int //size为实际问题数组长度。parent[i]=i //自身为根节点。
2024-01-12 11:37:18
539
原创 Http 状态码
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。通常,这只是暂时状态。413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
2024-01-11 16:06:34
726
原创 Go基础 Map
2.原key进行hash后取低B位,新桶比旧桶B位多一位,所以key的新位置 有两种,一种还是原来的桶,一种是多出一位的B为1的二进制桶,可以 归纳为hash&(2n-1)确定原来桶hash在新桶的位置;结构体也是类似,如果结构体只包括基础类型,可以比较,如果包括slice、map、channel则不能直接比较;
2023-11-17 15:02:17
188
原创 Go基础 Slice
2. 传值与传指针,go中均是值传递,但由于slice的底层结构为指针,所以传slice的值时候在函数中更改会影响原来slice,但不会影响cap和len,如果想改变这两值,需要传入silce指针;(2) var s = []int{} // 空切片,与nil比较false,原因为底层结构array=0xc42003bda0(所有都是这个地址),len=0,cap=0。(1) s:=make([]int,5) // 零切片,len和cap不为0,只为0或nil的切片。4. 遍历slice。
2023-11-17 15:01:23
189
原创 计算机网络 close_wait、time_wait原因与排查
解决方法:keep-alive、允许time wait端口复用、快速处理资源及复用,改配置文件;大部分是程序原因,发了ack包未发送fin包,大多是代码问题;time wait状态是主动关闭连接方存在的状态;close wait是被动关闭的一方存在的状态;原因是出现大量的短连接,过多会吃资源;1.调用close前出现死循环;3.未释放连接导致阻塞;未调用close()2.调用前抛出异常;
2023-11-17 15:00:19
334
原创 消息队列基础
可将发邮件和发短信非核心逻辑异步处理,在信息入库后写入mq,后两个逻辑进行异步调用,最终的时间为sum(50,5(写入mq的时间,一般比较快))=55ms。2.发布订阅模式:通过topic,一个消息可以被多个消费者消费,即可以被重复消费;mq解耦:A系统数据写入mq,下游系统如需要进行订阅,不需要不订阅,基于此,A系统的影响不大;B系统新增接口后A系统需要更改代码,C系统废弃后A系统需要删除调用C系统的逻辑;:场景如用户注册,信息入库50ms,发邮件50ms,发短信50ms。:A系统调用B、C系统;
2023-11-17 14:39:07
123
原创 数据库存储 LSM Tree、b、b+ Tree
结构特点:优点:缺点:适用场景:结构特点:优点:缺点:适用场景:结构特点:优点:缺点:适用场景:选择B+树:选择LSM Tree:选择B树:组合使用B+树和LSM Tree:优化LSM Tree的读取:
2023-11-17 14:35:56
207
原创 Mysql 日志Binlog、Undo、Redo Log及ACID实现
Binlog:Server 层的日志,用于数据复制和数据恢复。Undo Log:存储引擎层的日志,用于事务回滚和 MVCC。Redo Log:存储引擎层的日志,用于崩溃恢复。原子性:Undo Log 和事务控制语句。一致性:约束、触发器和隔离级别。隔离性:锁机制、MVCC 和事务隔离级别。持久性:Redo Log、WAL 和双写缓冲。
2023-11-17 14:33:22
114
原创 数据库类别及选型
强一致:关系型数据库或NewSql数据库,否则选Nosql数据库高并发读写:分布式或内存数据库全文搜索:搜索引擎数据库时间序列:时序数据库合理的选型,可以确保数据库系统满足业务需求并具备良好的性能和扩展性。
2023-11-17 14:30:49
149
原创 Redis 基础
底层数据结构动态字符串(sds),redis基于c开发,字符数组为char[],redis没有采用这种,自己构建了一个结构体struct{intlen;sds获取长度更快(直接len字段o(1),c为o(n)),可以防止缓存区溢出,有free字段,空间够直接拼接,不够再扩容;rdb快照(n分钟m次记录),二进制写入磁盘,重启会丢数据,但相比于aof快,fork子进程,共享内存,边同步边执行业务,会丢失一次记录;底层数据小用压缩列表,多用字典+跳表,查找o(1),排序,范围获取o(logn);........
2022-07-25 13:49:13
392
原创 Go 逃逸分析
逃逸分析主要是进行内存优化,go没有直接操作内存的方法,采用自动gc,了解内存分配机制,可以写 高质量的代码;go有两种方式分配内存,堆和栈,堆分配昂贵,栈分配廉价,所有内存优先栈分配,但栈分配要求变量生命周期和内存足迹(和一个变量相关的所有内存块)在编译时确定;逃逸分析是用于堆和栈分配进行选择,通过在编译时期做gc,编译器追踪变量在代码块的作用域,判断变量在整个运行周期是否在运行时完全可知,通过校验可以在栈上分配;否则逃逸到堆上;go build -gcflags '-m' 可以显示变量逃逸分
2022-05-10 21:00:13
908
原创 Go gmp调度模型
协程调度模型:协程是轻量的线程,在线程基础上,没有上下文切换,无锁,效率高;协程有自己的调度模型,即gmp模型;g:代表go关键字开的协程;p:逻辑处理器,绑定一个m处理g;包括上下文信息,维护了自己需要调度的g的局部队列,一个go新建优先放入局部队列,局部队列小于256,超过拿一半放入全局队列;由GOMAXPROCS设置个数;m:对应一个系统线程,内核态;m绑定p处理局部go队列,如果没有从全局队列拿一批,若全局队列没有,从其他p局部队列偷一半(即m空闲时,会从其他队列偷取,不会直接销毁线程)
2022-04-22 14:25:18
477
原创 Go gc屏障
golang gc:三色标记法,1.5版本开始三色:黑白灰过程:1.开始所有节点均为白色;2.stw,扫描所有根节点,标记为灰色;(根节点为编译时确定的全局变量,堆上指针,goroutine栈上指针,扫描过程中新指向堆的指针)3.扫描灰色节点,找到灰色节点引用的节点,将引用的节点置为灰色,当前灰色节点置为黑色;4.循环扫描灰色这个过程,(分层,每次一层递归),直到灰色节点为空;5.三色标记法,gc过程是和业务代码并行执行,业务代码会产生新的指针指向变动,会产生新的堆指针分配,需要
2022-04-16 14:50:46
740
原创 Go 快排、堆排序、二叉树各种遍历
快排二分+分治func QSort(arr []int,low,high int){ if low<high{ lo,hi:=low,high key:=arr[low] //可以优化key,取中位数 for lo<=hi{ for arr[i]<key{ i++ } for arr[j]>ke
2022-02-16 19:01:31
399
原创 Goland安装
1.下载:https://www.jetbrains.com/go/download/other.html2.地址:http://www.zzvips.com/article/137092.html http://www.520xiazai.com/soft/jetbrains-eval-reset.html3.GOLINT:https://blog.youkuaiyun.com/jinglexy/article/details/79673262...
2022-01-14 11:03:35
310
原创 计算机网络、操作系统、数据库基础
base:1.计算机网络2.数据库3.操作系统special:1.算法2.项目other:1.软技能2.沟通3.逆商
2022-01-09 17:53:20
1676
转载 C++ 并查集
例子就是杭电上的畅通工程:http://acm.hdu.edu.cn/showproblem.php?pid=1232首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支。如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了;如果是2个连通分支,则只
2020-05-20 20:29:36
204
原创 C++ 各种排序算法分类、时间空间复杂度、实现
分类:比较排序、非比较排序比较排序:通过元素间的比较进行排序,时间复杂度不能超过O(nlogn),不在乎数据规模和分布情况。包括:交换(冒泡,快排)、插入(简单插入,希尔)、选择(简单选择,堆排序)、归并排序。非比较排序:不通过元素比较进行排序,时间复杂度O(n),但需要空间确定位置,对数据规模与分布有要求。包括:基数排序、计数排序、桶排序。算法复杂度排序方法 时间复杂度(平...
2020-04-07 19:59:10
4651
原创 C++ const*修饰 指针数组与数组指针
int *const ptr //看const后边修饰的值,此为ptr为指针,即ptr指向不能改变int const * ptr //const修饰* 表示*ptr不能改变,即ptr指向的内容不能改变const int *ptr = int const *ptr在英文里,”*“ 被念做,pointer to...
2019-09-16 13:42:05
997
原创 C++ 直接插入排序
最基本代码:#include <iostream>using namespace std; int main(){ vector<int > a; int k=a.size(); int j; for (int i = 1; i < k; i++) { if (a[i] < a[i - 1]) { int temp...
2019-09-05 20:18:30
170
转载 C++ 智能指针shared_ptr,unique_ptr,weak_ptr,auto_ptr
C++四种智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 后三个是c++11支持,第一个被c++11废弃。智能指针作用:管理指针,在函数结束时忘记释放指针造成内存泄漏时,使用智能指针可以很大程度避免内存泄露,在函数结束时自动释放内存空间,不需要手动释放内存空间。1. auto_ptr(c++98,c++11废弃)采用所有权模式。a...
2019-09-01 17:19:39
208
原创 C++ kmp代码
kmp简洁代码:#include "cstdio"#include "iostream"#include "cstring"using namespace std;int _next[20];void getNext(string p){ int len = p.size(); int i = 0, j = -1;//前后缀 _next[0] = ...
2019-08-25 13:44:07
307
转载 C++ kmp
1. 引言本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱。所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文。然近期因开了个算法班,班上专门讲解数据结构、面试、算法,才再次仔细回顾了这个KMP,在综合了一些网友的理解、以及算法班的两位讲师朋友曹博、邹博的理解之后,写了9张PPT,发在微博上...
2019-08-25 13:07:29
290
原创 C++ static与const
static作用:static全局变量:限定了作用域,隐藏作用。普通全局变量和static全局变量均存储在静态存储区,普通全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,普通全局变量在各个源文件中都是有效的;静态全局变量的作用域只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。static全局变量只初使化一次,防止在其他文件单元中被引用。static局...
2019-08-24 12:40:42
222
原创 360 内推笔试编程题1
罗列正方体求表面积,在二维数组存储数据,所存的数据代表当前坐标摆放多少正方体,求最后的表面积(各个正方体的面,存在覆盖问题),只记得这么多AC代码#include <iostream>#include <cstdio>using namespace std;int main(){ int n,m; int a[1009][1009]={0...
2019-08-18 19:51:31
193
原创 C++ 符号优先级
优先级 操作符 描述 例子 结合性 1 () [] -> . :: ++ -- 调节优先级的括号操作符 数组下标访问操作符 通过指向对象的指针访问成员的操作符 通过对象本身访问成员的操作符 作用域操作符 后置自增操作符 后置自减操作符 (a + b) / 4; arra...
2019-08-18 14:51:13
22255
转载 C++ 指针数组与数组指针
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。p=a; //将该二...
2019-08-16 14:40:10
289
原创 C++ define与const
(1)define作用于编译的预处理阶段,const作用于编译、运行(2)define无数据类型,只是简单的字符串替换,const有数据类型检查(3)define替换多少次就有多少个副本,const只有一个副本(4)define不能调试,在预编译阶段已经替换掉(5)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。(6)const可节省空间,避免不必要...
2019-08-16 13:32:37
247
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅