当前位置: 首页 > news >正文

Java学习笔记(二十五)

1 Kafka Raft 简单介绍

Kafka Raft (KRaft) 是 Kafka 引入的一种新的分布式共识协议,用于取代之前依赖的 Apache ZooKeeper 集群管理机制。从 Kafka 2.8 开始,Kafka 开始支持基于 KRaft 的独立模式,计划在未来完全移除 ZooKeeper 的依赖。


1.1 KRaft 的核心概念

  1. Raft 共识协议

    • KRaft 基于 Raft 共识协议,确保在分布式环境中,多个副本能够在网络分区或节点故障的情况下保持数据一致性。
    • Raft 协议的核心是通过选举产生一个 Leader,Leader 负责处理所有写入请求,并将变更复制到其他节点。
  2. Controller 节点

    • 在 KRaft 中,Kafka 的元数据由一个或多个 Controller 管理。
    • Controller 使用 Raft 协议管理元数据日志,确保所有 Broker 的元数据一致性。
  3. 元数据日志

    • KRaft 使用 Raft 日志来存储 Kafka 的元数据(如 Topic 配置、分区分配、ACL 等),并在所有 Controller 节点中保持一致。
    • 元数据日志是一个顺序写日志,具有高效和一致的特性。
  4. 去 ZooKeeper 化

    • KRaft 的主要目标是移除对 ZooKeeper 的依赖,将所有元数据管理整合到 Kafka 自身,从而简化部署和运维。

1.2 KRaft 的优点

  1. 简化架构

    • 去除了对 ZooKeeper 的依赖,Kafka 不再需要维护独立的 ZooKeeper 集群。
  2. 提高可扩展性

    • 元数据分布式管理可以支持更大的集群规模和更多的分区数量。
  3. 一致性增强

    • Raft 协议保证了严格的分布式一致性。
  4. 性能优化

    • KRaft 的 Controller 实现了更高效的元数据操作,降低了延迟。
  5. 部署简单

    • 部署 Kafka 时只需配置 Kafka 节点本身,无需额外部署 ZooKeeper。

1.3 KRaft 的运行机制

  1. Leader 选举

    • Raft 协议在 Controller 节点间选举出一个 Leader,所有元数据的修改都由 Leader 处理。
    • 其他 Controller 节点作为 Follower,接收 Leader 的更新。
  2. 日志复制

    • Leader 将所有元数据更新以日志形式写入本地磁盘,并复制到其他 Follower 节点。
  3. 一致性保证

    • Raft 协议通过日志的提交和确认机制,确保所有 Controller 节点的数据一致。

1.4 KRaft 的部署模式

  1. 单节点模式

    • 适用于开发和测试环境,只有一个 Controller 节点。
  2. 多节点模式

    • 适用于生产环境,多个 Controller 节点组成一个 Raft 集群,通过分布式协议管理元数据。

1.5 当前进展

  • KRaft 从 Kafka 2.8 开始提供实验性支持。
  • 从 Kafka 3.3 开始,KRaft 已经能够在大部分生产环境中替代 ZooKeeper。
  • Kafka 未来计划完全移除对 ZooKeeper 的支持,让 KRaft 成为唯一的元数据管理机制。

1.6 总结

KRaft 是 Kafka 在架构上的一次重要升级,旨在通过 Raft 协议替代 ZooKeeper,简化部署、提升性能和一致性,为 Kafka 在超大规模集群环境中的应用铺平道路。

2 ack-mode 介绍

Spring Kafka 中的 ack-mode 配置用于指定消息确认 (Acknowledgment) 的策略,即消费者在接收到消息后,何时向 Kafka Broker 确认消费完成。这是一个关键设置,可以影响消息的可靠性和系统性能。

以下是 ack-mode 的详细介绍:


2.1 支持的确认模式

ack-mode 提供以下几种确认模式:

