5.26 面经整理 360共有云 golang
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.02sSELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC FOR UPDATE
> Affected rows: 0
> 查询时间: 0.024sSELECT SLEEP(15)
> OK
> 查询时间: 15.023sINSERT 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.024sSELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC FOR UPDATE
> Affected rows: 0
> 查询时间: 13.025sINSERT INTO user_point_logs (user_id, change_type, scene, change_points, balance) VALUES (1, 1, "", 0, 0)
> Affected rows: 1
> 查询时间: 0.026sCOMMIT
> 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.021sSELECT * FROM user_point_logs WHERE user_id = 1 ORDER BY id DESC LIMIT 1 FOR UPDATE
> Affected rows: 0
> 查询时间: 0.023sSELECT SLEEP(15)
> OK
> 查询时间: 15.021sINSERT INTO user_point_logs (user_id, change_type, scene, change_points, balance) VALUES (1, 1, "", 0, 0)
> Affected rows: 1
> 查询时间: 0.022sCOMMIT
> 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。
- 复杂度高:需管理租约和监听逻辑,实现成本较高。
生产环境选型建议
-
Redis:
- 适用场景:高并发、对一致性要求不严格的场景(如秒杀、缓存更新)。
- 推荐工具:Redisson 框架,支持锁续期和 RedLock 算法。
-
Zookeeper/Etcd:
- 适用场景:强一致性要求的场景(如金融交易、配置管理)。
- 推荐工具:Zookeeper 用 Curator 框架;Etcd 用 Jetcd 或官方 SDK。
-
MySQL:
- 适用场景:低并发、无其他中间件的简单系统。
总结
- 性能优先选 Redis:适用于大多数高并发场景,需结合业务兜底(如幂等性处理)。
- 强一致选 Zookeeper/Etcd:适用于对可靠性要求极高的场景,如分布式协调服务。
- MySQL 慎用:仅作为临时方案或低并发场景的补充。
实现LRU算法
type LRUCache struct {Cap intList *list.ListMp 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);*/
相关文章:

5.26 面经整理 360共有云 golang
select … for update 参考:https://www.cnblogs.com/goloving/p/13590955.html select for update是一种常用的加锁机制,它可以在查询数据的同时对所选的数据行进行锁定,避免其他事务对这些数据行进行修改。 比如涉及到金钱、库存等。一般这…...

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

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

PECVD 生成 SiO₂ 的反应方程式
在PECVD工艺中,沉积氧化硅薄膜以SiH₄基与TEOS基两种工艺路线为主。 IMD Oxide(USG) 这部分主要沉积未掺杂的SiO₂,也叫USG(Undoped Silicate Glass),常用于IMD(Inter-Metal Diele…...
React与Vue核心区别对比
React 和 Vue 都是当今最流行、功能强大的前端 JavaScript 框架,用于构建用户界面。它们有很多相似之处(比如组件化、虚拟 DOM、响应式数据绑定),但也存在一些核心差异。以下是它们的主要区别: 1. 核心设计与哲学 Rea…...

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

如何将图像插入 PDF:最佳工具比较
无论您是编辑营销材料、写报告还是改写原来的PDF文件,将图像插入 PDF 都至关重要。幸运的是,有多种在线和离线工具可以简化此任务。在本文中,我们将比较一些常用的 PDF 添加图像工具,并根据您的使用场景推荐最佳解决方案ÿ…...
Linux 文件 IO 性能监控与分析指南
Linux 文件 I/O 性能监控与分析指南 继 CPU 和网络之后,文件系统 I/O 是影响系统性能的第三大关键领域。无论是数据库响应缓慢、应用加载时间过长,还是日志写入延迟,其根源都可能指向磁盘 I/O 瓶颈。本章将深入探讨文件 I/O 的核心概念、监控…...
ABP VNext + Apache Flink 实时流计算:打造高可用“交易风控”系统
ABP VNext Apache Flink 实时流计算:打造高可用“交易风控”系统 🌐 📚 目录 ABP VNext Apache Flink 实时流计算:打造高可用“交易风控”系统 🌐一、背景🚀二、系统整体架构 🏗️三、实战展示…...
前端面试题-HTML篇
1. 请谈谈你对 Web 标准以及 W3C 的理解和认识。 我对 Web 标准 的理解是,它就像是互联网世界的“交通规则”,由 W3C(World Wide Web Consortium,万维网联盟) 这样一个国际性组织制定。这些规则规范了我们在编写 HTML…...
JS数组 concat() 与扩展运算符的深度解析与最佳实践
文章目录 前言一、语法对比1. Array.prototype.concat()2. 扩展运算符(解构赋值) 二、性能差异(大规模数组)关键差异原因 三、适用场景建议总结 前言 最近工作中遇到了一个大规模数组合并相关的问题,在数据合并时有些…...

人工智能与机器学习从理论、技术与实践的多维对比
人工智能(Artificial Intelligence, AI)提出“让机器像人类一样思考”的目标,其核心理论围绕符号系统假设展开——认为智能行为可通过逻辑符号系统(如谓词逻辑、产生式规则)建模。 机器学习(Machine Learning, ML)是人工智能的子集,聚焦于通过数据自动改进算法性能的理…...
Netty 实战篇:手写一个轻量级 RPC 框架原型
本文将基于前文实现的编解码与心跳机制,构建一个简单的 RPC 框架,包括请求封装、响应解析、动态代理调用。为打造微服务通信基础打下基础。 一、什么是 RPC? RPC(Remote Procedure Call,远程过程调用)允许…...

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程
什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…...
亚远景-ISO 21434标准:汽车网络安全实践的落地指南
一、ISO 21434标准概述 ISO 21434是针对道路车辆网络安全的国际标准,旨在确保汽车组织在车辆的整个生命周期内采用结构化方法进行网络安全风险管理。 该标准适用于参与车辆开发的所有利益相关者,包括OEM、一级和二级供应商、汽车软件供应商以及网络安全…...
【动手学深度学习】2.4. 微积分
目录 2.4. 微积分1)导数和微分2)偏导数3)梯度4)链式法则5)小结 . 2.4. 微积分 微积分的起源: 古希腊人通过逼近法(多边形边数↑ → 面积逼近圆)发展出积分的思想。 微分ÿ…...

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

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力
点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…...

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

