Spring Boot项目中使用单一动态SQL方法可能带来的问题
1. 查询计划缓存的影响
深入分析
数据库系统通常会对常量SQL语句进行编译并缓存其执行计划以提高性能。对于动态生成的SQL语句,由于每次构建的SQL字符串可能不同,这会导致查询计划无法被有效利用,从而需要重新解析、优化和编译,降低了性能。此外,不同的参数组合可能导致查询计划的选择差异,影响查询效率。
实际案例
假设有一个查询用户信息的方法,根据不同的条件动态构建SQL:
public List<User> findUsers(Map<String, Object> criteria) {StringBuilder sql = new StringBuilder("SELECT * FROM users WHERE 1=1");if (criteria.containsKey("name")) {sql.append(" AND name = '").append(criteria.get("name")).append("'");}if (criteria.containsKey("age")) {sql.append(" AND age = ").append(criteria.get("age"));}// 执行SQL...
}
上述代码每次调用时都会产生不同的SQL语句,即使只是参数值的变化,也会被视为新的SQL,导致无法充分利用查询计划缓存。
解决方案与实例
使用MyBatis等ORM框架提供的<if>标签或动态SQL特性,确保SQL结构的一致性:
<!-- MyBatis Mapper XML -->
<select id="findUsers" parameterType="map" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>
通过这种方式,无论name
或age
参数是否存在,生成的SQL语句结构保持一致,可以充分利用查询计划缓存。
监控与调优
- 启用SQL日志记录:通过配置文件开启SQL日志,如
mybatis.configuration.log-impl=STDOUT_LOGGING
,以便查看生成的SQL语句。 - 使用数据库性能工具:例如MySQL的
EXPLAIN
命令或Oracle的DBMS_XPLAN
来分析查询计划,确保查询是高效的。 - 定期审查和优化SQL:随着业务需求变化,定期审查和优化现有的SQL语句,以适应新的数据分布情况。
2. 预编译语句(PreparedStatement)的重用
深入分析
直接拼接SQL字符串而不使用预编译语句,会使得每个请求都被视为新的SQL语句,失去预编译的优势。预编译语句不仅可以防止SQL注入攻击,还能让数据库更好地缓存和重用查询计划,提升性能。
实际案例
考虑一个插入用户信息的操作:
String sql = "INSERT INTO users (name, age) VALUES ('" + user.getName() + "', " + user.getAge() + ")";
Statement stmt = connection.createStatement();
stmt.executeUpdate(sql);
这种方法不仅存在SQL注入风险,而且每次执行都会被视为新的SQL语句,无法利用预编译的优势。
解决方案与实例
使用JDBC的PreparedStatement
或者ORM框架中的相应功能:
// 使用 PreparedStatement 来避免SQL注入并提高性能
String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
try (PreparedStatement pstmt = connection.prepareStatement(sql)) {pstmt.setString(1, user.getName());pstmt.setInt(2, user.getAge());pstmt.executeUpdate();
}
或者使用Spring Data JPA:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {@Modifying@Query("INSERT INTO User(name, age) VALUES(:name, :age)")void insertUser(@Param("name") String name, @Param("age") int age);
}
监控与调优
- 使用连接池监控工具:如HikariCP自带的监控功能,跟踪连接池的状态,确保连接的创建和释放符合预期。
- 设置合理的超时时间:为SQL执行设置合理的超时时间,避免长时间运行的查询阻塞其他操作。
3. 复杂度增加与索引使用
深入分析
复杂的动态SQL可能导致SQL语句庞大且难以优化,也可能影响索引的有效利用。不恰当的索引使用会显著降低查询效率。例如,过多的JOIN操作、子查询或不合适的WHERE条件都可能导致性能下降。
实际案例
假设有一个查询订单详情的方法,包含多个表的JOIN操作:
SELECT o.*, p.product_name
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE o.user_id = ? AND o.status IN (?, ?, ?)
如果status
字段上没有适当的索引,随着数据量的增长,查询效率会显著下降。
解决方案与实例
简化SQL逻辑,选择必要的字段而不是使用SELECT *
,并且确保经常使用的查询条件上有适当的索引:
-- 简化的查询,只选择必要的字段,并确保有适当的索引
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
SELECT o.order_id, o.total_amount, p.product_name
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE o.user_id = ? AND o.status IN (?, ?, ?)
监控与调优
- 定期检查索引使用情况:通过数据库的日志或统计信息,了解哪些索引被频繁使用,哪些索引几乎未被触及,据此调整索引策略。
- 避免过度索引:虽然索引可以加速查询,但过多的索引会增加写入成本。因此,应平衡读写性能,合理设计索引。
4. 线程安全问题
共享资源的竞争
问题描述: 如果多个线程同时访问同一个动态SQL方法,并且该方法内部有状态信息,可能会引发竞争条件。
解决方案与实例:
-
无状态服务:确保服务类方法是无状态的,即不依赖于类级别的变量。
@Service public class UserService {@Transactionalpublic void updateUserInfo(User user) {userRepository.save(user);} }
-
同步机制:如果确实需要共享状态,可以考虑使用同步机制,如
synchronized
关键字或原子类(AtomicInteger
等),但应尽量避免这种情况,因为它们会影响性能。
事务管理
问题描述: 高并发环境下,如果没有正确配置事务隔离级别或处理好事务边界,可能会出现脏读、不可重复读等问题。
解决方案与实例:
确保每个业务逻辑都有合适的事务控制。使用@Transactional
注解显式定义事务边界,并根据需要设置适当的事务属性,如传播行为和隔离级别。
@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;@Transactional(isolation = Isolation.READ_COMMITTED)public void placeOrder(Order order) {// 业务逻辑...orderRepository.save(order);}
}
连接池耗尽
问题描述: 长时运行的操作或异常处理不当可能会导致数据库连接长时间未释放,进而耗尽连接池中的可用连接。
解决方案与实例:
确保所有数据库操作都在finally块中关闭资源,或者使用try-with-resources语句自动管理资源的生命周期。此外,合理配置连接池的最大连接数、超时时间等参数。
@Autowired
private DataSource dataSource;public void executeQuery() {try (Connection conn = dataSource.getConnection();Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {while (rs.next()) {// 处理结果集...}} catch (SQLException e) {// 异常处理...}
}
监控与调优
- 使用APM工具:如New Relic、Prometheus+Grafana等,实时监控应用程序的性能指标,包括数据库连接池的状态。
- 设置告警规则:为关键性能指标设定告警阈值,当达到阈值时及时通知开发团队采取行动。
- 分析慢查询日志:定期分析数据库的慢查询日志,找出性能瓶颈,并针对性地进行优化。
结论
通过以上深入分析可以看到,在Spring Boot项目中使用单一动态SQL方法修改数据确实有可能带来一系列问题,包括但不限于SQL执行效率低下和线程安全风险。为了解决这些问题,我们应该遵循以下最佳实践:
- 利用查询计划缓存:确保SQL语句结构的一致性,以便数据库可以有效地缓存和重用查询计划。
- 使用预编译语句:避免直接拼接SQL字符串,使用预编译语句来防止SQL注入并提高性能。
- 优化SQL逻辑和索引:简化SQL逻辑,选择必要的字段,并确保频繁使用的查询条件上有适当的索引。
- 保证线程安全:设计无状态的服务方法,正确配置事务隔离级别,以及合理管理和配置数据库连接池。
- 实施监控与调优:引入监控工具和技术,持续追踪系统的性能表现,及时发现并解决潜在的问题。
通过遵循这些原则,不仅可以提高系统的性能,还可以增强系统的稳定性和可维护性。此外,建立一套完善的监控体系,可以帮助我们在问题发生之前就察觉到性能瓶颈,从而提前进行优化和改进。
相关文章:
Spring Boot项目中使用单一动态SQL方法可能带来的问题
1. 查询计划缓存的影响 深入分析 数据库系统通常会对常量SQL语句进行编译并缓存其执行计划以提高性能。对于动态生成的SQL语句,由于每次构建的SQL字符串可能不同,这会导致查询计划无法被有效利用,从而需要重新解析、优化和编译,…...
51单片机——中断(重点)
学习51单片机的重点及难点主要有中断、定时器、串口等内容,这部分内容一定要认真掌握,这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在&#…...
MySQL insert or update方式性能比较
MySQL中,有如下两种方式,哪种方式比较好? 1、先使用enterprise_id字段查询数据表,如果表中存在记录,则更新记录;如果不存在,则插入记录; 2、使用“INSERT INTO XXX ON DUPLICATE K…...
Linux下常用命令
本文以笔记的形式记录Linux下常用命令。 注1:限于研究水平,阐述难免不当,欢迎批评指正。 注2:文章内容会不定期更新。 一、Ubuntu 添加账号 useradd -m -s /bin/bash -d /home/newuser newuser:newuser passwd newuser 二、 Ce…...
计算机网络、嵌入式等常见问题简答
1.嵌入式系统中经常要用到无限循环,如何用C编写死循环 答:while(1){}或者for(;;) 2.程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里。 答:程序的局部变量存在于栈区;全局变量存在…...
嵌入式中QT实现文本与线程控制方法
第一:利用QT进行文件读写实现 利用QT进行读写文本的时候进行读写,读取MP3歌词的文本,对这个文件进行读写操作。 实例代码,利用Qfile,对文件进行读写。 //读取对应文件文件,头文件的实现。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #incl…...
141.环形链表 142.环形链表II
141.环形链表 & 142.环形链表II 141.环形链表 思路:快慢指针 or 哈希表 快慢指针代码: class Solution { public:bool hasCycle(ListNode *head) {if(headnullptr||head->nextnullptr)return false;ListNode *fasthead->next; //不能设置成…...
计算机网络掩码、最小地址、最大地址计算、IP地址个数
一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位,那么主机号32-1517位。 4.IP地址的个数:2**n (n表示主机号的位数) 5.可用(可分配)IP地址个数&#x…...
第3章——HTTP报文内的HTTP信息
第3章——HTTP报文内的HTTP信息 HTTP报文 用于HTTP协议交互的信息被称为HTTP报文,分为请求报文和响应报文。分为Head,Body 结构: 请求行:包含用于请求的方法,请求URI和HTTP版本。 状态行:包含表明响应…...
Minio-Linux-安装
文章目录 1.Linux安装1.下载源码包2.上传到/usr/local/minio1.进入目录2.上传 3.开放执行权限4.创建minio文件存储目录及日志目录5.编写启动的shell脚本1.脚本编写2.赋予执行权限 6.启动!1.执行run脚本2.查看日志3.开放9001和9000端口1.服务器2.安全组3.访问&#x…...
面试高阶问题:对称加密与非对称加密的原理及其应用场景
目录 第一章 对称加密原理及算法实现 第二章 非对称加密原理及算法实现 第三章 对称加密与非对称加密的应用场景 第四章 对称加密与非对称加密的应用实例 第五章 对称加密与非对称加密的对比分析 第一章 对称加密原理及算法实现 1.1 对称加密的原理 对称加密,又称私钥加密…...
报错 - decord 在 macOS Silicon 安装失败
问题:在 macOS M2 上 pip 安装 decord 出错: ERROR: Could not find a version that satisfies the requirement decord (from versions: none) ERROR: No matching distribution found for decord使用 decord 源码编译,make 也会出很多问题 …...
英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望
一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时,核心架构与制程工艺无疑是最为关键的基础要素,它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…...
PyCharm简单调试
本文简单讲述一下PyCharm中经常用到的调试操作。 示例代码如下: for i in range(10):print("hello", i)if i > 2:print("ok!")在代码前面打上断点,如下图所示: 单机调试按钮Debug 单机Resume Program按钮…...
快速入门Spring Cloud Alibaba,轻松玩转微服务
1 快速入门Spring Cloud Alibaba,轻松玩转微服务 1.1 架构 架构图: 1.2 项目结构 1.2.1 系统框架版本 版本适配查看:https://sca.aliyun.com/docs/2023/overview/version-explain/ Spring Boot Version :3.2.4 Spring Clo…...
浅尝Appium自动化框架
浅尝Appium自动化框架 Appium自动化框架介绍Appium原理Appium使用安装平台驱动 Appium自动化框架介绍 Appium 是一个开源的自动化测试框架,最初设计用于移动应用的测试,但现在它也扩展了对桌面端应用的支持。Appium 使得自动化测试变得更加简单…...
poi-tl+kkviewfile实现生成pdf业务报告
需求背景,需要把ai生成的一些业务数据,生成一份pdf报告 需求分析 简单来说,就是json生成pdf的方案。 直接生成pdf。适合一些pdf样式简单的场景,一般就是纯文本按序渲染,或者是纯表格。如果需要一些复杂的排布&#x…...
python导入模块失败
运行下面代码模块,出现报错,导入模块失败 import torch from layers.Embed import DataEmbedding from layers.Conv_Blocks import Inception_Block_V1 将你自己的目录添加到 sys.path,假设你的目录位置是D://winhzq//桌面//pydemo//…...
Vulkan 学习(12)---- Vulkan pipeline 创建
目录 Vulkan 渲染管线顶点输入阶段输入装配阶段顶点着色器阶段细分控制、评估着色器阶段(可选)几何着色器阶段(可选)图元装配阶段光栅化阶段片段着色器片段测试阶段混合阶段 Vulkan 渲染管线 渲染管线可以看作是一条生产流水线,定义了从输入顶点到输出图像的所有步…...
BloombergGPT: A Large Language Model for Finance——面向金融领域的大语言模型
这篇文章介绍了BloombergGPT,一个专门为金融领域设计的大语言模型(LLM)。以下是文章的主要内容总结: 背景与动机: 大语言模型(如GPT-3)在多个任务上表现出色,但尚未有针对金融领域的…...
来说数据库
什么是数据库? 是部署在操作系统上,把数据按一定的数据模型组织、永久存储,并可以被用户共享的软件系统。 其实数据库,可以理解为,把数据都存成文件,有很多的文件和很多的目录,不好管理…...
教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件
1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…...
嵌入式驱动开发详解11(INPUT子系统)
文章目录 前言input子系统简介主要结构体API函数input子系统驱动框架上报事件后续设备树配置方式参考文献 前言 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input 子系统的框架来处理输入事件。输入设备本质上还是字符设备&…...
动态规划解决目标和问题
代码随想录链接:代码随想录 思路: 可以将数组分为两部分,其中一部分记作left,其中数字的符号全为,而另外一部分记作right,其中数字的符号全为-。这里全为-的意思不是真正的符号为-,而表示这一堆数字在计算时取值为负 因此有如下…...
【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行
0x00 前言 最近在做渗透笔记,其中有一个靶机在getshell后,需要进行提权。发现靶机使用root启动的mysql服务,那么尝试使用UDF提权。于是在提权成功后,花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用,加深理解。…...
特种设备安全管理人员免费题库限时练习(判断题)
56.(判断题)特别重大事故、重大事故、较大事故和一般事故,负责事故调查的人民政府应当自收到事故调查报告之日起15日内做出批复。 A.正确 B.错误 答案:错误 57.(判断题)每一类事故灾难的应急救援措施可能千差万别,因此其基本应急模式是不一致的。 A.正确 B.错误 答案:错…...
linux-25 文件管理(三)复制、移动文件,cp,mv
命令cp是copy的简写,而mv则是move的简写。那既然copy是用于实现复制文件的,那通常一般我们要指定其要复制的是谁?而且复制完以后保存在什么地方,对吧?那因此它的使用格式很简单,那就是cp srcfile dest&…...
中国科技统计年鉴EXCEL版(2021-2023年)-社科数据
中国科技统计年鉴EXCEL版(2021-2023年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028724 https://download.csdn.net/download/paofuluolijiang/90028724 中国科技统计年鉴提供了从2021至2023年的详尽数据,覆盖了科技…...
Idea(中文版) 项目结构/基本设置/设计背景
目录 1. Idea 项目结构 1.1 新建项目 1.2 新建项目的模块 1.3 新建项目模块的包 1.4 新建项目模块包的类 2. 基本设置 2.1 设置主题 2.2 设置字体 2.3 设置注释 2.4 自动导包 2.5 忽略大小写 2.6 设置背景图片 3. 项目与模块操作 3.1 修改类名 3.2 关闭项目 1. I…...
jenkins入门--安装jenkins
下载地址https://www.jenkins.io/ jdk 安装 :Jenkins需要安装对应版本的jdk,我在安装过程中显示需要21,17 Java Downloads | Oracle jenkins安装过程参考全网最清晰Jenkins安装教程-windows_windows安装jenkins-CSDN博客 安装完成后,浏览器输入127.0.…...
基于Springboot + vue实现的小型养老院管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
shell基础使用及vim的常用快捷键
一、shell简介 参考博文1 参考博文2——shell语法及应用 参考博文3——vi的使用 在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是 / b in/ b a s h ,流行的shell…...
Mac 安装psycopg2出错:Error:pg_config executable not found的解决
在mac 上执行pip3 install psycopg2-binary出现如下错误: Error:pg_config executable not found然后我又到终端里执行 brew install postgresql16 显示 Warning: You are using macOS 15. We do not provide support for this pre-release version. It is expe…...
UniApp | 从入门到精通:开启全平台开发的大门
UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…...
Kafka3.x KRaft 模式 (没有zookeeper) 常用命令
版本号:kafka_2.12-3.7.0 说明:如有多个地址,用逗号分隔 创建主题 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1删除主题 bin/kafka-topics.sh --delete --boots…...
【竞技宝】CS2:NertZ离队Liquid光速加盟!
2025年1月7日,目前CS2的赛事正处于空窗期中,很多队伍在近期都在进行阵容上的调整,其中出现了很多震惊观众的转会消息。今日凌晨,HEROIC官宣队内的NertZ选手正式离队,此后Liquid很快发布消息宣布了NertZ的加盟。 今日凌…...
PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 PDFMathTranslate是一个开源项目,旨在为用户提供便捷的PDF科学论文翻译解决方案。它不仅能够翻译文本,还能保留公式、图表、目…...
滑动窗口——最小覆盖子串
一.题目描述 76. 最小覆盖子串 - 力扣(LeetCode) 二.题目解析 题目还是很好理解的,就是在字符串s中找到一个子串,该子串包含字符串t的所有字符。返回最短的子串。如果s中不包含这样的子串就返回一个空串。 需要注意的是&#…...
2012mfc,几种串
串,即是由符组成的串,在标准C,标准C,MFC中串这一功能的实现是不相同的,C完全兼容了C. 1.标准C中的串 在标准C中没有串数据类型,C中的串是有符类型的符数组或符类型的符指针来实现的.如: char name[26]"This is a Cstyle string"; //或char *name"This is a…...
基于SpringBoot的乐器商城购物推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维
Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维 具体实例与推演 假设我们有一个离散型随机变量 X X X,它表示掷一枚骰子得到的点数,求 X X X 的期望。 步骤: 列出 X X X 的所有可能取值 x i x_i xi(…...
asp.net core中的 Cookie 和 Session
在 Web 开发中,用户会话管理是非常重要的,尤其是在需要保持用户状态和身份验证的应用中。ASP.NET Core 提供了多种状态管理技术,如 Cookie 和 Session,它们可以帮助你管理用户会话、存储数据并实现用户身份验证等功能。下面将详细…...
【STM32+CubeMX】 新建一个工程(STM32F407)
相关文章: 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步Cu…...
IO进程day1
一、思维导图...
剧本字幕自己看
Hello English learners! Welcome back to my channel! My name is Ethan, and today we’re diving into a topic we deal with every day—traffic. 大家好,英语学习者们!欢迎回到我的频道!我是Ethan,今天我们要聊一个每天都会遇到的话题——交通。 When I drive somewh…...
Java排序
Map Stream 排序 最簡單的排序方式 Map<String,String> _lineMap = _itRow.next();_lineMap = _lineMap.entrySet().stream().sorted((i1,i2)>i1.getKey().compareTo(i2.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(e1,e2)->e…...
Geoserver修行记-后端调用WMS/WMTS服务无找不到图层Could not find layer
项目场景 调用geoserver地图服务WMS,找不到图层 我在进行地图服务调用的时候,总是提示我找不多图层 Could not find layer,重点是这个图层我明明是定义了,发布了,且还能够正常查看图层的wms的样式,但是在调用后端调用…...
JavaScript代码片段二
见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... JavaScript统计文字个数、特殊字符转义、动态插入js代码、身份证验证 统计文字个数 f…...
Opencv图片的旋转和图片的模板匹配
图片的旋转和图片的模板匹配 目录 图片的旋转和图片的模板匹配1 图片的旋转1.1 numpy旋转1.1.1 函数1.1.2 测试 1.2 opencv旋转1.2.1 函数1.2.2 测试 2 图片的模板匹配2.1 函数2.2 实际测试 1 图片的旋转 1.1 numpy旋转 1.1.1 函数 np.rot90(kl,k1),k1逆时针旋转9…...
ebpf 笔记
eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能 https://zhuanlan.zhihu.com/p/712220029 eBPF技术简介 - 阅读清单 - 腾讯云开发者社区-腾讯云 从石器时代到成为“神”,一文讲透eBPF技术发展演进史 …...