模式描述推荐场景
RECORD每处理一条消息后立即发送确认。高可靠性需求,逐条处理消息的场景
BATCH每批拉取的消息处理完成后发送确认。高吞吐量,批量处理消息的场景
TIME根据固定时间间隔发送确认,与消息处理无直接关联。希望定时确认,但消息处理较快的场景
COUNT达到指定的消息数量后发送确认,与消息处理无直接关联。希望固定批量确认的场景
COUNT_TIME基于消息数量和时间间隔的组合条件,任一条件满足即可触发确认。需要兼顾吞吐量和延迟的场景
MANUAL需要开发者手动调用 Acknowledgment.acknowledge() 方法确认消息。手动精确控制确认逻辑的场景
MANUAL_IMMEDIATEMANUAL 类似,但立即将确认发送到 Kafka,而不是批量发送。手动控制确认逻辑,要求低延迟的场景

2.2 默认值

  • 如果未显式设置 ack-mode,默认值为 BATCH
  • 对应的配置路径:
    spring:kafka:listener:ack-mode: BATCH
    

2.3 不同模式的详细说明

(1) RECORD
  • 行为:每处理一条消息后,立即发送确认。
  • 优点
    • 确保每条消息的确认独立,最高的消息处理可靠性。
    • 如果消费者崩溃,只有未处理的消息会重新投递。
  • 缺点
    • 性能较低,因为每条消息都需要发送一次确认。
  • 适用场景:关键任务需要确保消息处理可靠性,例如支付系统或交易系统。

(2) BATCH
  • 行为:处理完拉取的消息批次后,统一发送确认。
  • 优点
    • 提高吞吐量,减少网络开销。
    • 更适合批量处理的场景,例如将多个消息一次性写入数据库。
  • 缺点
    • 如果消费者崩溃,该批次的所有消息都会重新投递。
  • 适用场景:对吞吐量要求高,但允许部分消息重复处理的场景。

(3) TIME
  • 行为:定期发送确认,与消息的处理逻辑无关。
  • 优点
    • 控制确认的时间间隔,适用于消息处理速度波动的场景。
  • 缺点
    • 如果定时时间过长,消费者崩溃会导致更多消息重新投递。
  • 适用场景:希望定时确认,但处理逻辑简单快速。

(4) COUNT
  • 行为:当处理的消息数达到指定数量后,发送确认。
  • 优点
    • 控制确认的消息数量,适合对吞吐量有一定要求的场景。
  • 缺点
    • 如果批量大小过大,崩溃会导致更多消息重新投递。
  • 适用场景:高吞吐量需求,允许一定范围内的重复处理。

(5) COUNT_TIME
  • 行为:同时支持基于数量和时间间隔的确认逻辑,满足任一条件即可发送确认。
  • 优点
    • 综合数量和时间的优点,适合动态吞吐量的场景。
  • 缺点
    • 较复杂,需要合理配置数量和时间的阈值。
  • 适用场景:希望兼顾性能和延迟控制的场景。

(6) MANUAL
  • 行为:由监听器方法中显式调用 Acknowledgment.acknowledge() 方法进行确认。
  • 优点
    • 最大的控制灵活性,可根据自定义逻辑决定是否确认消息。
  • 缺点
    • 更高的开发成本,增加出错风险(如未调用 acknowledge)。
  • 适用场景:需要精确控制消息确认时间点或条件。

(7) MANUAL_IMMEDIATE
  • 行为:与 MANUAL 类似,但确认消息立即发送到 Kafka,不会等到当前批次处理完成。
  • 优点
    • 降低延迟。
  • 缺点
    • 牺牲一定的吞吐量。
  • 适用场景:需要实时性高的确认逻辑,例如低延迟报警系统。

2.4 配置方式

可以通过 application.yml 或代码配置:

2.4.1 YAML 配置
spring:kafka:listener:ack-mode: MANUALconsumer:enable-auto-commit: false
2.4.2 Java 配置
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL);factory.setConsumerFactory(consumerFactory());return factory;
}

