【MySQL 进阶之路】锁详解
MySQL 锁详解
1. 锁的基本概念
锁在数据库中是用来保证数据一致性和防止并发冲突的一种机制。MySQL 中的锁可以分为不同的类型和粒度,每种锁都有特定的使用场景和特点。了解锁的类型、作用以及如何避免锁带来的问题是提升数据库性能和避免数据冲突的关键。
2. 锁的分类
根据不同的标准,MySQL 锁可以分为以下几类:
2.1 按照锁粒度分类
表级锁(Table Lock)
- 表级锁是加在整个表上的锁,意味着当一个事务获得表锁后,其他事务不能访问这个表的数据,直到当前事务释放锁。表级锁的优点是简单粗暴,但粒度大,容易导致锁竞争。
- 表级锁的类型:
- S锁(共享锁):允许事务读取数据,但不允许修改。多个事务可以持有共享锁,进行读取操作。
- X锁(排他锁):禁止其他事务读取或修改该数据。只有持有该锁的事务可以修改数据,其他事务无法读取或修改。
- 使用场景:当表的读写频繁,且数据不需要高并发时,表级锁较为合适。
行级锁(Row Lock)
-
行级锁是加在单行数据上的锁,通常通过 索引 实现。行级锁比表级锁粒度更细,因此并发能力更强。
-
行级锁的分类:
- 行锁(Row Lock):行锁是锁定数据库表中的特定行数据,确保一个事务修改某一行数据时,其他事务不能修改同一行,避免不可重复读现象。行锁最小粒度,适用于高并发操作。
- 间隙锁(Gap Lock):间隙锁并不锁定具体的行,而是锁定行之间的"空隙",即某两个行数据之间的位置。这是为了防止其他事务插入数据到该位置,从而避免幻读现象。
- 临键锁(Next-Key Lock):临键锁是行锁和间隙锁的组合体。它既锁定了特定行的数据,又锁定了该行之前或之后的间隙,用来防止其他事务在相同范围内插入或修改数据。临键锁主要用于避免幻读问题。
简单来说:
- 行锁:锁定特定行。
- 间隙锁:锁定行与行之间的空隙。
- 临键锁:锁定行及其周围的间隙,防止插入新数据。
-
行级锁的特点:
- 在高并发的环境中,行级锁能够有效减少锁竞争,提高并发性能。
- 但是,行级锁会增加锁管理的开销,因此适合那些频繁进行读取和更新操作的表。
- 使用场景:需要高并发和高响应性能的系统,如电商平台的库存管理、银行转账等。
页级锁(Page Lock)
- 页级锁是针对数据页(通常一个数据页大小为 16KB)进行加锁,这种方式介于表级锁和行级锁之间。MySQL 中的 MyISAM 存储引擎使用的是页级锁。
- 这种锁方式适用于数据量大、读写频繁,但不需要对单行数据进行细粒度控制的场景。
- 使用场景:当表的行数很大,但操作并不依赖于精确的行级锁时,页级锁可能是一个合适的选择。
2.2 按照锁的类型分类
意向锁(Intention Lock)
用于表示事务希望对某些行或表加锁的意图,帮助协调表级锁和行级锁之间的冲突。
-
IS锁(意向共享锁):表示事务将要对某些行加共享锁。
-
IX锁(意向排他锁):表示事务将要对某些行加排他锁。
-
使用场景:意向锁避免了表级锁和行级锁之间的冲突,是InnoDB引擎内部的一种协调机制。
元数据锁(Metadata Lock, MDL)
- 元数据锁用于保护数据库对象(如表、索引等)的结构变更操作,以防止在执行 DDL 操作时,其他事务进行并发的 DML 操作(例如读取或更新数据)。
- 例如,执行
ALTER TABLE
时,MySQL 会对表加上 MDL 锁,防止其他事务对表进行读写操作。 - 使用场景:在进行数据库表结构变更时,使用 MDL 锁确保表的操作不被其他事务打断。
2.3 按照锁的态度分类
悲观锁(Pessimistic Lock)
- 假设并发冲突一定会发生,因此每次访问数据时都加锁,保证数据的安全性。这种方式比较适合高并发环境,避免了数据冲突的发生。
- 悲观锁的实现:通常通过 共享锁(S锁) 和 排他锁(X锁) 实现。
- S锁:允许多个事务读取数据,但不允许修改。
- X锁:限制其他事务对该数据的任何操作,只有持锁事务可以修改。
- 使用场景:银行转账、票务系统等,对数据一致性要求非常高,且并发较为激烈的场景。
乐观锁(Optimistic Lock)
-
假设并发冲突不会发生,因此在读取数据时不加锁,而是通过某种机制(如版本号、时间戳)在提交时检查数据是否被修改过,若没有修改则提交,若发生修改则回滚。
-
乐观锁的实现:通过在数据表中添加版本号(version)或时间戳字段,在事务提交时,检查版本号是否一致。
- 版本号机制:每次更新数据时,版本号加1;提交时,检查版本号是否与读取时一致。
- 使用场景:适用于冲突较少的系统,读多写少的场景,如博客系统中的评论区、商品的库存管理等。
2.4 其他加锁方式
自增锁(Auto-increment Lock)
- MySQL 中自增列(AUTO_INCREMENT)是全局共享资源,多个事务可能会在同一时刻尝试修改自增字段。为了避免这种并发操作造成的冲突,MySQL 使用 自增锁 来确保生成自增值时的唯一性和顺序性。
- 使用场景:自增列通常用于主键字段,特别是在需要高并发插入的场景下,自增锁能保证自增字段值的连续性和唯一性。
显示锁(Explicit Lock)
-
由用户手动设置的锁,通常使用
LOCK TABLES
和UNLOCK TABLES
命令来加锁和解锁表。 -
例如:
sql LOCK TABLES my_table WRITE;
隐式锁(Implicit Lock)
- 由数据库自动加锁,不需要用户显式操作。例如,当一个事务对表进行 SELECT … FOR UPDATE 或 INSERT 操作时,数据库会自动加锁。
全局锁(Global Lock)
-
全局锁会锁住整个数据库或所有数据库的操作,通常用于 备份 或 恢复 时的操作。例如:
-
FLUSH TABLES WITH READ LOCK
:该命令会锁住所有表,确保备份时数据的一致性。 -
UNLOCK TABLES
:释放全局锁
3. 锁的策略与优化
合理选择锁的粒度和类型对于数据库性能至关重要。以下是一些优化建议:
3.1 锁粒度选择
- 表级锁适合低并发、事务较少的应用场景,但会影响其他事务对表的访问。
- 行级锁适合高并发、频繁读写的场景,能够最大程度地避免锁竞争。
- 页级锁则适合一些数据量较大、并发要求不是特别高的场景。
3.2 避免死锁
- 死锁是指两个或多个事务在执行过程中相互等待对方释放资源,导致所有事务无法继续执行。
- 为了避免死锁,应该遵循以下几个原则:
- 统一的锁访问顺序:所有事务按照相同的顺序请求锁,避免交叉。
- 减少锁的持有时间:尽量缩短事务执行时间,及时释放锁。
- 适当使用事务隔离级别:选择合适的隔离级别,例如使用
READ COMMITTED
可以避免部分死锁问题。
3.3 使用合适的事务隔离级别
- READ COMMITTED:每次读取时都会加共享锁,避免读取未提交的数据(脏读)。
- REPEATABLE READ:保证事务读取的一致性,避免幻读。
- SERIALIZABLE:最高级别的隔离,事务会按顺序执行,避免并发问题,但性能最差。
4. 总结
锁类型 | 锁粒度 | 并发性 | 锁定范围 | 事务隔离性 | 描述 |
---|---|---|---|---|---|
行锁 | 最细粒度(锁单行) | 高并发 | 锁定特定数据行 | 提供较高的事务隔离性,通常支持 Serializable 和 Repeatable Read | 锁定表中的单行数据,允许并发事务操作不同的行,但会增加锁竞争。 |
间隙锁 | 锁行之间的间隙(范围) | 中等并发 | 锁定两个索引值之间的“空隙” | 避免幻读现象,保证事务一致性。对插入操作有较强的隔离性。 | 锁定一个范围(空隙),防止其他事务在该间隙插入数据,从而避免幻读。 |
临键锁 | 锁定键值范围 | 中等并发 | 锁定特定的键值范围 | 提供类似于行锁的隔离性,但范围较大,常见于范围查询或索引范围的保护。 | 锁定某个键值范围,用于防止其他事务在此范围内修改数据,通常用于范围查询的场景。 |
表锁 | 粗粒度(锁整表) | 低并发 | 锁定整个表 | 提供较低的隔离性,通常用于不需要高并发的全表操作。 | 锁定整个表,所有事务都无法访问该表的数据,适用于全表操作如备份、清理等。 |
意向锁 | 由行锁或表锁组合成的锁粒度 | 不直接影响并发性 | 锁定事务意图的粒度 | 不直接影响事务隔离性,主要用于协调多粒度锁。 | 用于表示事务希望在更低粒度上加锁的意图,确保高粒度锁和细粒度锁不冲突。 |
MySQL 提供了丰富的锁机制,帮助我们在不同的并发环境下保护数据的一致性和完整性。合理选择锁的类型和粒度,能够有效提高系统的性能并降低冲突的概率。理解每种锁的特点和使用场景,能够帮助我们在数据库设计和优化时做出更加明智的决策。
相关文章:
【MySQL 进阶之路】锁详解
MySQL 锁详解 1. 锁的基本概念 锁在数据库中是用来保证数据一致性和防止并发冲突的一种机制。MySQL 中的锁可以分为不同的类型和粒度,每种锁都有特定的使用场景和特点。了解锁的类型、作用以及如何避免锁带来的问题是提升数据库性能和避免数据冲突的关键。 2. 锁…...
RK3588--解码H264(mpp-dec-h264-to-yuv-file)
1. 简介 源码下载:https://download.csdn.net/download/mao0514/90096131 本例完成H264格式文件解码,并保存为yuv格式文件。参考mpp_dec_test重写,进行了一部分精简。 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的 通用媒体…...
解决Conda虚拟环境中pip下载包总是到base环境的问题
conda本地创建的虚拟环境使用pip安装一些包总是安装到base环境中,导致无法正确进行环境隔离,下面是一些解决办法 方法一、使用python -m pip安装 1.1、验证虚拟环境的pip版本是哪个版本,如下所示,本人的demo虚拟环境直接使用pip…...
PyCharm 中设置虚拟环境
在 PyCharm 中设置虚拟环境的步骤如下: 1. 创建新项目时设置虚拟环境 1. 打开 PyCharm 并选择 New Project。 2. 在 Location 中指定项目路径。 3. 在右侧的 Python Interpreter 下,选择 New Environment。 Environment: 选择 Virtualenv。 Loca…...
M9484C VXG 矢量信号发生器- 110GHz-
M9484C VXG 矢量信号发生器 - 110GHz- M9484C VXG 是一款矢量信号发生器,在每个通道上提供 2.5 GHz 调制带宽,能够生成高达 54 GHz 的信号。 这款 VXG 矢量信号发生器可以组成经过校准和同步的全方位综合解决方案,帮助您更快测试下一代无线…...
机器学习详解(3):线性回归之代码详解
文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播:forward_propagation代价函数:cost_function反向传播:backward_propagation参数更新:update_parameters训练方法:train代码运行结果 3 使用Py…...
工业检测基础-工业相机选型及应用场景
以下是一些常见的工业检测相机种类、检测原理、应用场景及选型依据: 2D相机 检测原理:基于二维图像捕获,通过分析图像的明暗、纹理、颜色等信息来检测物体的特征和缺陷.应用场景:广泛应用于平面工件的外观检测,如检测…...
标准状态下一个气体分子每秒平均碰撞次数的估算
要估算在标准状态(0C, 1个大气压)下,一个气体分子在1秒内与其他分子的碰撞次数,我们可以使用一些基本的物理和化学原理。这个过程涉及到气体动力学理论,特别是麦克斯韦-玻尔兹曼分布。 计算气体分子的平均速率…...
使用PHPUnit使用本地调试代替远程调试,快速提高开发效率
Laravel 是一个在 Linux 环境下表现非常出色的 PHP 框架,但它在 Windows 环境下可能会遇到一些兼容性和配置问题。为了调试或没试的方便可以在 Windows 环境下进行 Laravel PHPUnit进行本地调试和测试。 本地主要针对断点调试效果非常高效。 在 Laravel 中&#x…...
Android 镜像模式和扩展模式区别探讨-Android14
Android 镜像模式和扩展模式区别探讨 1、区分镜像模式和扩展模式1.1 扩展屏是否有显示内容1.2 镜像模式显示条件 2、镜像模式界面 同屏显示和异屏显示探讨DisplayManagerService启动及主屏添加-Android13 Android主副屏显示-Android14 1、区分镜像模式和扩展模式 LogicalDispla…...
链表头文件大更新!!!
引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能,让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件,定义了一个模板类 LinkedListÿ…...
ROS2创建 base 包用于其他模块的参数配置和头文件依赖
Demo 背景 ROS2项目开发中存在以下需求:有多个包需要读取一些共同的配置项(以txt或者yaml形式存在),且依赖于一些公用的utils工具代码(C)。Solution: 创建一个 base_config 包来“存放” 配置文件和公用的头文件。gitee address: Gitee/CDal…...
设计模式の软件设计原则
文章目录 前言一、聚合&组合&继承&依赖1.1、继承1.2、组合1.3、聚合1.4、依赖 二、单一职责原则2.1、单一职责原则反面案例2.2、单一职责原则反面案例的改进 三、接口隔离原则3.1、接口隔离原则反面案例3.2、接口隔离原则反面案例的改进 四、依赖倒转原则4.1、依赖…...
【python自动化四】日志打印
我们在进行自动化测试时,需要打印过程日志和结果日志等,这里记录下日志的相关配置。这里我们直接自己新建一个logger。 先贴上日志代码如下,可根据需要修改: import logging import os import timefrom logging.handlers import …...
E498 ThinkPHP+MYSQL+LW+纯洁婚纱网站系统的设计与实现 源码 配置 文档 全套资料
婚纱网站系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 在互联网和电子商务迅速发展的今天,网络已经是人们日常生活所不可缺少的信息获取渠道,人们日常生活基本已完全被网络所覆盖,互联网影响到各…...
【PostgreSQL系列】列类型从整数转换为 UUID
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
shell脚本实战案例
文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑:在Windows系统写了一个脚本,比如上面,随后上传到服务,执行会报错 原因: 解决方案:在linux系统touch文件,并通过vim添加内容&…...
VAE为什么叫变分(variational),相对于AE有什么区别。
VAE为什么叫变分(variational),相对于AE有什么区别。 VAE为什么叫变分(variational)?VAE相对于AE有什么区别? VAE为什么叫变分(variational)? 变分自编码器&…...
Codeforces Round 991 (Div. 3)
补题连接 A. Line Breaks 思路:从头开始累加单词个数,超过m就退出。 代码: #include <bits/stdc.h> using namespace std; #define int long longvoid solve() {int n, m, k;cin >> n >> m;vector<string> a(n);…...
红日靶场vulnstark 4靶机的测试报告[细节](一)
目录 一、测试环境 1、系统环境 2、注意事项 3、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、漏洞利用Getshell ①Struts 2 s2-045漏洞 手工利用s2-45漏洞 Msf综合利用 ②Tomcat框架(CVE-2017-12615) ③phpMyAdmin(CVE-2018-12613) 构造语句写入冰蝎木…...
Android上运行OpenCV(Android Studio)
用Android Studio的话,整体来说没什么难的,照着教程来做就好了。 【OpenCV】OpenCV库的安装 - Android与OpenCV系列教程_哔哩哔哩_bilibili 主要就是导入module,然后加入依赖。代码只有几行。 if(OpenCVLoader.initLocal()){Toast.makeText(…...
代码随想录算法训练营day50|动态规划12
不同的子序列 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。、 编辑距离中的删除元素,其实就是直接变数字,其只删除原来的较长的数组里的元素 递推模拟,使用s的最后一个元素匹配,或者删除…...
图像生成-扩散模型的经典之作DDPM
论文:https://arxiv.org/pdf/2006.11239 项目:https://github.com/hojonathanho/diffusion Denoising Diffusion Probabilistic Models (DDPM) 是一种生成模型,它通过一系列逐步添加噪声的过程将数据点映射到一个简单的先验分布(…...
知识拓展 ?. 连选链操作
?. 连选链操作 ?. 可选链操作符 ?. 是可选链操作符,常用于访问引用类型具有不确定性的内部数据时,比如要访问一个对象中的数组,不确定数组一定有数据就可以使用 ? 取读取它的 length 属性,如果对象没有这个属性也仅会返回 …...
API设计指南:详解HTTP状态码错误解析、HTTP方法及参数命名规则
目录 1、HTTP API规范1.1 原则1.2 协议1.3 版本1.4 路径1.5 HTTP 方法(Method)1.6 过滤信息1.7 参数命名1.8 HTTP 状态码(Response Code)1.9 鉴权 2、状态码2.1 API返回基础规范2.2 常见的 HTTP 状态码2.3 API错误信息应该放到响应…...
【D3.js in Action 3 精译_043】5.1 饼图和环形图的创建(三):圆弧的绘制
当前内容所在位置: 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段(一)5.1.2 饼图布局生成器(二)5.1.3 圆弧的绘制(三) ✔️5.1.4 数据标签的添加(四&…...
7. 一分钟读懂“单例模式”
7.1 模式介绍 单例模式就像公司里的 打印机队列管理系统,无论有多少员工提交打印任务,大家的请求都汇总到唯一的打印管理中心,按顺序排队输出。这个中心必须全局唯一,避免多个队列出现资源冲突,保证打印任务井然有序。…...
如何让谷歌外链看起来更真实?
在SEO优化过程中,外链的自然性往往会被忽视,尤其是在一些急于见效的策略中,外链往往集中在高权重的少数几个网站上,导致外链结构单一且缺乏多样性。这样的外链网络容易让搜索引擎怀疑其真实性,进而影响网站排名。如何才…...
C标签和 EL表达式的在前端界面的应用
目录 前言 常用的c标签有: for循环 1 表示 普通的for循环的 2 常在集合中使用 表示 选择关系 1 简单的表示如果 2 表示如果。。否则。。 EL表达式 格式 : ${属性名/对象/ 集合} 前言 本篇博客介绍 c标签和el表达式的使用 使用C标签 要引入 …...
Luma 视频生成 API 对接说明
Luma 视频生成 API 对接说明 随着 AI 的应用变广,各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多,从最初的写作,到医疗教育,再到现在的视频。 Luma 是一个专业高质量的视频生成平…...
嵌入式基础:Linux C语言:Day7
重点: strlen()函数\strcpy()函数\strcat实现\strcmp()实现 数组的清空:bzero函数、memset函数 一、字符数组 <1> 概念 字符数组本质上就是一个数组,保存一个个字符,也一般用来保存字符串 字符串由多个字符组成的一个字符…...
阿里云盘permission denied
问题是执行 ./aliyunpan 时遇到了 Permission denied 的错误。这通常是因为文件没有执行权限。以下是解决问题的步骤: 检查文件权限 运行以下命令检查文件的权限: ls -l aliyunpan输出中会看到类似以下内容: -rw-r--r-- 1 user group 123…...
Flink学习连载文章12--FlinkSQL高级部分
eventTime 测试数据如下: {"username":"zs","price":20,"event_time":"2023-07-17 10:10:10"} {"username":"zs","price":15,"event_time":"2023-07-17 10:10:3…...
缓冲区溢出基础与实践
缓冲区溢出 缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹…...
matlab figure函数 single 数据类型
1.matlab figure函数详细介绍 在MATLAB中,figure函数用于创建新的图形窗口或激活现有的图形窗口。以下是figure函数的详细介绍和用法: 基本用法 创建新图形窗口:不带任何参数调用figure会创建一个新的图形窗口,并将其设为当前活…...
量化交易系统开发-实时行情自动化交易-8.15.Ptrade/恒生平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于Ptrade/恒生平台介绍。 P…...
Vue03
目录 一、今日目标 1.生命周期 2.综合案例-小黑记账清单 3.工程化开发入门 4.综合案例-小兔仙首页 二、Vue生命周期 三、Vue生命周期钩子 四、生命周期钩子小案例 1.在created中发送数据 六、工程化开发模式和脚手架 1.开发Vue的两种方式 2.Vue CLI脚手架 基本介绍…...
【AI学习】Mamba学习(十九):关于S4-FouT
在前面《Mamba学习(十六):从S4到S5模型》一文中,提到了S4D-Lin,其具体状态矩阵A的初始化形式为: S4D-Lin对比S4D-Inv是一种更简单的形式,可以看作是对S4-FouT(S4的另外一种变体&am…...
YOLOv5-C3模块实现
YOLOv5-C3模块实现 🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍖 原作者:K同学啊 电脑系统:Windows11 显卡型号:NVIDIA Quadro P620 语言环境:python 3.9.7 编译器:jupyt…...
ubuntu下Qt5自动编译配置QtMqtt环境(10)
文章目录 [toc]1、概述2、下载QtMqtt源码3、编译4、验证5、参考6、视频 更多精彩内容👉内容导航 👈👉Qt网络编程 👈 1、概述 Qt默认是不包含mqtt库的,如果需要使用到mqtt库就只能自己编译配置; 网络所有的…...
切比雪夫不等式:方差约束下的概率估计
切比雪夫不等式:方差约束下的概率估计 背景 在概率分析中,切比雪夫不等式是一个常用的工具,它通过引入随机变量的 方差信息,给出了偏离均值的概率界限。这一不等式是对 马尔科夫不等式 的自然扩展,结合了更丰富的分布…...
SIP系列七:ICE框架(P2P通话)
我的音视频/流媒体开源项目(github) SIP系列目录 目录 一、NAT 1、NAT介绍 2、NAT类型 2.1、 完全圆锥型NAT 2.2、受限圆锥型NAT 2.3、端口受限圆锥型NAT 2.4、对称NAT 3、NAT打洞 3.1、不同一NAT下 3.2、同一NAT下 二、ICE 三、ICE中的SDP 至此&#x…...
小程序-基于java+SpringBoot+Vue的智慧校园管理系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
Visual Studio 2022创建离线安装包
步骤1: 下载 Visual Studio 引导程序(最新版) 历史版本 步骤2 新建文件夹“E:\VS2022”,将下载的“vs_Professional.exe”拷贝到文件夹下在此文件夹窗口按住shift鼠标右键,选择“在此处打开powershell窗口” 步骤3 根据需要将代码复制到…...
Android 实现中英文切换
在开发海外项目的时候,需要实现app内部的中英文切换功能,所有的英文都是内置的,整体思路为: 创建一个sp对象,存储当前系统的语言类型,然后在BaseActivity中对语言进行判断; //公共Activitypubl…...
CmakeLists学习刨根问底
必要的两项内容 cmake_minimum_required(VERSION 2.5)project(mymuduo) 这行代码指定了构建项目所需的CMake最低版本为2.5。CMake是一个跨平台的自动化构建系统,它使用CMakeLists.txt文件来定义项目的构建过程。定义项目的名称为mymuduo。CMake将使用这个名称来生成…...
策略模式实战 - 猜拳游戏
**可以整体的替换一套算法,这就是策略模式。**这样对于同一个问题,可以有多种解决方案——算法实现的时候,可以通过策略模式来非常方便的进行算法的整体替换,而各种算法是独立封装好的,不用修改其内部逻辑。 具体的实…...
VoCo-LLaMA: Towards Vision Compression with Large Language Models
视觉语言模型在各种多模态任务上取得了显著的成功,但经常受到有限上下文窗口和处理高分辨率图像输入和视频的高计算成本的瓶颈。视觉压缩可以通过减少视觉令牌数量避免该问题。先前方法使用额外模块压缩视觉令牌并强制LLM理解压缩的令牌。然而,LLM对视觉…...
每日小知识
Kafka是一个分布式流平台,具有高性能、高可靠性和可扩展性的特点。它主要用于处理实时的数据流,将数据以高吞吐量的方式进行发布和订阅。以下是关于Kafka的几个基本概念和优势的介绍: 概念: 生产者(Producer…...
Linux其二设置端口号,静态ip以及命令
目录 1、VI编辑器 【linux版本的文本文件】 2) 补充的vi编辑器的其他内容(了解) 2、ln 连接的意思 link的缩写 3、文件的查看 【重点】 4、压缩与解压(重点) 5、find 查找命令 6、which & whereis 作用是一样的,表示某…...