5.26 面经整理 360共有云 golang

news2025/6/2 6:58:10

select … for update

参考:https://www.cnblogs.com/goloving/p/13590955.html
select for update是一种常用的加锁机制,它可以在查询数据的同时对所选的数据行进行锁定,避免其他事务对这些数据行进行修改。
比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错
  排他锁的申请前提是需要:没有其他线程对该结果集中的任何行数据使用排他锁或共享锁,否则申请会阻塞
  for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)中才能生效。在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。
  排他锁包含行锁、表锁。

1、InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。无主键或主键不明确或无索引,表锁;明确指定主键或索引,且有数据,行锁;无数据,则无锁。

2、由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。

3、当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。

4、即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。

5、检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。通过用explain检查两条SQL的执行计划,我们可以清楚地看到了这一点。

例子

在这里插入图片描述
锁user_id 索引

BEGIN;
SELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC FOR UPDATE;
INSERT INTO user_point_logs (user_id, change_type, scene, change_points, balance) VALUES (1, 1, "", 0, 0);
COMMIT;

并发时

BEGIN
> OK
> 查询时间: 0.02s


SELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC FOR UPDATE
> Affected rows: 0
> 查询时间: 0.024s


SELECT SLEEP(15)
> OK
> 查询时间: 15.023s


INSERT INTO user_point_logs (user_id, change_type, scene, change_points, balance) VALUES (1, 1, "", 0, 0)
> 1213 - Deadlock found when trying to get lock; try restarting transaction
> 查询时间: 0.022s

出现相互死锁

BEGIN
> OK
> 查询时间: 0.024s


SELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC FOR UPDATE
> Affected rows: 0
> 查询时间: 13.025s


INSERT INTO user_point_logs (user_id, change_type, scene, change_points, balance) VALUES (1, 1, "", 0, 0)
> Affected rows: 1
> 查询时间: 0.026s


COMMIT
> OK
> 查询时间: 0.031s
BEGIN;
SELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC LIMIT 1 FOR UPDATE;
SELECT SLEEP(15);
INSERT INTO user_point_logs (user_id, change_type, scene, change_points, balance) VALUES (1, 1, "", 0, 0);
COMMIT;
BEGIN
> OK
> 查询时间: 0.021s


SELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC LIMIT 1 FOR UPDATE
> Affected rows: 0
> 查询时间: 0.023s


SELECT SLEEP(15)
> OK
> 查询时间: 15.021s


INSERT INTO user_point_logs (user_id, change_type, scene, change_points, balance) VALUES (1, 1, "", 0, 0)
> Affected rows: 1
> 查询时间: 0.022s


COMMIT
> OK
> 查询时间: 0.095s

在这里插入图片描述
后一个事务没有查询结果,可能由于事务的可重复读的隔离级别? 不太懂,欢迎佬评论区指点~

为什么线程消耗比协程大,具体体现在哪些方面

目前主流语言基本上都选择了多线程作为并发设施,与线程相关的概念就是抢占式多任务(Preemptive multitasking),而与协程相关的是协作式多任务。
不管是进程还是线程,每次阻塞、切换都需要陷入系统调用(system call),先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程(线程)。

  • 内存占用 1-8MB 2KB
  • 上下文切换
  • 同步与锁:互斥 channel
  • 调度机制 :抢占式 GMP

生产中哪些服务用的 进程、线程,为什么要这么做,有什么好处

在这里插入图片描述
网络爬虫、高性能计算等等

可重复读能解决幻读吗,为什么

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

出现幻读

在这里插入图片描述
在这里插入图片描述

http1.0 - http3.0 改进,优缺点

  • http1.0:短连接
  • http1.1:长连接改善性能开销,支持管道;
  • http2.0:头部压缩消除重复部分,二进制增加传输效率,并发传输多个stream复用一条tcp连接但接收时TCP会阻塞,服务器推送
  • http3.0:无队头阻塞QUIC多个流,QUIC包含TLS握手1RTT建立连接,连接迁移防止切换网络时断开连接(四元组->连接ID)

程序从加载到运行的过程

1. 用户触发执行

  • 方式:通过命令行输入、图形界面双击或脚本调用。
  • 系统检查:操作系统验证文件存在性、用户权限(执行权限)及文件完整性。

