数据结构- 数组与链表
数据结构- 数组与链表数组数组(array)是一种线性数据结构,元素的位置称之为索引,在内存中存储的是连续索引的位置
常用操作初始化数组/* 初始化数组 */var arr [5]int// 在 Go 中,指定长度时([5]int)为数组,不指定长度时([]int)为切片// 由于 Go 的数组被设计为在编译期确定长度,因此只能使用常量来指定长度// 为了方便实现扩容 extend() 方法,以下将切片(Slice)看作数组(Array)nums := []int{1, 3, 2, 5, 4}
访问元素数组元素基于连续地址
得出:元素内存地址=数组内存地址(首元素地址)+元素长度×元素索引(内存地址偏移量)
插入元素中间插入一个元素时,该元素的所有元素往后移动一位
/* 在数组的索引 index 处插入元素 num */func insert(nums []int, num int, index int) { // 把索引 index 以及之后的所有元素向后移动一位 for i := len(nums) - 1; i > in ...
计算机网络-IPV4
计算机网络-IPV4分类编址的IPV4主要方法:
通过划分32Bit的IPV4地址,分为网络号和主机号
网络号:标记主机(或路由器的)的接口所连接到的网络
主机号: 标记主机(或路由器)
主要有五类地址:
A类地址:网络号8bit,主机号24bit,网络号的第一位固定为0
B类地址:网络号16bit,主机号16bit,网络号前俩位为10
C类地址:网络号24bt,主机号8bit,网络号前三位110
D类地址,多播地址,前面四位1110
E类地址:保留地址,前面四位1111
特点:
A、B、C类地址才分配给主机(路由器)
主机号全0是网络地址,不能分配给主机(路由器)
主机号全1是广播地址,不能分配给主机(路由器)
A类地址
最小网络号:1.0.0.0 最大网络号:126.0.0.1
全0保留地址,所以00000001(1.0.0.0)是最小网络号
01111111(127.0.0.1),是本地回环地址,不能指派
本地最小回环测试地址:127.0.0.1
本地最大回环测试地址:127.255.255.254
01111110(126.0.0.0),是最大 ...
Go的Context包
Go的Context包背景context 包是标准库中一个非常重要的组件,用于在不同 Goroutine 之间传递取消信号、超时警告和其他请求范围的值。它主要用于控制并发任务的生命周期,尤其是在复杂的网络服务和多层调用栈中。context 包的使用能够帮助开发人员写出更加清晰、健壮和易于维护的并发代码。下面介绍 context 包的基本用法和设计理念。
为什么需要使用context在并发程序中使用 Context 主要有两个目的:一是用来取消操作,二是用来传递请求范围的数据。
取消操作:当一个 Context 被取消时,所有基于该 Context 的操作都应该被取消。这是通过检查 ctx.Done() 返回的通道是否被关闭来实现的。如果该通道被关闭,表示 Context 已经被取消,相应的操作也应该停止。
传递数据:通过 context.WithValue 函数,可以将请求范围的值与 Context 相关联。这可以用来传递如请求ID、认证令牌等信息。
常见用法创建contextcontext 包通过 Context 接口提供功能。能直接创建一个 Context 实例,而是需要通过包 ...
VM拓展Centos磁盘
VM拓展Centos磁盘背景VM虚拟机在使用一段时间后,磁盘不够,需要拓展root
操作步骤
虚拟机关机
选择拓展磁盘大小
lsblk查看当前的分盘情况
(1)fdisk /dev/sda进入磁盘配置; p (print) 输出当前磁盘分区情况; d(delete) 删除sda3磁盘(空间大小为:4810752-41943039) 。(2)n(new) 新建磁盘; p(primary) 进行新建主分区磁盘;(一块硬盘顶多只能分四块主分区) 3新建磁盘空间名3新建磁盘(空间大小为:4810752-56623103);(3) w (write)保存,保存写入新的配置,磁盘分配配置
reboot重启刷新
拓展磁盘
## 拓展磁盘(Centos)pvcreate /dev/sda3 # 创建pvvgextend centos /dev/sda3 # 扩容vglvextend -l +100%FREE /dev/centos/root # 扩容lvxfs_growfs /dev/centos/root # 更新容量
...
Go-控制协程数量
Go-控制协程数量背景GMP的无限创建Goroutine基于共享用户态资源,过多的协程会导致CPU利用率浮动上涨、内存占用上涨、主进程崩溃
如何控制Goroutine数量基于buffer的channel原理:通过buffer的缓冲区的大小和阻塞等待来控制最大的数量
package mainimport ( "fmt" "runtime" "time")func doGoroutine(i int, ch chan bool) { fmt.Println("go func", i, "goroutine count", runtime.NumGoroutine()) // 结束了一个任务 <-ch}func main() { task_cnt := 10 // 容量控制了 Goroutine 的数量 ch := make(chan bool, 3) // for的数据决定了Goroutine的创建速度 for i := 0; i < task_cn ...
分布式-CAP理论
分布式-CAP理论背景在大规模拓展服务下存在三个特性:
C(Consistency):一致性
A(Availability):可用性
D(Partition Tolerance):分区容错性
一致性一致性: All nodes see the same data at the same time
所有节点数据,在同一时刻,读数据都是最新的
流程:
对主存储写数据
进行上锁,要求对从存储进行同步
同步成功,释放锁,返回成功
可用性可用性:Reads and writes always succeed
服务永远可用,用户感知不到异常
流程:
用户向master请求
master从从存储请求
分区容错性分区容错性:The system continues to operate despite arbitrary message loss or failure of part of the system
在分布式系统中,尽管部分节点出现任何消息丢失或者故障,系统还应继续运⾏
流程:
尽使⽤异步取代同步操作,例如使⽤异步⽅式将数据从主数据库同步到从数据,这样 ...
分布式-Base理论
分布式-Base理论介绍CAP无法同时满足,为了同时实现CAP系统,所以出现了BASE
BA(Basically Available):基本 可用
S(Soft State):软状态
E(Eventually Consistent):最终一致性
ACID和BASE是对冲理论:
ACID追求强一制性
BASE牺牲强一致性,追求高可用性
Basically Available 通过妥协响应时间和功能损失
场景:
断电,增大响应时间
高并发下,电商提示抢购失败
Soft State软状态本质就是系统中的数据有中间状态,多节点的副本数据等待同步数据延迟
Eventually Consistent软状态数据不可以一直持续,必须在一段时间内完成同步,达到最终一致性
分布式 id 生成器(snowflake,雪花算法)
分布式 id 生成器(snowflake,雪花算法)背景在某些场景下,需要生成增长ID并且不能重复
snowflakeSnowflake 雪花算法,由Twitter提出并开源,可在分布式环境下用于生成唯一ID的算法。该算法生成的是一个64位的ID,故在Java下正好可以通过8字节的long类型存放。所生成的ID结构如下所示
1 bit:首位无效因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
41 bit:表示的是时间戳,单位是毫秒41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。
10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10 台机器上,也就是 1024 台机器10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2 ^ 5 个机房(32 个机房),每个机房里可以代表 2 ^ 5 个机器(32 台机器),也可以根据自己公司的实际情况确定。
12 bit: ...
ACID理论
ACID理论背景ACID主要是事务中的概念,分别是
A(Atomicit):原子性
C(Consistency):一致性
I(Isolation):隔离性
D(Durability):持久性
A原子性主要是在一个事务中,“要么全部完成、要么全部不完成”
经典的银行转账案例:
A:从A账户去一百
B:从存入100
AB是在一个事务里面,不能只有A|B其中一个成功,不然银行账户对不上金额
C一致性一致性代表:事务开始前和事务结束之后,数据库的一致性没有改变,事务中的数据一致性
I隔离性隔离性代表:多个并发事务同时拥有对数据进行读书和修改的能力,如果⼀个事务要访问的数据正在被另外⼀个事务修改,只要另外⼀个事务未提交,则它所访问的数据就不受未提交事务的影响
D持久性持久性代表:事务处理结束后,对数据的修改是永久的,即便系统故障也不会丢失
优点1、数据一致性:ACID 确保数据在任何事务执行后保持一致和准确。
2、数据完整性:ACID 通过确保对数据库的任何更改都是永久性的,并且不会丢失,从而维护了数据的完整性。
3、并发控制:ACID 通过防止事务之间的干扰来帮助管理并发创建的多个事务。
4 ...
初识RPC
初识RPC介绍RPC 是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC 已经和 IPC 一样成为一个不可或缺的基础构件。因此 Go 语言的标准库也提供了一个简单的 RPC 实现,我们将以此为入口学习 RPC 的各种用法。
hello RPC
server端代码
package mainimport ( "log" "net" "net/rpc")type HelloService struct{}func (p *HelloService) Hello(request string, reply *string) error { *reply = "hello:" + request return nil}func main() { rpc.RegisterName("HelloService", new(HelloService)) listener, err := net.Listen(" ...