2.5 如何选择适合的 ack-mode

  • 高可靠性:选择 RECORDMANUAL
  • 高吞吐量:选择 BATCHCOUNT
  • 实时性需求:选择 MANUAL_IMMEDIATE
  • 动态场景:选择 COUNT_TIME

通过配置合适的 ack-mode,可以在性能与可靠性之间找到平衡点。

3 MyBatis 二级缓存的生命周期


3.1 什么是 MyBatis 二级缓存?

MyBatis 提供了两级缓存机制:

  1. 一级缓存(L1 Cache): 作用范围是 单个 SqlSession,默认开启。
  2. 二级缓存(L2 Cache): 作用范围是 SqlSession,基于 Mapper namespace 共享,需要手动配置。

二级缓存的特点:

  • 作用范围:Mapper 映射文件级别(namespace 级别)
  • 生命周期比一级缓存更长,可以在不同的 SqlSession 之间共享数据。
  • 默认情况下是不开启的,需在 mapper.xml 中显式配置。

3.2 二级缓存的生命周期

MyBatis 的二级缓存生命周期主要与 SqlSession 的生命周期、事务提交、缓存失效策略等因素相关。生命周期如下:

  1. 初始化阶段(创建缓存)

    • 当 MyBatis 加载 mapper.xml 映射文件 并解析 <cache> 标签时,二级缓存被创建并注册。
    • 在整个 MyBatis 应用的生命周期内,二级缓存会持续存在,除非显式清除。
  2. 存储数据(数据写入缓存)

    • SqlSession 执行 SQL 查询时,查询结果会先存入 一级缓存(当前 SqlSession 内存储)
    • 只有在 SqlSession.close() 时,才会将一级缓存的数据同步到二级缓存。
    • 如果启用了二级缓存,不同 SqlSession 之间可以共享数据。
  3. 数据读取(从缓存获取数据)

    • 当新的 SqlSession 执行查询时,会首先检查二级缓存,如果命中缓存,则直接返回结果,而不会访问数据库。
    • 如果缓存未命中,才会查询数据库,并将结果存入二级缓存。
  4. 数据清除(失效或更新)

    • 当执行 INSERTUPDATEDELETE 操作后,默认情况下会清空二级缓存(保持数据一致性)。
    • 可以配置 缓存刷新策略,如基于时间自动刷新。
    • 调用 session.commit()session.rollback() 时,会清空相应命名空间下的二级缓存。
    • 手动清空缓存:
      sqlSession.clearCache(); // 清空一级缓存
      sqlSessionFactory.getConfiguration().getCache("namespace").clear(); // 清空二级缓存
      
  5. 销毁阶段(缓存被清理)

    • 当 MyBatis 关闭或应用停止时,二级缓存的所有数据都会被销毁。
    • 映射文件重新加载时,旧的缓存实例会被清空。

3.3 二级缓存的存储时机

二级缓存的存入遵循以下原则:

  1. SqlSession 关闭时

    • SqlSession.close() 被调用时,当前会话的一级缓存数据被存入二级缓存。
    • 例如:
      SqlSession session1 = sqlSessionFactory.openSession();
      User user1 = session1.selectOne("com.example.mapper.UserMapper.selectUser", 1);
      session1.close();  // 关闭时,数据进入二级缓存
      
  2. 多次会话共享

    • 关闭第一个 SqlSession 后,第二个 SqlSession 执行相同查询时,会从二级缓存获取数据。
    • 例如:
      SqlSession session2 = sqlSessionFactory.openSession();
      User user2 = session2.selectOne("com.example.mapper.UserMapper.selectUser", 1); // 直接从缓存取数据
      session2.close();
      

3.4 二级缓存的配置

步骤 1:在 mybatis-config.xml 中开启二级缓存支持

<configuration><settings><setting name="cacheEnabled" value="true"/></settings>
</configuration>