2. 创建新进程

  • 进程控制块(PCB):操作系统分配PCB,存储进程状态、PID、优先级等信息。
  • 虚拟地址空间:为进程分配独立的虚拟内存空间,确保隔离性。

3. 加载可执行文件

  • 文件格式解析:解析ELF(Linux)或PE(Windows)等格式,提取代码段(.text)、数据段(.data)、BSS段(.bss)等信息。
  • 内存映射
    • 代码段:只读属性,映射到固定或随机地址(ASLR启用时)。
    • 数据段:可读写,包含已初始化全局变量。
    • BSS段:分配内存并初始化为零,无需磁盘内容。
  • 按需分页:物理内存延迟分配,触发缺页中断时加载所需页。

4. 初始化运行时环境

  • 栈分配:设置栈指针(SP),分配栈空间(局部变量、函数调用)。
  • 堆初始化:通过brk/sbrk或mmap分配堆空间,供动态内存分配(如malloc)。
  • 全局变量:.data段数据载入内存,.bss段清零。
  • 环境变量与参数:将命令行参数(argv)和环境变量压栈或存入特定寄存器。

5. 执行初始化代码

  • 入口点:控制权转至_start(由C运行时库定义),而非直接跳转到main。
  • C运行时(CRT)初始化
    • 调用全局构造函数(C++静态对象)。
    • 初始化标准I/O流(stdin/stdout/stderr)。
    • 设置线程局部存储(TLS)。
  • 参数传递:准备argc、argv并调用main函数。

6. 程序执行

  • 主函数运行:执行main函数逻辑,处理用户代码。
  • 系统调用:通过中断或syscall指令请求操作系统服务(如文件操作、网络通信)。
  • 异常处理:信号处理、缺页中断等由操作系统接管。

流程图概览

用户触发 → 权限检查 → 创建进程 → 加载ELF/PE → 动态链接 → 初始化运行时 → 执行main → 终止清理

zookeeper、mysql、redis 、etcd 怎么实现分布式锁,各有什么优缺点,生产中一般用那个

1. Zookeeper 分布式锁

实现原理
  • 临时顺序节点 + Watcher 机制
    客户端在指定父节点(如 /lock)下创建临时顺序节点(如 /lock/seq-000000001),若自身节点序号最小则获取锁;否则监听前一个节点的删除事件,触发重新判断锁归属。
  • 自动释放:会话断开或客户端崩溃时,临时节点自动删除,避免死锁。
优点
  • 强一致性:基于 ZAB 协议,保证数据强一致性。
  • 公平锁:顺序节点天然支持公平性,避免饥饿问题。
  • 可靠性高:自动释放锁机制完善,无死锁风险。
缺点
  • 性能较低:频繁的节点创建、监听和事件回调导致延迟较高。
  • 复杂度高:需维护 Zookeeper 集群,运维成本较高。

2. MySQL 分布式锁

实现原理
  • 乐观锁/悲观锁
    • 乐观锁:通过版本号字段实现,更新时判断版本号是否匹配。
    • 悲观锁:使用 SELECT ... FOR UPDATE 或行级锁,限制并发访问。
优点
  • 实现简单:无需额外中间件,适合已有 MySQL 的场景。
缺点
  • 性能差:高并发下频繁操作数据库易成瓶颈。
  • 可靠性低:死锁检测困难,需手动处理锁超时。
  • 扩展性差:主从架构下同步延迟可能导致锁失效。

3. Redis 分布式锁

实现原理
  • SETNX + EXPIRE:通过 SET key value NX PX 30000 原子命令加锁,设置过期时间避免死锁。
  • Redisson 框架:封装锁续期、可重入等逻辑,支持 RedLock 算法(多节点容错)。
优点
  • 高性能:基于内存操作,支持高并发场景。
  • 易用性高:结合 Redisson 实现简单,社区支持完善。
缺点

在这里插入图片描述

  • 弱一致性:主从切换时可能导致锁失效(AP 特性)。
  • 锁续期复杂:需额外处理锁超时与业务执行时间的平衡。
  • RedLock 争议:部分场景下仍存在安全性问题(如时钟漂移)。

4. Etcd 分布式锁

