MyBatis分页查询与性能优化实践
分页查询是后台系统最常见的功能之一。列表页、搜索页、管理后台、日志查询都会用到分页。MyBatis 中分页实现并不复杂,但如果 SQL、索引和分页方式设计不当,数据量大后会出现查询变慢、数据库 CPU 升高和接口超时。 本文介绍 MyBatis 分页查询的基本写法、总数查询、深分页问题和常见优化方法。 基础分页 SQLMySQL 中常见分页写法: 12345select id, username, email, created_atfrom userswhere status = #{status}order by created_at desclimit #{offset}, #{pageSize} offset 的计算: 1int offset = (pageNo - 1) * pageSize; Mapper 接口: 123456789public interface UserMapper { List<UserDO> selectPage( ...
Spring Boot统一异常处理与返回结构设计
在 Spring Boot 接口开发中,如果每个 Controller 都手动 try-catch,代码会很快变得重复且不一致。更好的方式是定义统一返回结构、业务异常和全局异常处理器,让 Controller 专注业务流程。 本文介绍一个常见实践:成功响应返回统一 JSON,业务失败抛出自定义异常,参数校验和未知异常由全局处理器统一转换。 定义统一返回结构先定义一个通用响应类: 12345678910111213141516171819202122public class ApiResponse<T> { private String code; private String message; private T data; public static <T> ApiResponse<T> success(T data) { ApiResponse<T> response = new ApiResponse<>(); ...
Nginx反向代理HTTPS站点配置实践
Nginx 常用于对外提供 HTTPS 入口,然后把请求反向代理到后端服务。这样后端应用可以专注业务逻辑,TLS 证书、静态文件、压缩、限流、访问日志等由 Nginx 统一处理。 本文介绍一个常见配置:用户通过 https://example.com 访问 Nginx,Nginx 转发到本机 127.0.0.1:8080 的后端服务。 前提条件假设已经具备: 域名 example.com 解析到服务器公网 IP。 后端服务监听 127.0.0.1:8080。 已安装 Nginx。 已获取证书文件和私钥文件。 Ubuntu 安装 Nginx: 12apt updateapt install nginx 检查状态: 1systemctl status nginx 基础反向代理配置创建站点配置: 1vim /etc/nginx/sites-available/example.com HTTP 配置: 123456789101112server { listen 80; server_name example.com www.example.com; ...
Docker容器日志过大问题的排查与限制
Docker 默认使用 json-file 日志驱动时,容器标准输出和标准错误会写入宿主机 JSON 日志文件。如果应用日志量很大,而没有配置日志轮转,单个容器日志文件可能增长到几十 GB,最终占满磁盘。 本文介绍如何定位 Docker 容器日志文件、临时清理日志、配置日志大小限制,以及在生产环境中需要注意的点。 查看 Docker 日志占用先查看 Docker 整体磁盘使用: 1docker system df 这个命令会显示镜像、容器、volume 和构建缓存的占用,但不会细分每个容器日志文件。 Docker 容器日志通常位于: 1/var/lib/docker/containers/<container-id>/<container-id>-json.log 查找大日志文件: 1find /var/lib/docker/containers -name '*-json.log' -size +500M -exec ls -lh {}...
Linux服务器磁盘空间排查与清理实践
Linux 服务器磁盘空间不足是非常常见的运维问题。磁盘满了之后,服务可能无法写日志,数据库无法落盘,容器无法启动,甚至 SSH 登录也会变慢。排查这类问题时,关键是先定位哪个分区满了,再逐层找出占用空间最大的目录和文件。 本文整理一套常用排查流程,适用于大多数 Linux 服务器。 查看磁盘分区使用情况首先使用 df 查看各分区空间: 1df -h 输出示例: 123Filesystem Size Used Avail Use% Mounted on/dev/vda1 40G 38G 2.0G 95% //dev/vdb1 200G 120G 80G 60% /data 重点关注 Use% 和挂载点。如果 / 根分区接近 100%,很多系统组件都会受到影响。 查看 inode 使用情况: 1df -ih 如果磁盘空间还有,但 inode 用完,也会出现无法创建文件的问题。大量小文件、缓存文件和临时文件可能导致 inode 耗尽。 找出大目录从满的挂载点开始排查。例如根分区满了: 1du -h...
ROS工作空间catkin_make常见问题排查
ROS1 开发中,catkin_make 是最常用的工作空间编译命令。对于刚开始写 ROS 包的开发者来说,编译失败、找不到包、消息未生成、Python 节点不能执行等问题非常常见。 本文整理 catkin_make 工作空间的基本结构、常用命令和排查思路,帮助快速定位编译问题。 标准工作空间结构一个典型 catkin 工作空间: 1234567891011catkin_ws/ src/ demo_pkg/ CMakeLists.txt package.xml src/ scripts/ msg/ srv/ build/ devel/ src 存放源码包,build 和 devel 是编译生成目录。通常只需要把 src 下的包提交到 Git,build 和 devel 不提交。 创建工作空间: 123mkdir -p ~/catkin_ws/srccd ~/catkin_wscatkin_make 编译成功后加载环境: 1source...
ROS参数服务器的使用场景与实践
ROS 参数服务器用于在运行时存储和读取配置。节点名称、话题名称、控制频率、坐标系名称、传感器参数、算法阈值等都可以通过参数传入,而不是写死在代码中。 合理使用参数服务器可以让同一份节点代码适配不同机器人、不同传感器和不同环境。本文以 ROS1 为例,介绍参数的命名、读取、launch 配置和常见问题。 参数服务器是什么ROS master 内部维护了一个参数字典,节点可以通过 API 读取和写入参数。查看所有参数: 1rosparam list 查看某个参数: 1rosparam get /robot_name 设置参数: 1rosparam set /robot_name demo_bot 删除参数: 1rosparam delete /robot_name 参数服务器适合存储配置,不适合高频数据传输。实时变化的数据应该使用 topic、service 或 action。 全局参数和私有参数ROS 参数有命名空间。全局参数以 / 开头: 12/robot_name/use_sim_time 私有参数以 ~ 表示,绑定到当前节点命名空间。例如节点名为...
ROS话题通信中的消息频率与延迟排查
ROS 系统中,话题通信是最常见的数据传递方式。相机、雷达、IMU、里程计、控制指令都会通过 topic 发布和订阅。系统调试时,经常会遇到消息频率不稳定、延迟变大、订阅不到数据或控制响应慢等问题。 本文以 ROS1 为例,整理排查话题频率和延迟的常用命令、代码注意点和系统层面原因。 查看 topic 列表先确认当前系统中有哪些话题: 1rostopic list 查看某个话题的类型: 1rostopic type /camera/image_raw 查看消息结构: 1rosmsg show sensor_msgs/Image 如果话题不存在,先检查节点是否启动、命名空间是否正确、launch 文件参数是否覆盖了 topic 名称。 查看发布频率使用 rostopic hz: 1rostopic hz /odom 输出会显示平均频率、最小间隔、最大间隔和标准差。对于稳定发布的传感器,频率应该接近配置值。例如 IMU 100Hz,里程计 50Hz。 如果频率明显低于预期,可能原因包括: 发布节点计算耗时太长。 传感器驱动本身输出频率低。 CPU...
使用Scikit-learn构建一个完整分类任务流程
Scikit-learn 非常适合构建传统机器学习任务。它提供了数据切分、特征预处理、模型训练、交叉验证和指标评估等工具。对于表格数据分类任务,先用 Scikit-learn 做一个完整 baseline,通常比直接上复杂深度学习模型更稳。 本文通过一个二分类任务,演示从数据读取到模型保存的完整流程。 准备数据假设数据文件 churn.csv 用于预测用户是否流失,字段包括年龄、消费金额、登录次数、城市、设备类型和标签: 12345import pandas as pddf = pd.read_csv("churn.csv")print(df.head())print(df.info()) 分离特征和标签: 123target = "is_churn"X = df.drop(columns=[target])y = df[target] 如果标签缺失,应该先清理: 123mask = y.notna()X = X[mask]y = y[mask] 划分训练集和测试集分类任务建议使用分层切分,保持标签比例: 123456789from...
Pandas数据清洗常见场景实践
数据清洗是数据分析和机器学习项目中最耗时的环节。模型效果不好时,原因不一定是算法复杂度不够,很多时候是缺失值、重复数据、异常值、类型错误和类别编码没有处理好。 本文整理 Pandas 中常见的数据清洗场景,包括读取数据、查看概况、处理缺失值、去重、类型转换、异常值过滤、文本字段清理和类别编码。 读取数据并查看概况假设有一个用户行为数据文件: 123import pandas as pddf = pd.read_csv("users.csv") 先不要急着建模,应该先查看基本信息: 123print(df.head())print(df.info())print(df.describe()) head 查看前几行,info 查看字段类型和缺失情况,describe 查看数值字段的分布。 统计缺失值: 12missing =...