基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究
摘要:本文聚焦“一切皆零售”理念下的大零售渗透趋势,提出以定制开发开源AI智能名片S2B2C商城小程序为核心工具的渗透策略。通过分析该小程序在需求感应、场景融合、数据驱动等方面的技术优势,结合零售渗透率提升的关键路径,揭示其…...
重拾Scrapy框架
基于Scrapy框架实现 舔狗语录百度翻译 输出结果到txt文档 爬虫脚本 from typing import Iterable, Any, AsyncIteratorimport scrapy import json from post.items import PostItemclass BaidufanyiSpider(scrapy.Spider):name "baidufanyi"allowed_domains [&quo…...
Day 40
单通道图片的规范写法 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset from torchvision import datasets, transforms import matplotlib.pyplot as plt import warnings warnings.filterwarnings(&q…...

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

等保测评-Mysql数据库测评篇
Mysql数据库测评 0x01 前言 "没有网络安全、就没有国家安全" 等保测评是什么? 等保测评(网络安全等级保护测评)是根据中国《网络安全法》及相关标准,对信息系统安全防护能力进行检测评估的法定流程。其核心依据《信…...
CSS篇-2
4. position 的值分别是相对于哪个位置定位的? position 属性是 CSS 布局中一个非常核心的概念,它允许我们精确控制元素在文档中的定位方式,从而脱离或部分脱离正常的文档流。理解 position 的不同值以及它们各自的定位基准,是实…...

02.K8S核心概念
服务的分类 有状态服务:会对本地环境产生依赖,例如需要把数据存储到本地磁盘,如mysql、redis; 无状态服务:不会对本地环境产生任何依赖,例如不会存储数据到本地磁盘,如nginx、apacheÿ…...
一套qt c++的串口通信
实现了创建线程使用串口的功能 具备功能: 1.线程使用串口 2.定时发送队列内容,防止粘包 3.没处理接收粘包,根据你的需求来,handleReadyRead函数中,可以通过m_receiveBuffer来缓存接收,然后拆分数据来处理 源码 seri…...
【高频面试题】数组中的第K个最大元素(堆、快排进阶)
文章目录 数组中的第K个最大元素题目描述示例1示例2提示: 解法1(堆维护前k大元素)解法2 手写堆维护解法3(快速选择算法)例题:P1923 【深基9.例4】求第 k 小的数参考 数组中的第K个最大元素 题目描述 给定…...
Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索
Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索 在某家互联网大厂的面试中,面试官A是一位技术老兵,而被面试者谢飞机,号称有丰富的Java开发经验。以下是他们的面试情景: 场景:电商平台的后端开发…...
基于Python的单斜式ADC建模与仿真分析
基于Python的单斜式ADC建模与仿真分析 1 引言 CMOS图像传感器的读出电路中,列级ADC因其面积效率高(每列共享ADC)、功耗低(并行工作降低频率需求)和固定模式噪声小(结构对称性高)等优势成为大像素阵列的首选方案。本文针对50KS/s采样率、10位分辨率的单斜式ADC进行系统…...