实现原理
  • 租约(Lease) + 临时键:客户端创建带租约的临时键,通过 Revision 机制判断是否为最小键,监听前一个键的删除事件。
  • 心跳续约:定期续约防止租约过期,崩溃时自动释放锁。
优点
  • 强一致性:基于 Raft 协议,数据强一致。
  • 可靠性高:自动释放锁,避免死锁。
缺点
  • 性能中等:低于 Redis,但高于 Zookeeper。
  • 复杂度高:需管理租约和监听逻辑,实现成本较高。

生产环境选型建议

  1. Redis

    • 适用场景:高并发、对一致性要求不严格的场景(如秒杀、缓存更新)。
    • 推荐工具:Redisson 框架,支持锁续期和 RedLock 算法。
  2. Zookeeper/Etcd

    • 适用场景:强一致性要求的场景(如金融交易、配置管理)。
    • 推荐工具:Zookeeper 用 Curator 框架;Etcd 用 Jetcd 或官方 SDK。
  3. MySQL

    • 适用场景:低并发、无其他中间件的简单系统。

总结

  • 性能优先选 Redis:适用于大多数高并发场景,需结合业务兜底(如幂等性处理)。
  • 强一致选 Zookeeper/Etcd:适用于对可靠性要求极高的场景,如分布式协调服务。
  • MySQL 慎用:仅作为临时方案或低并发场景的补充。

实现LRU算法

在这里插入图片描述

type LRUCache struct {
    Cap int
    List *list.List
    Mp map[int]*list.Element
}
type node struct{
    key, value int
}


func Constructor(capacity int) LRUCache {
    return LRUCache{capacity, list.New(), map[int]*list.Element{}}
}


func (this *LRUCache) Get(key int) int {
    item := this.Mp[key]
    if item==nil{
        return -1
    }
    this.List.MoveToFront(item)
    return item.Value.(node).value
}


func (this *LRUCache) Put(key int, value int)  {
    item := this.Mp[key]
    if item!=nil{
        item.Value = node{key, value}
        this.List.MoveToFront(item)
    }else{
        this.Mp[key] = this.List.PushFront(node{key, value})
        this.List.MoveToFront(this.Mp[key])
        if len(this.Mp)>this.Cap{
            delete(this.Mp, this.List.Remove(this.List.Back()).(node).key)
        }
    }
}