步骤 2:在 mapper.xml 文件中启用二级缓存

<mapper namespace="com.example.mapper.UserMapper"><cache eviction="LRU" flushInterval="60000" size="1024" readOnly="true"/>
</mapper>
  • eviction="LRU":使用最近最少使用(LRU)算法清理缓存。
  • flushInterval="60000":每 60 秒清空缓存。
  • size="1024":最多缓存 1024 条数据。
  • readOnly="true":缓存为只读,提高性能,但不允许修改数据。

步骤 3:确保实体类实现 Serializable 接口

public class User implements Serializable {private static final long serialVersionUID = 1L;private int id;private String name;// getters and setters
}

3.5 二级缓存的失效场景

二级缓存的数据不会永久有效,以下操作会导致缓存失效:

  1. 数据变更时(默认)

    • 执行 INSERTUPDATEDELETE 语句后,二级缓存会被清除。
    • 可以配置 flushCache="false" 避免清空:
      <select id="selectUser" resultType="User" flushCache="false">SELECT * FROM user WHERE id = #{id}
      </select>
      
  2. 事务提交时

    • SqlSession.commit() 被调用时,二级缓存会刷新。
  3. 手动清除缓存

    • 调用 sqlSession.clearCache() 会清空一级缓存。
    • 调用 sqlSessionFactory.getConfiguration().getCache("namespace").clear(); 清空二级缓存。

3.6 二级缓存与一级缓存的对比

特性一级缓存(L1 Cache)二级缓存(L2 Cache)
范围单个 SqlSession多个 SqlSession,namespace 级别共享
生命周期SqlSession 关闭时失效直到手动清除或策略触发
存储位置内存(线程局部变量)内存、磁盘或其他第三方缓存
默认是否开启开启需手动配置
影响范围仅当前事务整个 MyBatis 应用
清空触发条件commit()rollback()close()commit()、手动清理、超时、更新数据

3.7 常见问题及解决方案

问题可能原因解决方案
二级缓存未生效未在 mapper.xml 中启用缓存确保 <cache/> 配置正确
更新数据后缓存仍然生效缓存未正确清理确保 flushCache="true" 正确配置
数据一致性问题多线程环境导致缓存不同步使用 readOnly="true" 或手动清理
Serializable 错误实体类未实现 Serializable 接口确保所有缓存对象实现序列化

3.8总结

  1. 二级缓存的生命周期:

    • 在 MyBatis 启动时初始化。
    • SqlSession.close() 之后数据才存入二级缓存。
    • 数据变更或提交事务后缓存可能失效。
  2. 使用建议:

    • 适用于数据访问频繁但变化少的场景。
    • 配置合适的刷新策略以保证数据一致性。

相关文章:

Java学习笔记(二十五)

1 Kafka Raft 简单介绍 Kafka Raft (KRaft) 是 Kafka 引入的一种新的分布式共识协议&#xff0c;用于取代之前依赖的 Apache ZooKeeper 集群管理机制。从 Kafka 2.8 开始&#xff0c;Kafka 开始支持基于 KRaft 的独立模式&#xff0c;计划在未来完全移除 ZooKeeper 的依赖。 1…...

Baklib如何结合内容中台与人工智能技术实现数字化转型

内容概要 在当前快速发展的数字环境中&#xff0c;企业面临着转型的紧迫性与挑战&#xff0c;尤其是在内容管理和用户互动的领域。内容中台作为一种集成化的解决方案&#xff0c;不仅能够提高企业在资源管理方面的效率&#xff0c;还能够为企业提供一致性和灵活性的内容分发机…...

git困扰的问题

.gitignore中添加的某个忽略文件并不生效 把某些目录或文件加入忽略规则&#xff0c;按照上述方法定义后发现并未生效&#xff0c; gitignore只能忽略那些原来没有被追踪的文件&#xff0c;如果某些文件已经被纳入了版本管理中&#xff0c;则修改.gitignore是无效的。 解决方…...

