- 博客(46)
- 收藏
- 关注
原创 go面试问题
sendfile 允许操作系统从 Page Cache 直接将文件发送至 socket 缓存区,节省了内核空间 & 用户空间的两次冗余的 cpu 拷贝操作,最后只需要通过 DMA 传输将数据复制到网卡。这样使得调用变得更加简洁:不仅减少了 CPU 拷贝的次数,由于文件传输拷贝仅发生在内核空间,还减少了上下文切换的次数。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。
2024-12-18 13:10:45
461
原创 运维面试题
Kubernetes (k8s) 中的 和 是两种不同类型的控制器,用于管理应用的生命周期,但它们适用于不同的应用场景。以下是它们在存储、调度顺序和网络分配方面的区别:这是最简单的方式之一,适用于大多数无状态应用。通过调整新旧版本的副本数量,可以逐步替换旧版本的应用实例。在 Kubernetes 中,Pod 探针(Probes)用于监控容器的健康状态,并根据探针的结果决定如何处理这些容器。Kubernetes 提供了三种类型的探针:每种探针都可以通过以下几种方式之一来执行健康检查:Keepalived
2024-12-11 12:01:28
647
原创 k8s 基本组件功能
容器编排是指自动化管理、调度和运行容器化应用的过程。随着容器技术(如Docker)的普及,越来越多的应用被封装到容器中以实现快速部署、扩展和迁移。然而,管理和维护大量的容器,尤其是在分布式环境中,变得复杂且具有挑战性。因此,容器编排工具应运而生,旨在解决这些问题。自动化部署:自动将应用程序部署到容器中,并确保它们在需要的时候启动或停止。服务发现与负载均衡:自动为服务分配网络地址,并根据需求将流量分配给不同的容器实例,以提高应用的可用性和响应速度。资源管理。
2024-12-02 00:30:28
1089
原创 运维面经(秋招)
iptables 模式默认模式,适用于中小型集群。通过iptables规则实现负载均衡和网络路由。性能在集群规模较大时会下降。不直接支持健康检查。ipvs 模式高性能模式,适用于大型集群。使用 IPVS 模块实现负载均衡和网络路由。支持多种负载均衡算法和内置健康检查。在处理高并发流量时更加稳定和高效。选择哪种模式取决于你的集群规模和性能需求。对于中小型集群,iptables模式通常已经足够;而对于大型集群,ipvs模式是更好的选择。
2024-11-30 00:37:36
1038
1
原创 【新手易错点】golang中byte和rune
在Golang中,byte和rune是两种不同类型的数据。简单来说,,而r。总的来说,byte用于表示单个字节的数据,而rune用于表示Unicode字符,可以更好地支持多语言和复杂的文本处理。
2024-02-23 15:15:26
829
2
原创 【容易踩坑】golang 锁相关知识
在 Golang 中,锁的作用是用于保护共享资源,确保在多个 goroutine 并发访问时的数据一致性和正确性。当多个 goroutine 同时访问共享资源时,可能会出现竞态条件(race condition),导致数据错误或不一致。总而言之,锁在 Golang 中起到了保护共享资源、同步多个 goroutine、确保数据一致性和避免竞态条件等重要作用。
2023-09-12 14:42:04
611
原创 【容易踩坑】golang中的defer
defer是Go语言中的一个关键字,用于延迟执行函数调用。当一个函数中使用了defer关键字来延迟执行某个函数调用时,该函数调用会被推迟到函数返回之前执行。defer常用于需要在函数返回之前执行一些清理或释放资源的操作,例如关闭文件、释放锁等。defer还可以用于捕获函数中的错误,并在函数返回之前进行处理。
2023-09-12 14:41:20
315
原创 【容易踩坑】golang断言
在Go语言中,。在Go语言中,断言的语法形式为x.(T),其中x是一个接口类型的值,T是一个具体的类型。这个语法表示我们要判断x的实际类型是否是T,如果是,则将x转换为T类型的值,并返回给我们使用。断言的过程是通过判断x的实际类型信息和T类型信息是否一致来完成的。如果一致,断言就成功了,我们可以继续使用T类型的值;如果不一致,断言就失败了,会导致程序运行时产生一个恐慌(panic)。
2023-09-12 14:40:46
995
原创 golang context小节
Go 语言中的 context.Context 的主要作用还是在多个 Goroutine 组成的树中同步取消信号以减少对资源的消耗和占用,虽然它也有传值的功能,但是这个功能我们还是很少用到。在真正使用传值的功能时我们也应该非常谨慎,使用 context.Context 进行传递参数请求的所有参数一种非常差的设计,比较常见的使用场景是传递请求对应用户的认证令牌以及用于进行分布式追踪的请求 ID。
2023-08-13 16:06:39
108
原创 计算机网络的拓朴结构:总线型,星形拓朴结构,环形拓扑结构,树形拓扑结构
:在总线型网络中,信号会沿着网线发送到整个网络。当信号到达线缆的端点时,将产生反射信号,这种发射信号会与后续信号发送冲突,从而使通信中断。为了防止通信中断,必须在线缆的两端安装终结器,以吸收端点信号,防止信号反弹。
2023-07-12 13:32:03
2052
原创 线程与进程
本质区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。资源开销:每个进程都有独立的地址空间,进程之间的切换会有较大的开销;线程可以看做轻量级的进程,同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。影响关系:一个进程崩溃后,在保护模式下其他进程不会被影响,但是一个线程崩溃可能导致整个进程被操作系统杀掉,所以多进程要比多线程健壮
2023-07-10 13:29:14
57
原创 tcp和udp区别
TCP 面向连接(如打电话要先拨号建立连接)提供可靠的服务,UDP 是无连接的,即发送数据之前不需要建立连接,UDP 尽最大努力交付,即不保证可靠交付。UDP 具有较好的实时性,工作效率比 TCP 高,适用于对高速传输和实时性有较高的通信或广播通信。每一条 TCP 连接只能是一对一的,UDP 支持一对一,一对多,多对一和多对多的交互通信。UDP 分组首部开销小,TCP 首部开销 20 字节,UDP 的首部开销小,只有 8 个字节。TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流
2023-07-10 13:28:22
57
原创 go 一致性hash
如果服务器的节点过少,容易引起key的倾斜。例如上面的例子中p2、p4、p6分布在环的上半部分,下半部分是空的。那么映射到下半部分的key都会被分配给p2,key过度倾斜到了p2缓存间节点负载不均衡;假设1个真实的节点对应3个虚拟节点,那么p1对应的就是p1-1、p1-2、p1-3。实现原理:将key映射到 2^32 的空间中,将这个数字的首尾相连,形成一个环。,一个真实的节点对应多个虚拟的节点。为了解决这个问题,引入了。
2023-07-10 13:27:49
167
原创 redis zset实现
redis中有序集合的实现采用了一种数据结构——。跳跃表是有序单链表的一种改进,其查询、插入、删除也是O(logN)的时间复杂度。
2023-07-10 13:27:18
199
原创 sql执行慢的原因?如何看是什么问题?
比如MySQL支持一主多从的分布式部署,我们可以将主库只用来处理写数据的操作,而多个从库只用来处理读操作。在流量比较大的场景中,可以增加从库来提高数据库的负载能力,从而提升数据库的总体性能。表切分规则一般分为两种,一种是水平切分,一种是垂直切分。将查询比较频繁的热点数据预存到缓存当中,比如Redis、MongoDB、ES等,以此来缓解数据的压力,从而提高数据库的响应速度。首先,可以打开MySQL的慢查询日志,收集一段时间的慢查询日志内容,然后找出耗时最长的SQL语句,对这些SQL语句进行分析。
2023-07-10 13:26:21
700
原创 复合索引生效问题
复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。当然,col1,col3组合也可以,但实际上只用到了col1的索引,col3并没有用到。当创建(col1,col2,col3)联合索引时,相当于创建了。
2023-07-10 13:25:43
83
原创 mysql引擎
MYSQL常用2个引擎分别是和。没啥特殊的话请使用innodb。myisam已被放弃。读操作多用写操作多用1、myisam查询效率更高,查询效率差myisam6-7倍。2、innodb支持事务,行锁,外键。myisam不支持。如果数据表涉及的存储数据多、查询多,用myisam,如文章表。如果数据表涉及业务逻辑多,增删改操作多,就用innodb,如订单表。
2023-07-10 13:25:04
49
原创 cpu特别高如何定位
代码执行到下图中,189行dispatchIdleTeu返回了错误qferror.ErrNoTeu,所以189 if的执行语句192~212无法进入进行,而外层是一个for死循环,则会造成该协程一直占用cpu,导致cpu过载。通过上一步,我们确定了是pid=11205的cava_smu进程cpu过高,那么可以通过。通过以上操作,可以确认tid=11208,11212,11213三个线程的cpu过高。首先,如果生产环境没有dlv,则可以拷贝对应的dlv到。在dlv中切换到对应高cpu协程,并查看堆栈。
2023-07-10 13:24:37
461
原创 golang面试题答案总结(四)技术中台golang开发实习生 滴滴
HTTP1.1的缺点:安全性不足和性能不高;HTTP2.0完全兼容HTTTP1.0,是“更安全的HTTP,更快的HTTPS”,头部压缩,多路复用等技术充分利用了带宽,降低了延迟。HTTP3.0的底层支撑协议QUIC基于UDP实现,又含TCP的特点,实现了又快又可靠的协议。
2023-07-09 17:07:31
340
原创 golang面试经验答案总结(二)字节跳动一面 golang
主要是堆(heap)和栈(stack)分配两种。栈分配廉价,堆分配昂贵。栈分配:对于栈的操作只有入栈和出栈两种指令,属于静态资源分配。使用栈分配:函数的内部中不对外开放的局部变量,只作用于函数中。堆分配:堆中分配的空间,在结束使用之后需要垃圾回收器进行闲置空间回收,属于动态资源分配。使用堆分配:1.函数的内部中对外开放的局部变量。2.变量所需内存超出栈所提供最大容量。GMP基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
2023-07-04 17:08:09
1374
原创 go mutex原理
自旋对应于CPU的”PAUSE”指令,CPU对该指令什么都不做,相当于CPU空转,对程序而言相当于sleep了一小段时间,时间非常短,当前实现是30个时钟周期。自旋过程中会持续探测Locked是否变为0,连续两次探测间隔就是执行这些PAUSE指令,它不同于sleep,不需要将协程转为睡眠状态。
2023-07-01 16:09:37
83
原创 go RWmutex读写锁原理
所谓读写锁RWMutex,完整的表述应该是读写互斥锁比如,程序钟写操作少而读操作多,简单的说,如果执行过程时1次写然后N次读的话,使用Mutex这个过程将是串行的, 因为即便N次读操作相互之间并不影响,但也都需要持有Mutex后才可以操作。如果使用(读写锁)RWmutex,多个读操作时可以同时持有锁,并发能力将大大提升。
2023-07-01 15:37:13
77
原创 golang垃圾回收机制
垃圾回收的核心就是。把未被引用的内存回收掉,以供后续内存分配时使用。上图中,内存块1、2、4号位上的内存块已被分配(数字1代表已被分配,0 未分配)。变量a, b为一指针,指向内存的1、2号位。内存块的4号位曾经被使用过,但现在没有任何对象引用了,就需要被回收掉。垃圾回收开始时从root对象开始扫描,把root对象引用的内存标记为”被引用”,考虑到内存块中存放的可能是指针,所以还需要递归的进行标记,全部标记完成后,只,未被标记的全部标识为未分配即完成了回收。
2023-07-01 14:02:51
495
原创 mysql存储过程
用户定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用@变量名使用就可以。其作用域为当前连接。-- 赋值 set @var_name = expr [ , @var_name = expr ] . . .;select 字段名 into @var_name from 表名;-- 使用 select @var_name;
2023-05-17 15:56:12
48
原创 mysql视图
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。CASCADED和 LOCAL,默认值为 CASCADED。
2023-05-16 15:26:43
33
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人