Go context.AfterFunc:取消时如何安全清理资源

Go 服务里很多资源泄漏,不是忘了写 Close,而是取消路径没有收好。本文围绕 context.AfterFunc 的触发方式、stop 的真实语义、幂等清理和可等待封装四个问题展开,说明它适合解决什么场景,以及哪些边界必须自己补齐。

Go context.AfterFunc:取消时如何安全清理资源

如何通过日志提升 Debian Node.js 安全性

这篇文章围绕 Debian 上的 Node.js 应用日志安全展开,梳理了 8 个可直接落地的方向:从结构化记录、关键事件审计,到轮转清理、集中分析、实时告警和权限保护。重点不是“多记日志”,而是让日志真正具备溯源、预警和配合防护策略的能力。

如何通过日志提升 Debian Node.js 安全性

为什么 SQL `NOT EXISTS` 比 `NOT IN` 更安全

`NOT IN` 最大的问题不是慢,而是遇到 `NULL` 后可能直接把结果变成空集,造成业务逻辑误判。相比之下,`NOT EXISTS` 在空值安全、索引利用、关联表达和并发一致性上都更稳,更适合作为默认写法。 很多开发者会把 NOT IN 和 NOT EXISTS 当成语义接近、只差一点性能的两种写法,但真正容易把线上逻辑做错的,往往是 NULL 、隐式类型转换和并发下的。

为什么 SQL `NOT EXISTS` 比 `NOT IN` 更安全

Go 语言设计哲学:为什么说组合优于继承?

Go 没有沿用 Java、C++ 那套继承体系,而是把代码复用的重点放在组合、结构体嵌入和接口配合上。本文从继承的局限、Go 的实现方式到几个典型示例,梳理为什么“组合优于继承”不是口号,而是更贴近 Go 设计哲学的工程选择。

Go 语言设计哲学:为什么说组合优于继承?

Go map 缩容机制:为什么它更像“伪缩容”

Go 的 map 在删除大量元素后,通常不会像很多人预期的那样直接把底层容量缩小。真正发生的是对溢出桶的整理:满足条件时触发一次不改 B 值的重排,改善查找效率,却未必明显降低内存占用。理解这点,才能正确判断何时需要手动重建 map。

Go map 缩容机制:为什么它更像“伪缩容”

Rust 在 CentOS 上运行慢,先按这 4 层排查再谈优化

Rust 程序在 CentOS 上跑得慢,常见原因并不只在代码本身,编译模式、系统限制和运行时组件同样会拖后腿。本文按“先确认编译产物,再查代码热点,最后调系统与运行时”的顺序梳理一套可落地的加速方法,适合需要尽快定位瓶颈的开发者参考。

Rust 在 CentOS 上运行慢,先按这 4 层排查再谈优化

如何通过 Compton 配置实现多屏显示优化

Compton 作为轻量级合成管理器,能在 Linux 多屏环境里改善撕裂、卡顿和黑屏等问题。本文按“安装、核心参数、启动自启、故障排查”的顺序整理配置方法,保留可直接使用的命令与示例,帮助你判断哪些参数该优先调整。

如何通过 Compton 配置实现多屏显示优化

如何在 Linux 上配置 PHP 的时区

在 Linux 上配置 PHP 时区,核心是找对生效范围:全局长期配置、PHP-FPM 专用配置、Apache 站点级配置,还是仅用于当前终端会话的临时验证。本文按环境拆解 4 种常见方法,并附上命令、配置项与重启要点。

如何在 Linux 上配置 PHP 的时区