第05章 12 可视化热量流线图一例

下面是一个使用VTK&#xff08;Visualization Toolkit&#xff09;和C编写的示例代码&#xff0c;展示如何在一个厨房模型中可视化热量流线图&#xff0c;并按照热量传递速度着色显示。这个示例假设你已经安装了VTK库&#xff0c;并且你的开发环境已经配置好来编译和运行VTK程序…...

Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向

在 Vue 项目中实现导出 PDF 文件、调整文件页面大小和页面方向的功能&#xff0c;使用 html2canvas 将 HTML 内容转换为图片&#xff0c;再使用 jspdf 把图片添加到 PDF 文件中。以下是详细的实现步骤和代码示例&#xff1a; 步骤 1&#xff1a;安装依赖 首先&#xff0c;在项…...

LTV预估 | 深度学习PLTV之开山鼻祖ZILN

&#x1f923; 这一集让我们欢迎基于深度学习的pltv方法&#xff1a;ZILN&#xff0c;ZILN可以说是后面很多研究的参考方法&#xff0c;我看了好几篇最新的pltv论文&#xff0c;都是基于ZILN来做的。 文章目录 1 精简总结2 背景&挑战&#xff1a;3 方法&#xff1a;实验&am…...

MFC常用操作

1&#xff0c;获取STATIC控件的值 CString str; m_STATIC2.GetWindowText(str);//获取STATIC控件的值 MessageBox(str); 2.设置EDIT控件的值 m_EDIT2.SetWindowText(str);//设置EDIT控件的值 GetDlgItem(IDC_EDIT1)->SetWindowText("Leave");//设置EDIT控件的值…...

第24篇 基于ARM A9处理器用汇编语言实现中断<六>

Q&#xff1a;怎样设计ARM处理器汇编语言程序使用定时器中断实现实时时钟&#xff1f; A&#xff1a;此前我们曾使用轮询定时器I/O的方式实现实时时钟&#xff0c;而在本实验中将采用定时器中断的方式。新增第三个中断源A9 Private Timer&#xff0c;对该定时器进行配置&#…...

【学习笔记】计算机网络(二)

第2章 物理层 文章目录 第2章 物理层2.1物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和…...

2025多目标优化创新路径汇总

多目标优化是当下非常热门且有前景的方向&#xff01;作为AI领域的核心技术之一&#xff0c;其专注于解决多个相互冲突的目标的协同优化问题&#xff0c;核心理念是寻找一组“不完美但均衡”的“帕累托最优解”。在实际中&#xff0c;几乎处处都有它的身影。 但随着需求场景的…...

图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)

官网编译文档链接&#xff1a; https://doc.percipio.xyz/cam/latest/getstarted/sdk-ros2-compile.html 国内gitee下载SDK链接&#xff1a; https://gitee.com/percipioxyz 国外github下载SDK链接&#xff1a; https://github.com/percipioxyz 1.Camport ROS2 SDK 介绍 1.1 …...

字符设备驱动模版-中断

字符设备驱动模版-中断 思维导图在线高清查看&#xff1a;https://www.helloimg.com/i/2025/01/27/679791b5257c0.png 修改设备树 1添加pinctrl节点 1创建对应的节点 在 iomuxc 节点的 imx6ul-evk 子节点下 2添加“fsl,pins”属性 3在“fsl,pins”属性中添加PIN配置信息 …...

STM32 旋转编码器

旋转编码器简介 旋转编码器&#xff1a;用来测量位置、速度或旋转方向的装置&#xff0c;当其旋转轴旋转时&#xff0c;其输出端可以输出与旋转速度和方向对应的方波信号&#xff0c;读取方波信号的频率和相位信息即可得知旋转轴的速度和方向 类型&#xff1a;机械触点式/霍尔传…...