/**
 * Your LRUCache object will be instantiated and called as such:
 * obj := Constructor(capacity);
 * param_1 := obj.Get(key);
 * obj.Put(key,value);
 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

第五届全国人工智能大赛由鹏城实验室主办,新一代人工智能产业技术创新战略联盟承办,华为、中国移动、鹏城实验室科教基金会等单位协办,广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…

模具制造业数字化转型:精密模塑,以数字之力铸就制造基石

模具被誉为 “工业之母”,是制造业的重要基石,其精度直接决定了工业产品的质量与性能。在工业制造向高精度、智能化发展的当下,《模具制造业数字化转型:精密模塑,以数字之力铸就制造基石》这一主题,精准点明…

PECVD 生成 SiO₂ 的反应方程式

在PECVD工艺中,沉积氧化硅薄膜以SiH₄基与TEOS基两种工艺路线为主。 IMD Oxide(USG) 这部分主要沉积未掺杂的SiO₂,也叫USG(Undoped Silicate Glass),常用于IMD(Inter-Metal Diele…

2024 CKA模拟系统制作 | Step-By-Step | 17、题目搭建-排查故障节点

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. Kubernetes 节点状态诊断 2. 节点故障修复技能 3. 持久化修复方案 4. SSH 特权操作 三、考点详细讲解 1. 节点状态机制详解 2. 常见故障原因深度分析 3. 永久修复技术方案 四、实验环境搭建步骤…

如何将图像插入 PDF:最佳工具比较

无论您是编辑营销材料、写报告还是改写原来的PDF文件,将图像插入 PDF 都至关重要。幸运的是,有多种在线和离线工具可以简化此任务。在本文中,我们将比较一些常用的 PDF 添加图像工具,并根据您的使用场景推荐最佳解决方案&#xff…

人工智能与机器学习从理论、技术与实践的多维对比

人工智能(Artificial Intelligence, AI)提出“让机器像人类一样思考”的目标,其核心理论围绕符号系统假设展开——认为智能行为可通过逻辑符号系统(如谓词逻辑、产生式规则)建模。 机器学习(Machine Learning, ML)是人工智能的子集,聚焦于通过数据自动改进算法性能的理…

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…

流程自动化引擎:让业务自己奔跑

在当今竞争激烈的商业环境中,企业面临着快速变化的市场需求、日益复杂的业务流程以及不断增长的运营成本。如何优化业务流程、提升效率并降低成本,成为企业持续发展的关键问题。 流程自动化引擎(Process Automation Engine)作为一…

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力

点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…

用 Python 模拟雪花飘落效果

用 Python 模拟雪花飘落效果 雪花轻轻飘落,给冬日带来一份浪漫与宁静。本文将带你用一份简单的 Python 脚本,手把手实现「雪花飘落效果」动画。文章深入浅出,零基础也能快速上手,完整代码仅需一个脚本文件即可运行。 目录 前言…

基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究

摘要:本文聚焦“一切皆零售”理念下的大零售渗透趋势,提出以定制开发开源AI智能名片S2B2C商城小程序为核心工具的渗透策略。通过分析该小程序在需求感应、场景融合、数据驱动等方面的技术优势,结合零售渗透率提升的关键路径,揭示其…

XPlifeapp:高效打印,便捷生活

在数字化时代,虽然电子设备的使用越来越普遍,但打印的需求依然存在。无论是学生需要打印课表、资料,还是职场人士需要打印名片、报告,一个高效便捷的打印软件都能大大提高工作效率。XPlifeapp就是这样一款超级好用的手机打印软件&…

等保测评-Mysql数据库测评篇

Mysql数据库测评 0x01 前言 "没有网络安全、就没有国家安全" 等保测评是什么? 等保测评(网络安全等级保护测评)是根据中国《网络安全法》及相关标准,对信息系统安全防护能力进行检测评估的法定流程。其核心依据《信…

02.K8S核心概念

服务的分类 有状态服务:会对本地环境产生依赖,例如需要把数据存储到本地磁盘,如mysql、redis; 无状态服务:不会对本地环境产生任何依赖,例如不会存储数据到本地磁盘,如nginx、apache&#xff…

一篇文章玩转CAP原理

CAP 原理是分布式系统设计的核心理论之一,揭示了系统设计中的 根本性权衡。 一、CAP 的定义 CAP 由三个核心属性组成,任何分布式系统最多只能同时满足其中两个: 一致性(Consistency) 所有节点在同一时刻看到的数据完全…

Vue-收集表单信息

收集表单信息 Input label for 和 input id 关联, 点击账号标签 也能聚焦 input 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>表单数据</title><!-- 引入Vue --><scrip…

vscode开发stm32,main.c文件中出现很多报错影响开发解决日志

本质上为 .vscode/c_cpp_properties.json文件和Makefile文件中冲突&#xff0c;两者没有同步。 将makefile文件中的内容同步过来即可&#xff0c;下面给出一个json文件的模板&#xff0c;每个人的情况不同&#xff0c;针对性修改即可 {"configurations": [{"na…

嵌入式鸿蒙系统中水平和垂直以及图片调用方法

利用openharmony操作的具体现象: 第一:Column 作用:沿垂直方向布局的容器。 第二:常用接口 Column(value?: {space?: string | number}) 参数: 参数名参数类型必填参数描述spacestring | number否纵向布局元素垂直方向间距。 从API version 9开始,space为负数或者ju…

【海康USB相机被HALCON助手连接过后,MVS显示无法连接故障。】

在Halcon里使用助手调用海康USB相机时&#xff0c;如果这个界面点击了【是】 那么恭喜你&#xff0c;相机只能被HALCON调用使用&#xff0c;使用MVS或者海康开发库&#xff0c;将查找不到相机 解决方式&#xff1a; 右键桌面【此电脑】图标 ->选择【管理】 ->选择【设备…

2025年电气工程与轨道交通国际会议:绿色能源与智能交通的创新之路

2025年电气工程与轨道交通国际会议&#xff08;ICEERT 2025&#xff09;是一场电气工程与轨道交通领域的国际盛会&#xff0c;将于2025年在武汉隆重召开。此次会议汇聚了全球顶尖的专家学者和行业精英&#xff0c;共同探讨电气工程与轨道交通的最新研究成果和技术趋势。会议将围…