中间件专栏之MySQL篇——MySQL缓存策略
本文所说的MySQL缓存策略与前文提到的buffer pool不同,那是MySQL内部自己实现的,本问所讲的缓存策略是使用另一个中间件redis来缓存MySQL中的热点数据。
一、为什么需要MySQL缓存方案
缓存用户定义的热点数据,用户可以直接从缓存中获取热点数据,降低数据库的读写压力。具体的原因如下:1、内存访问速度约是磁盘的10万倍,可极大节省时间;2、一般使用缓存的场景读的需求远远大于写的需求;3、MySQL自身的缓冲层与业务无关,无法实现用户自定义热点数据的缓存;4、一般而言,MySQL作为主数据库,redis作为辅助数据库,存放热点数据(主数据库一定是磁盘数据库,因为要保证数据的安全)。
二、缓存方案的基本原理
redis和MySQL数据一致性状态分析,共分为5种情况:
1、数据MySQL有,redis无;
2、数据MySQL无,redis有;
3、数据MySQL有,redis有,但不一致;
4、数据MySQL有,redis有,且一致;
5、数据MySQL无,redis无;
其中,状态1,4,5是合理的状态,2,3是不合理状态,并且状态4是理想状态,其他状态需要向状态4靠拢。
用户定义的热点数据如何读写?
读:先读redis(下文统称缓存),缓存存在则直接返回;不存在则访问MySQL,再写入缓存。
写:1、保证安全的方法:先删除缓存中的数据,再写入MySQL,最后同步至缓存;
2、提高效率但损失部分安全性的方法:先写入缓存并设置过期时间(过期时间=MySQL网络传输时间+MySQL处理时间+MySQL同步到缓存时间),再写入MySQL,最后MySQL再同步至缓存。该方法的唯一脆弱性在于MySQL还没同步到缓存的那段时间,可能出现数据不一致。(描述的比较抽象,读者若不理解可在评论区留言)。
上述讲到的MySQL同步至缓存,如何同步?
常用的有go-mysql-transfer,主要原理是伪装MySQL从数据库,此处不赘述,可自行查阅资料。
三、缓存方案的常见故障问题及解决方案
在使用Redis缓存用户定义的热点数据时,可能会遇到一些故障问题,通常会影响到应用的性能和数据一致性。以下是一些常见的故障问题及其解决方案:
1. 缓存雪崩
问题描述:缓存雪崩是指在同一时间大量缓存失效或重启缓存时,所有的请求都直接访问数据库,造成数据库压力骤增,进而引发系统崩溃或性能下降。
解决方案:
- 缓存失效时间错峰:为不同的缓存设置不同的过期时间,避免所有缓存同时失效。例如,可以给热点数据设置较长的过期时间,并随机化失效时间。
- 使用Redis持久化机制:启用Redis的AOF(Append Only File)或RDB(快照)持久化机制,在Redis重启时可以恢复缓存数据,避免每次重启都从数据库加载。
- 引入多级缓存:在Redis之外引入本地缓存(如应用服务器本地内存)来缓解Redis压力。
2. 缓存击穿
问题描述:缓存击穿是指某个热点数据的缓存失效时,多个请求同时访问数据库,造成数据库压力过大。特别是当某些热点数据缓存已经过期时,所有请求都直接访问数据库,可能会导致系统性能问题。
解决方案:
- 加锁机制:当缓存失效时,可以使用分布式锁(如Redis的
SETNX
)来保证同一时刻只有一个请求去加载数据,其他请求等待缓存更新,减少对数据库的压力。 - 使用队列缓存更新机制:可以使用队列(如Redis的List或Stream)来将数据加载的请求排队,避免多个请求同时去访问数据库。
3. 缓存数据不一致
问题描述:由于缓存和数据库的数据不同步,可能会导致数据不一致的问题。例如,数据库中的数据发生了变更,而缓存没有及时更新。
解决方案:
- 缓存更新策略:
- 主动更新:当数据库中的数据发生变化时,主动更新或删除相应的缓存。这通常通过数据库触发器或应用层代码来实现。
- 延迟双删策略:在缓存更新时,先删除缓存,再写入新的缓存。如果出现缓存未更新的情况,再进行第二次删除缓存,避免由于并发问题导致缓存一致性问题。
- 使用定时任务同步:定时任务可以用于同步数据库和缓存的数据,定期清除过期或失效的缓存数据。
4. Redis单点故障
问题描述:如果Redis作为缓存的唯一节点,发生故障(如宕机),将会导致整个缓存不可用,影响应用的性能。
解决方案:
- Redis集群或哨兵模式:使用Redis的高可用方案(如Redis Sentinel、Redis Cluster等)来保证Redis的高可用性。这样即使主节点宕机,Redis集群或哨兵可以自动进行主从切换,保证服务的连续性。
- 持久化机制:启用Redis的AOF或RDB持久化机制,确保数据在Redis崩溃后能够恢复。
5. 缓存穿透
问题描述:缓存穿透是指请求访问的数据既不存在于缓存中,也不存在于数据库中,导致每次请求都直接查询数据库,增加数据库负载。
解决方案:
- 使用布隆过滤器:在缓存前面加一个布隆过滤器,当某个数据不存在时,布隆过滤器可以直接判断并阻止请求访问数据库。
- 空值缓存:对于不存在的数据,可以将空值缓存一段时间,避免同样的请求频繁访问数据库。比如,当查询的数据不存在时,可以将返回值为空的情况缓存,设置较短的过期时间。
6. 缓存容量限制
问题描述:Redis缓存有限,当缓存数据量过大时,可能会出现Redis内存不足,导致缓存数据丢失或者缓存失效。
解决方案:
- LRU(Least Recently Used)淘汰策略:Redis提供了多种淘汰策略,默认使用LRU算法,在内存不足时,Redis会自动删除最久未使用的缓存数据。可以根据业务需求调整淘汰策略。
- 合理设计缓存策略:对缓存数据进行合理设计,定期清理过期缓存,避免无意义的数据存储占用内存。
其中1,2,5是最为常见的故障。
四、MySQL三大日志的作用、区别以及刷盘时机
1. 二进制日志(Binlog)
作用:
- 数据恢复:二进制日志记录了所有更改数据库结构或数据的操作(如
INSERT
、UPDATE
、DELETE
等),因此可以用于数据库恢复。在发生故障时,可以通过备份加上二进制日志来恢复到某个特定时间点的数据。 - 主从复制:二进制日志是MySQL主从复制的基础。主数据库将操作写入二进制日志,从数据库通过读取主数据库的二进制日志来同步数据。
- 审计:可以用来记录数据库的所有更改操作,帮助审计和追踪某些特定操作的执行情况。
刷盘时机:
- Binlog的写入是按事务提交的,即当事务提交时,binlog会同步到磁盘。使用
sync_binlog
参数控制刷新频率。 - sync_binlog=0:表示不强制写入,可能会丢失binlog日志。
- sync_binlog=1:每次写入都会强制刷新binlog到磁盘。
- sync_binlog>1:表示每次写入时会在多个binlog文件之间做同步,降低写入频率,但增加一些风险。
2. 错误日志(Error Log)
作用:
- 记录启动和停止:记录MySQL服务器的启动和关闭过程中的各种信息,包括启动、停止、重启等日志。
- 错误记录:记录运行中的各种错误信息,如语法错误、权限问题、资源不足等。
- 警告信息:记录数据库在运行过程中遇到的一些警告信息或非致命错误。
刷盘时机:
- 错误日志通常在数据库启动时和操作过程中进行记录,通常以文件的形式存在并实时更新。因此,错误日志的刷盘时机通常为每次写入日志时即进行刷新,不需要额外的配置。
3. 查询日志(General Log)
作用:
- 记录所有查询:查询日志会记录MySQL服务器接收到的所有SQL查询语句(无论是否成功执行),这对于开发、调试、性能分析非常有用。
- 性能分析:通过查看查询日志,可以分析哪些查询语句执行时间较长,或者执行频率较高,从而帮助优化SQL查询。
区别:
- 查询日志与错误日志:
- 查询日志记录的是所有执行的SQL语句,不管是否出错;
- 错误日志记录的是MySQL启动/停止/崩溃等相关的错误信息,以及执行失败的SQL语句。
- 查询日志与二进制日志:
- 查询日志记录所有的查询操作,但不涉及数据的改变,它是“所有SQL语句的镜像”;
- 二进制日志记录的是实际对数据库数据产生变化的操作,通常会比查询日志更为简洁且有用,用于恢复和主从同步。
刷盘时机:
- 查询日志会随着每次SQL语句的执行而实时记录,所以一般会进行实时刷盘。
刷盘时机总结:
- 二进制日志(Binlog):根据
sync_binlog
参数设置,常见的做法是每次事务提交时写入磁盘。 - 错误日志(Error Log):实时刷盘,记录数据库运行状态和错误信息。
- 查询日志(General Log):实时刷盘,记录所有的查询操作。
总结:
日志类型 | 主要功能 | 是否包含数据变化 | 是否记录所有操作 | 刷盘时机 |
---|---|---|---|---|
二进制日志 | 数据恢复、主从复制、审计 | 是 | 否 | 事务提交时写入 |
错误日志 | 记录数据库错误、启动/停止等信息 | 否 | 否 | 实时刷盘 |
查询日志 | 记录所有SQL查询 | 否 | 是 | 实时刷盘 |
PS:还有一种说法是三大日志是binlog,redolog,undolog,因此我把另两种也总结在下面。
Undo Log 和 Redo Log 是 MySQL 中事务日志的一部分,用于支持事务的回滚(Undo)和恢复(Redo) 。
1. Undo Log
作用:
- 事务回滚:Undo Log 主要用于支持事务的回滚(Rollback)操作。当一个事务中的操作出现错误或用户主动回滚时,Undo Log 用于撤销事务中已经进行的操作,将数据恢复到事务开始之前的状态。
- 多版本并发控制(MVCC):Undo Log 也被 MySQL 用于实现 多版本并发控制,即不同事务可以并发操作同一行数据而不冲突。通过存储数据的历史版本,其他事务可以读取旧的版本,避免锁冲突。
- 保持一致性:在数据库崩溃或重启时,Undo Log 会确保未提交的事务所做的修改不会被永久保留,从而保证数据库的一致性。
刷盘时机:
- Undo Log 的刷盘通常是与 事务的提交和回滚 相关的。当事务提交或回滚时,Undo Log 记录会写入磁盘。如果事务未提交,则这些记录会被删除。
- 一般情况下,Undo Log 是缓存在内存中的,在事务提交时会刷新到磁盘,具体的刷盘频率和配置取决于
innodb_flush_log_at_trx_commit
配置。
2. Redo Log
作用:
- 事务恢复:Redo Log 记录了已提交事务的操作,用于数据库崩溃后的恢复操作。Redo Log 中包含了已提交事务对数据库数据的修改,数据库崩溃时,通过 Redo Log 来确保所有已提交的事务不会丢失。
- 确保持久性(Durability):Redo Log 是 MySQL InnoDB 存储引擎实现事务持久性(Durability)特性的关键。即使数据库发生崩溃,只要事务已经提交,相应的数据修改也会被持久化。
- 崩溃恢复:在 MySQL 崩溃恢复时,Redo Log 会被用来恢复已提交的事务。这是通过重放 Redo Log 中记录的操作来实现的。
刷盘时机:
- Redo Log 的写入频率可以通过
innodb_flush_log_at_trx_commit
来控制。常见的值有:innodb_flush_log_at_trx_commit = 1
:每次事务提交时,都会将 Redo Log 刷新到磁盘,确保事务持久性。这种设置保证了最强的数据一致性,但性能开销较大。innodb_flush_log_at_trx_commit = 2
:每次事务提交时,Redo Log 写入到操作系统的缓冲区,但不立即刷新到磁盘。系统崩溃时,可能会丢失一些未刷新的日志,但性能相对较好。innodb_flush_log_at_trx_commit = 0
:Redo Log 写入到内存,但并不立刻刷新到磁盘。性能最好,但崩溃恢复时可能会丢失已提交事务的数据。
Undo Log 和 Redo Log 的区别
特性 | Undo Log | Redo Log |
---|---|---|
功能 | 支持事务回滚,撤销操作,保证一致性 | 支持事务恢复,保证持久性 |
内容 | 记录事务对数据的修改前的值(用于回滚) | 记录事务对数据的修改后的值(用于恢复) |
是否持久化 | 不持久化,仅在事务中有效 | 持久化,确保崩溃恢复时不会丢失已提交的事务数据 |
使用场景 | 事务回滚,MVCC(多版本并发控制) | 事务提交后,数据库崩溃恢复时 |
刷盘时机 | 事务提交或回滚时写入磁盘 | 事务提交时,具体配置决定刷新频率 |
存储位置 | 存储在内存中,在事务提交或回滚时写入磁盘 | 存储在磁盘上,一直保留用于崩溃恢复 |
总结:
- Undo Log 主要用于支持事务回滚和多版本并发控制,确保事务操作可以撤销,并且保持数据一致性。
- Redo Log 主要用于事务的持久性,确保已提交事务的数据在系统崩溃后不会丢失,保证事务的持久性。
相关文章:
中间件专栏之MySQL篇——MySQL缓存策略
本文所说的MySQL缓存策略与前文提到的buffer pool不同,那是MySQL内部自己实现的,本问所讲的缓存策略是使用另一个中间件redis来缓存MySQL中的热点数据。 一、为什么需要MySQL缓存方案 缓存用户定义的热点数据,用户可以直接从缓存中获取热点…...
高频 SQL 50 题(基础版)_196. 删除重复的电子邮箱
高频 SQL 50 题(基础版)_196. 删除重复的电子邮箱 思路 思路 DELETE p1 FROM Person p1,Person p2 WHEREp1.Email p2.Email AND p1.Id > p2.Id...
github进不去,一直显示错误
1、进入网址Dns检测|Dns查询 - 站长工具 2、复制检测出来的任意一个ip 3、打开电脑的文件夹:C:\Windows\System32\drivers\etc 下的hosts文件下复制这个ip地址 20.205.243.166 4、winr 打开cmd,输入ipconfig/flushdns ipconfig/flushdns出现这个就可以…...
MWC 2025|美格智能发布基于高通®X85 5G调制解调器及射频的新一代5G-A通信模组SRM819W
3月3日,在MWC 2025世界移动通信大会上,美格智能正式推出基于高通X85调制解调器及射频的新一代5G-A通信模组SRM819W,集5G-A、毫米波、AI加持的网络优化等最前沿的通信技术,成为行业首批搭载高通X85的5G通信模组产品,将助…...
【零基础到精通Java合集】第十集:List集合框架
课程标题:List集合框架(15分钟) 目标:掌握List接口核心实现类(ArrayList/LinkedList)的使用与场景选择,熟练操作有序集合 0-1分钟:List概念引入 以“购物清单”类比List特性:元素有序(添加顺序)、可重复、支持索引访问。说明List是Java集合框架中最常用的数据结构…...
《今日-AI-编程-人工智能日报》
一、AI行业动态 荣耀发布“荣耀阿尔法战略” 荣耀在“2025世界移动通信大会”上宣布,将从智能手机制造商转型为全球领先的AI终端生态公司,并计划未来五年投入100亿美元建设AI设备生态。荣耀展示了基于GUI的个人移动AI智能体,并推出多款AI终端…...
在 MyBatis 中,若数据库字段名与 SQL 保留字冲突解决办法
在 MyBatis 中,若数据库字段名与 SQL 保留字冲突,可通过以下方法解决: 目录 一、使用转义符号包裹字段名二、通过别名映射三、借助 MyBatis-Plus 注解四、全局配置策略(辅助方案)最佳实践与注意事项 一、使用转义符号…...
从基础到实践(十):MOS管的全面解析与实际应用
MOS管(金属-氧化物半导体场效应晶体管)是现代电子技术的基石,凭借高输入阻抗、低功耗和易集成特性,成为数字电路、电源管理和信号处理的核心元件。从微处理器到新能源汽车电驱系统,其高效开关与放大功能支撑了计算机、…...
电源测试系统有哪些可以利用AI工具的科技??
AI技术的发展对电源模块测试系统的影响是深远的,不仅协助系统提升了测试效率和精度,还推动了测试方法的创新和智能化。那么在电源测试系统中哪些模块可以利用AI工具实现自动化测试? 1. 自动化测试与效率提升 智能测试流程优化 AI算法可以自动优化测试…...
RabbitMQ 最新版:安装、配置 与Java 接入详细教程
目录 一、RabbitMQ 简介二、RabbitMQ 的安装1. 安装 Erlang下载 Erlang安装 Erlang2. 安装 RabbitMQ下载 RabbitMQ安装 RabbitMQ3. 配置环境变量4. 启用管理插件三、RabbitMQ 的配置1. 创建用户和设置权限2. 配置文件四、Java 接入 RabbitMQ1. 添加依赖2. 创建连接3. 创建通道4…...
股市现期驱动因子
在股票投资中,我们把驱动股市收益的基本元素称为基本因素: 例如资产负债、现金流量 从短期来看,股市的上涨和下跌基于市场情绪,它更依赖于投资者的期望,投它涨的人多,它就涨。从长期来看,股市…...
物联网中的气象监测设备具备顶级功能
物联网中的气象监测设备具备顶级功能时,通常集成GPS、数据上报和预警系统,以确保精准监测和及时响应。以下是这些功能的详细说明: 1. GPS定位 精准定位:GPS模块提供设备的精确地理位置,确保数据与具体位置关联&#…...
算法1-4 凌乱的yyy / 线段覆盖
题目描述 现在各大 oj 上有 n 个比赛,每个比赛的开始、结束的时间点是知道的。 yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。 所以,他想知道他最多能参加几个比赛。 由于 yyy 是蒟蒻,…...
gn学习存档
以下答案均由deepseek提供,仅作学习存档。 1. 举例说明action和action_foreach区别 场景设定 假设需要处理一组文件: 输入文件:src/data/file1.txt, src/data/file2.txt, src/data/file3.txt处理逻辑:将每个 .txt 文件转换为 …...
SQL注入练习场:PHPStudy+SQLI-LABS靶场搭建教程(零基础友好版)
注意:文中涉及演示均为模拟测试,切勿用于真实环境,任何未授权测试都是违法行为! 一、环境准备 下载PHPStudy 官网下载地址:https://www.xp.cn/php-study(选择Windows版) 安装时建议选择自定…...
python学习笔记——Thread常用方法
Thread对象中的一些方法: 以前说过多线程,用到threading模块中的Thread对象,其中的start和run方法比较熟悉了,start()是重载了Thread对象中的run方法,其实作用还是,当执行这个start…...
2024年数学SCI2区TOP:雪雁算法SGA,深度解析+性能实测
目录 1.摘要2.算法原理3.结果展示4.参考文献5.代码获取 1.摘要 本文提出了一种雪雁算法(SGA),该算法借鉴了雪鹅的迁徙行为,并模拟了其迁徙过程中常见的“人字形”和“直线”飞行模式。 2.算法原理 雪雁以其卓越的长途迁徙能力和…...
Kubernetes 指令备忘清单
文章目录 查看资源信息节点容器组命名空间无状态服务守护进程集事件服务帐户日志副本集角色保密字典配置项路由持久卷持久卷声明存储类多个资源 变更资源属性污点标签维护/可调度清空节点节点/容器组无状态/命名空间服务守护进程集服务账号注释 添加资源创建容器组创建服务创建…...
servlet tomcat
在spring-mvc demo程序运行到DispatcherServlet的mvc处理 一文中,我们实践了浏览器输入一个请求,然后到SpringMvc的DispatcherServlet处理的整个流程. 设计上这些都是tomcat servlet的处理 那么究竟这是怎么到DispatcherServlet处理的,本文将…...
在 Ubuntu 系统 22.04 上安装 Docker
在 Ubuntu 系统 22.04 上安装 Docker 在 Ubuntu 系统 22.04 上安装 Docker1. 更新系统包2. 安装依赖工具3. 添加 Docker 官方 GPG 密钥4. 添加 Docker 的 APT 仓库5. 安装 Docker Engine6. 启动并设置 Docker 服务7. 验证安装8. 配置非 Root 用户权限(可选…...
一分钟理解Mybatis 里面的缓存机制
MyBatis 是一个流行的 Java 持久层框架,它简化了数据库操作。MyBatis 提供了强大的缓存机制,用于提升性能,减少数据库的访问次数。MyBatis 的缓存机制分为一级缓存和二级缓存。 该图展示了用户通过 SqlSession 发起查询请求,…...
【我的Android进阶之旅】如何使用NanoHttpd在Android端快速部署一个HTTP服务器?
文章目录 开篇:程序员的"摸鱼神器"?一、为什么选择NanoHttpd?二、五分钟极速上车指南2.1 ▶ 第一步:引入依赖的哲学2.2 ▶ 第二步:创建服务器类:继承大法好2.3 ▶ 第三步:启动服务的仪式感三、高级玩法:让服务器不再单调3.1 🔥 场景1:变身文件服务器3.2 �…...
PyCharm 无法识别 Conda 环境的解决方案
一、问题分析 当在最新版 PyCharm (2024.3) 中配置 Conda 环境时,可能会出现以下典型错误: 找不到 Conda 可执行文件 我在网上找了很多解决办法,都没有有效解决这个问题,包括将环境路径替换为 .bat 文件和查找 python.exe 文件…...
AutoGen学习笔记系列(一)Tutorial - Model
这个系列文章记录了学习微软 AutoGen 的过程,与 smolagents 学习笔记系列一样,仍然以官方教程自己的理解为主线,中间可能穿插几个番外支线的形式写博客。 【注意】:在阅读这篇文章之前需要确保已经按照其 Installation 小节完成必…...
利用Git和wget批量下载网页数据
一、Git的下载(参考文章) 二. wget下载(网上很多链接) 三、git和wget结合使用 1.先建立一个文本,将代码写入文本(代码如下),将txt后缀改为sh(download_ssebop.sh…...
多线程JUC(一)
目录 前言一、多线程的三种实现方式1.继承Thread类2.实现Runnable接口3.利用Callable接口和Future接口4.三种方式对比 二、常见的成员方法1.getName、setName、currentThread、sleep2.线程的优先级3.守护线程4.插入线程 三、线程安全1.线程的生命周期2.同步代码块3.同步方法4.l…...
夸父工具箱(安卓版) 手机超强工具箱
如今,人们的互联网活动日益频繁,导致手机内存即便频繁清理,也会莫名其妙地迅速填满,许多无用的垃圾信息悄然占据空间。那么,如何有效应对这一难题呢?答案就是今天新推出的这款工具软件,它能从根…...
2025系统架构师(一考就过):案例之五:典型架构、架构演化、人工智能、云计算、大数据
六、中间件技术、典型架构 ◆中间件:在一个分布式系统环境中处于操作系统和应用程序之间的软件,可以在不同的技术之间共享资源,将不同的操作系统、数据库、异构的网络环境以及若干应用结合成一个有机的协同工作整体。 ◆中间件位于客户机/服务器的操作系…...
【随手笔记】利尔达NB模组
1.名称 移芯EC6263GPP 参数 指令备注 利尔达上电输出 [2025-03-04 10:24:21.379] I_AT_WAIT:i_len2 [2025-03-04 10:24:21.724] LI_AT_WAIT:i_len16 [2025-03-04 10:24:21.724] [2025-03-04 10:24:21.733] Lierda [2025-03-04 10:24:21.733] [2025-03-04 10:24:21.745] OK移…...
Mybatis 中#{} 和${} 的区别是什么?
在 MyBatis 中,#{} 和 ${} 都是用于动态 SQL 语句中的占位符,但是它们的作用和使用方式是不同的。下面是它们的区别: 1. #{} —— 用于防止 SQL 注入和自动类型处理 #{} 是用来将参数安全地传递到 SQL 语句中,它会将传递的参数值…...
nginx+keepalived负载均衡及高可用
1 项目背景 keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。采用nginxkeepalived,它是一个高性能的服务器高可用或者热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的…...
数据结构理论
目录 基本概念和术语 数据 数据元素 数据项 数据对象 数据结构 数据的结构 逻辑结构 存储结构(物理结构) 数据类型 定义 原子数据类型 结构数据类型 抽象数据类型(Abstract Data Type,ADT) 算法和算法分…...
【心得】一文梳理高频面试题 HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别并附加记忆方法
面试时很容易遇到的一个问题—— HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别,其实这四个版本的发展实际上是一环扣一环的,是逐步完善的,本文希望帮助读者梳理清楚各个版本之间的区别,并且给出当前各个版本的应用情况,…...
在Spring Boot项目中导出复杂对象到Excel文件
在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel等库来简化操作。这里我们将详细介绍如何使用Hutool和EasyExcel两种方式来实现这一功能。 使用Hutool导出复杂对象到Excel 首先确保你的pom.xml中添加了Hutool的依赖: <depe…...
spark 常见操作命令
配置虚拟机 配置即让自己的虚拟机可以联网,和别的虚拟机通讯 一、配置vm虚拟机网段。 具体设置为:虚拟机左上角点击编辑→虚拟网络编辑器 选择VMnet8, 要改动两个地方(注意:它会需要管理员权限ÿ…...
深入理解设计模式中的工厂模式(Factory Pattern)
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 工厂模式是创建对象的一种设计模式,属于创建型设计模式。它提供了一种方法来创建对象,而无需在代码中直接指定对象的具体类。工厂模式通过将对象的创建过程封装起来,使得代码更加灵活、可维护…...
DPDK网络开发
DPDK(Data Plane Development Kit)是一个用于快速数据包处理的开源库,广泛应用于高性能网络应用开发。 环境准备 硬件要求 NIC(网络接口卡):支持DPDK的网卡,如Intel的82599、X710等。 CPU&am…...
第三节:基于Winform框架的串口助手小项目---串口操作《C#编程》
知识是无尽的宝藏,学习的过程虽有挑战,但每一次突破都是对自我的升华,向着更优秀的自己全力进发。 -----------WHAPPY 本节将重点介绍,如何修改控件的属性、SerialPort类的使用及实现串口初始化的操作 1.修改控件属性 修改属性…...
机器学习核函数
在机器学习中,核函数(Kernel Function)是一个非常重要的概念,特别是在支持向量机(SVM)等算法中有着广泛的应用。下面从定义、作用、常见的核函数类型、工作原理等方面详细介绍: 定义࿱…...
linux中使用firewall命令操作端口
一、开放端口 1. 开放一个端口 sudo firewall-cmd --zonepublic --add-port8443/tcp --permanent sudo firewall-cmd --reload 2. 开放一组连续端口 sudo firewall-cmd --zonepublic --add-port100-500/tcp --permanent sudo firewall-cmd --reload 3. 一次开放多个不连续…...
【金融量化】Ptrade中的基础交易与高级量化交易策略的下单接口
1 基础交易与订单管理接口 1. order 功能:用于按指定数量买卖股票或其他金融产品。 参数: security:股票代码(字符串类型)。amount:交易数量(整数类型),正数表示买入&…...
解决docker认证问题 failed to authorize: failed to fetch oauth token
报错信息[bash1]解决方案 全局代理打开“buildkit”: false ,见[图1] [bash1] >docker build -t ffpg . [] Building 71.8s (3/3) FINISHED docker:desktop-linux> [internal] load bui…...
从“人力投放”到“智能战争”,谁能抢占先机?
流量成本飙升、用户行为碎片化、广告创意同质化……传统网络推广模式正面临失效危机。而AI技术的爆发,正在彻底改写游戏规则。小马识途营销顾问解析:“AI如何颠覆网络推广逻辑?企业又该如何借势破局?” 一、精准营销:…...
STM32_IIC外设工作流程
STM32 IC 外设工作流程(基于寄存器) 在 STM32 中,IC 通信主要通过一系列寄存器控制。理解这些寄存器的作用,能够帮助我们掌握 IC 硬件的运行机制,实现高效的数据传输。本文以 STM32F1(如 STM32F103&#x…...
Python 爬取唐诗宋词三百首
你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例,它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…...
浅浅初识AI、AI大模型、AGI
前记:这里只是简单了解,后面有时间会专门来扩展和深入。 当前,人工智能(AI)及其细分领域(如AI算法工程师、自然语言处理NLP、通用人工智能AGI)的就业前景呈现高速增长态势,市场需求…...
Spring40种注解(下)!!
Spring Bean 注解 ComponentScan ComponentScan注解用于配置Spring需要扫描的被组件注解注释的类所在的包。 可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名。 Component Component注解用于标注一个普通的组件类&#…...
DeepSeek 系列模型:论文精读《A Survey of DeepSeek Models》
引言:一篇快速了解 DeepSeek 系列的论文。我在翻译时加入了一些可以提高 “可读性” 的连词 ✅ NLP 研 2 选手的学习笔记 笔者简介:Wang Linyong,NPU,2023级,计算机技术 研究方向:文本生成、大语言模型 论文…...
LeetCode hot 100—环形链表 II
题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部…...
【AI】【Unity】关于Unity接入DeepseekAPI遇到的坑
前言 由于deepseek网页端在白天日常抽风,无法正常的使用,所以调用API就成了目前最好的选择,尤其是Deepseek的API价格低得可怕,这不是和白送的一样吗!然后使用过很多本地部署接入API的方式,例如Chatbox、Pa…...