java ,springboot 对接支付宝支付,实现生成付款二维码,退款,查询订单状态等接口

查看文档 支付宝文档地址&#xff1a; 小程序文档 - 支付宝文档中心 使用沙箱环境 沙箱登录地址 登录 - 支付宝 点击查看 才能看钥匙截图写错了。。 问号可以看默认加密方式 点击沙箱帐号 这里我们就具备所有条件了 实战开始 pom文件增加依赖 <dependency> <gro…...

OpenCV:形态学梯度

目录 简述 1. 用图像运算和腐蚀实现形态学梯度 1.1 代码示例 1.2 运行结果 2. 形态学梯度接口 2.1 参数解释 2.2 代码示例 2.3 运行结果 3. 形态学梯度与边缘检测 4. 形态学梯度的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 简述…...

图漾相机搭配VisionPro使用简易教程

1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0/9.5/9.6版本经测试&#xff0c;可正常打开图漾相机&#xff0c;建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载&#xff1a;https://gitee.com/percipioxyz/camport3…...

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》重印P126、P131勘误

勘误&#xff1a;打圈的地方有指数二字。 指数滤波器本身是错误的概念&#xff0c;我在书上打了一个叉&#xff0c;排版人员误删了。 滤波器部分从根本上有问题&#xff0c;本来要改&#xff0c;但是时间不够了。 和廖老师讨论多次后&#xff0c;决定大动。指数滤波器的概念…...

4、PyTorch 第一个神经网络,手写神经网络的基本部分组成

假设有一个二维数据集&#xff0c;目标是根据点的位置将它们分类到两个类别中&#xff08;例如&#xff0c;红色和蓝色点&#xff09;。 以下实例展示了如何使用神经网络完成简单的二分类任务&#xff0c;为更复杂的任务奠定了基础&#xff0c;通过 PyTorch 的模块化接口&#…...

Vue实现div滚动,并且支持top动态滚动

如果你知道距离目标 div 顶部的像素值&#xff0c;并希望通过传入 top 参数来实现滚动到对应区域&#xff0c;可以使用 window.scrollTo 方法。 编写滚动方法 const scrollToDiv (targetDiv, top) > {if (targetDiv) {top top * targetDiv.value.scrollHeight / data.he…...

【QT】- QUdpSocket

QUdpSocket 是 Qt 自带的一个类&#xff0c;属于 Qt 网络模块&#xff0c;用于进行 UDP&#xff08;用户数据报协议&#xff09; 通信。它提供了简便的接口来发送和接收 UDP 数据报&#xff08;datagrams&#xff09;。 UDP 是一种无连接的协议&#xff0c;适用于那些不需要确…...

WGCLOUD运维工具从入门到精通 - 如何设置主题背景

需要升级到WGCLOUD的v3.5.7或者以上版本&#xff0c;才会支持自定义设置主题背景色 WGCLOUD下载&#xff1a;www.wgstart.com 我们登录后&#xff0c;在右上角点击如下的小图标&#xff0c;就可以设置主题背景色了&#xff0c;包括&#xff1a;经典白&#xff08;默认&#x…...

【Elasticsearch】中数据流需要配置索引模板吗?

是的&#xff0c;数据流需要配置索引模板。在Elasticsearch中&#xff0c;数据流&#xff08;Data Streams&#xff09;是一种用于处理时间序列数据的高级结构&#xff0c;它背后由多个隐藏的索引组成&#xff0c;这些索引被称为后备索引&#xff08;Backing Indices&#xff0…...

Python 合并 Excel 单元格

合并 Excel 单元格是 Excel 数据处理和表格设计中的一项常用操作。例如&#xff0c;在制作表格标题时&#xff0c;经常会将多个单元格合并&#xff0c;使标题能够跨列显示&#xff0c;更加醒目和美观。此外&#xff0c;当对数据进行分类时&#xff0c;为了使同一类别的数据在视…...

C++中左值和右值的概念

文章目录 一、概要二、左值&#xff08;Lvalue&#xff09;二、右值&#xff08;Rvalue&#xff09;三、左值引用和右值引用四、左值和右值的使用场景五、总结 一、概要 在 C 中&#xff0c;左值&#xff08;Lvalue&#xff09;和右值&#xff08;Rvalue&#xff09;是两个非常…...

27.日常算法

1. 最后一个单词的长度 题目来源 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s “Hello Wor…...

动态规划DP 数字三角形模型 传纸条(题目分析+C++完整代码)

传纸条 原题链接 AcWing 275. 传纸条 题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。 一次素质拓展活动中&#xff0c;班上同学安排坐成一个 m行 n 列的矩阵&#xff0c;而小渊和小轩被安排在矩阵对角线的两端&#xff0c;因此&#x…...

Spark入门(Python)

目录 一、安装Spark 二、Spark基本操作 一、安装Spark pip3 install pyspark 二、Spark基本操作 # 导入spark的SparkContext,SparkConf模块 from pyspark import SparkContext, SparkConf # 导入os模块 import os # 设置PYSPARK的python环境 os.environ[PYSPARK_PYTHON] &…...

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存&#xff08;In-memory cache&#xff09; 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法&#xff1a; 两种过期时间策略&#xff1a; 绝对过期时间 滑动过期时间 两…...

IoTDB 2025 春节值班与祝福

2025 春节快乐 瑞蛇迎吉庆&#xff0c;祥光映华年&#xff0c;2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐&#xff0c;“蛇”来运转&#xff01; IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日&#xff0c;1 月 25 日、26…...

Qt Ribbon使用实例

采用SARibbon创建简单的ribbon界面 实例代码如下所示&#xff1a; 1、头文件&#xff1a; #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…...

maven的打包插件如何使用

默认的情况下&#xff0c;当直接执行maven项目的编译命令时&#xff0c;对于结果来说是不打第三方包的&#xff0c;只有一个单独的代码jar&#xff0c;想要打一个包含其他资源的完整包就需要用到maven编译插件&#xff0c;使用时分以下几种情况 第一种&#xff1a;当只是想单纯…...

Linux——rzsz工具

rzsz这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去. 安装rzsz工具 rz&#xff1a;从Windows机器上传到远程Linux机器&#xff08;或者直接把文件托进Xshell中&#xff09; sz&#xff1a;将文件从Linux远…...

航空客户价值的数据挖掘与分析(numpy+pandas+matplotlib+scikit-learn)

文章目录 航空客户价值的数据挖掘与分析(numpy+pandas+matplotlib+scikit-learn)写在前面背景与挖掘目标1.1 需求背景1.2 挖掘目标1.3 项目概述项目分析方法规划2.1 RFM模型2.2 LRFMC模型指标2.3 分析总体流程图数据抽取探索及预处理3.1 数据抽取3.2 数据探索分析3.3 数据预处…...

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…...

【C++】特殊类设计、单例模式与类型转换

目录 一、设计一个类不能被拷贝 &#xff08;一&#xff09;C98 &#xff08;二&#xff09;C11 二、设计一个类只能在堆上创建对象 &#xff08;一&#xff09;将构造函数私有化&#xff0c;对外提供接口 &#xff08;二&#xff09;将析构函数私有化 三、设计一个类只…...

Nxopen 直齿轮参数化设计

NXUG1953 Visualstudio 2019 参考论文&#xff1a; A Method for Determining the AGMA Tooth Form Factor from Equations for the Generated Tooth Root Fillet //FullGear// Mandatory UF Includes #include <uf.h> #include <uf_object_types.h>// Internal I…...

Vue.js组件开发-实现HTML内容打印

在Vue项目中实现打印功能&#xff0c;可以借助vue-html-to-paper插件来完成。 步骤 创建Vue项目&#xff1a;如果还没有Vue项目&#xff0c;可以使用Vue CLI来创建一个新的项目。 npm install -g vue/cli vue create vue-print-template cd vue-print-template安装vue-html-…...

大模型GUI系列论文阅读 DAY4续:《Large Language Model Agent for Fake News Detection》

摘要 在当前的数字时代&#xff0c;在线平台上虚假信息的迅速传播对社会福祉、公众信任和民主进程构成了重大挑战&#xff0c;并影响着关键决策和公众舆论。为应对这些挑战&#xff0c;自动化假新闻检测机制的需求日益增长。 预训练的大型语言模型&#xff08;LLMs&#xff0…...

Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?

文章目录 本次内容总览第四节&#xff0c;两种基本实现方式概览两种基本实现方式的比较元素个数n大于多少时&#xff0c;使用顺序表存储的空间效率才会更高&#xff1f;时间效率比较&#xff1f;*、访问操作&#xff0c;也就是读运算&#xff0c;读操作1、插入&#xff0c;2、删…...

Scrapy如何设置iP,并实现IP重用, IP代理池重用

前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP &#x1f512; & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…...

动手学图神经网络(4):利用图神经网络进行图分类

利用图神经网络进行图分类:从理论到实践 引言 在之前的学习中,大家了解了如何使用图神经网络(GNNs)进行节点分类。本次教程将深入探讨如何运用 GNNs 解决图分类问题。图分类是指在给定一个图数据集的情况下,根据图的一些结构属性对整个图进行分类,而不是对图中的节点进…...

C++游戏开发深度解析

引言 在本篇文章中&#xff0c;我们将深入探讨C在游戏开发中的应用&#xff0c;包括内存管理、面向对象编程&#xff08;OOP&#xff09;、模板使用等&#xff0c;并通过实际代码示例来帮助理解。 内存管理与智能指针 cpp 深色版本 #include <iostream> #include <…...

ultralytics 是什么?

ultralytics 是一个用于计算机视觉任务的 Python 库&#xff0c;专注于提供高效、易用的目标检测、实例分割和图像分类工具。它最著名的功能是实现 YOLO&#xff08;You Only Look Once&#xff09; 系列模型&#xff0c;特别是最新的 YOLOv8。 1. YOLO 是什么&#xff1f; YO…...

【从零到一,C++项目实战】CineShare++(基于C++的视频点播系统)

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…...

kaggle-ISIC 2024 - 使用 3D-TBP 检测皮肤癌-学习笔记

问题描述&#xff1a; 通过从 3D 全身照片 (TBP) 中裁剪出单个病变来识别经组织学确诊的皮肤癌病例 数据集描述&#xff1a; 图像临床文本信息 评价指标&#xff1a; pAUC&#xff0c;用于保证敏感性高于指定阈值下的AUC 主流方法分析&#xff08;文本&#xff09; 基于CatBoo…...

C语言深入解析 printf的底层源码实现

深入解析 printf 的底层源码实现 printf 是 C 标准库中最常用的函数之一&#xff0c;用于格式化输出字符串。它的底层实现复杂且高效&#xff0c;包含多个模块化的函数和机制。本文结合 GNU C Library&#xff08;glibc&#xff09;的源码&#xff0c;详细分析 printf 的实现原…...

IPhone14 Pro 设备详情

目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn...

vim多文件操作如何同屏开多个文件

[rootxxx ~]# vimdiff aa.txt bb.txt cc.txt #带颜色比较的纵向排列打开的同屏多文件操作 示例&#xff1a; [rootxxx ~]# vimdiff -o aa.txt bb.txt cc.txt #带颜色比较的横向排列打开的同屏多文件操作 示例&#xff1a; [rootxxx ~]# vim -O aa.txt bb.txt c…...

18款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09;-CSDN博客 ​ Python烟…...

服务器虚拟化技术详解与实战:架构、部署与优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在现代 IT 基础架构中&#xff0c;服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…...