<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title>8丶9</title><link>https://blog.89cyx.cc/</link><atom:link href="https://blog.89cyx.cc/rss.xml" rel="self" type="application/rss+xml"/><description>世界噪点，私人频段</description><generator>Halo v2.27.0</generator><language>zh-cn</language><image><url>https://blog.89cyx.cc/upload/touxiang.jpg</url><title>8丶9</title><link>https://blog.89cyx.cc/</link></image><lastBuildDate>Wed, 21 Oct 2026 08:02:34 GMT</lastBuildDate><item><title><![CDATA[03-MongoDB 关联查询：N+1 慢查询、两次查询法与 $lookup]]></title><link>https://blog.89cyx.cc/archives/mongodb-join-queries</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=03-MongoDB%20%E5%85%B3%E8%81%94%E6%9F%A5%E8%AF%A2%EF%BC%9AN%2B1%20%E6%85%A2%E6%9F%A5%E8%AF%A2%E3%80%81%E4%B8%A4%E6%AC%A1%E6%9F%A5%E8%AF%A2%E6%B3%95%E4%B8%8E%20%24lookup&amp;url=/archives/mongodb-join-queries" width="1" height="1" alt="" style="opacity:0;">MongoDB关联查询有嵌入、两次查询法与$lookup三条路。N+1是循环逐条查，往返随数据量增长并可能占满连接池；两次查询法应一次IN批量取、id去重分批、先分页主表再关联、空列表短路并用Map拼装。关联数据只展示时两次查询法足够，若参与过滤、排序、分页或关联表更大，需用$lookup下推数据库。使用$lookup要给关联字段建索引，注意$unwind默认INNER JOIN语义，以及相关子查询和$expr索引限制。选型优先级为嵌入、两次查询法、$lookup，并可用profiler发现N+1。]]></description><guid isPermaLink="false">/archives/mongodb-join-queries</guid><dc:creator>8丶9</dc:creator><category>数据库</category><pubDate>Tue, 20 Oct 2026 16:53:20 GMT</pubDate></item><item><title><![CDATA[02-MongoDB 索引与查询性能：复合索引、覆盖查询与执行计划]]></title><link>https://blog.89cyx.cc/archives/mongodb-index-performance</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=02-MongoDB%20%E7%B4%A2%E5%BC%95%E4%B8%8E%E6%9F%A5%E8%AF%A2%E6%80%A7%E8%83%BD%EF%BC%9A%E5%A4%8D%E5%90%88%E7%B4%A2%E5%BC%95%E3%80%81%E8%A6%86%E7%9B%96%E6%9F%A5%E8%AF%A2%E4%B8%8E%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92&amp;url=/archives/mongodb-index-performance" width="1" height="1" alt="" style="opacity:0;">MongoDB 系列第 2 篇。没有索引时 MongoDB 只能 COLLSCAN 全表扫。复合索引的字段顺序按 ESR 排才有用，覆盖查询能省掉 FETCH，explain 的 executionStats 里 totalDocsExamined 和 nReturned 的比值才说明问题。附索引类型全集、深分页为什么越翻越慢、唯一索引与部分索引的组合用法，以及 TTL 索引的真实行为。]]></description><guid isPermaLink="false">/archives/mongodb-index-performance</guid><dc:creator>8丶9</dc:creator><category>数据库</category><pubDate>Tue, 20 Oct 2026 15:10:22 GMT</pubDate></item><item><title><![CDATA[01-MongoDB 基础：文档模型、CRUD 与聚合管道]]></title><link>https://blog.89cyx.cc/archives/mongodb-basics</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=01-MongoDB%20%E5%9F%BA%E7%A1%80%EF%BC%9A%E6%96%87%E6%A1%A3%E6%A8%A1%E5%9E%8B%E3%80%81CRUD%20%E4%B8%8E%E8%81%9A%E5%90%88%E7%AE%A1%E9%81%93&amp;url=/archives/mongodb-basics" width="1" height="1" alt="" style="opacity:0;">文章梳理MongoDB 9.0的文档模型、BSON与_id、嵌入/引用建模、增删改查和聚合管道。核心结论：BSON强类型导致类型不一致时查询可能静默无结果，投产应加validator防脏数据；嵌入适合随父读取且有上限的数据，引用适合无上限、需独立查询或共享的数据；写关注默认w:"majority"，insert/update/remove已废弃，应改用新API；聚合中$match应前置以走索引。Spring Boot 4.x配置前缀改为spring.mongodb.*，照旧文会静默连错库。读者可避开类型、建模、写入语义和版本迁移中的常见坑。]]></description><guid isPermaLink="false">/archives/mongodb-basics</guid><dc:creator>8丶9</dc:creator><category>数据库</category><pubDate>Tue, 20 Oct 2026 15:10:19 GMT</pubDate></item><item><title><![CDATA[03-MyBatis 分页：三种写法与一个真实项目的落地]]></title><link>https://blog.89cyx.cc/archives/mybatis-pagination</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=03-MyBatis%20%E5%88%86%E9%A1%B5%EF%BC%9A%E4%B8%89%E7%A7%8D%E5%86%99%E6%B3%95%E4%B8%8E%E4%B8%80%E4%B8%AA%E7%9C%9F%E5%AE%9E%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%90%BD%E5%9C%B0&amp;url=/archives/mybatis-pagination" width="1" height="1" alt="" style="opacity:0;">分页有三种实现：手写LIMIT最可控但需自写count；MyBatis-Plus与PageHelper在拦截器层改写SQL并额外执行count；内存分页会把全量数据拉入内存，是事故源头。startPage未生效常因中间插入查询或处于异步线程。大表分页慢在count全扫与深分页offset，可用延迟关联缓解。MP 3.5.9后需单引mybatis-plus-jsqlparser；排序字段须白名单校验并设置maxLimit。项目只留一套分页插件，复杂查询须核对实际count SQL。]]></description><guid isPermaLink="false">/archives/mybatis-pagination</guid><dc:creator>8丶9</dc:creator><category>java</category><pubDate>Tue, 20 Oct 2026 13:58:17 GMT</pubDate></item><item><title><![CDATA[02-MyBatis-Plus：把重复的 CRUD 收进框架]]></title><link>https://blog.89cyx.cc/archives/mybatis-plus</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=02-MyBatis-Plus%EF%BC%9A%E6%8A%8A%E9%87%8D%E5%A4%8D%E7%9A%84%20CRUD%20%E6%94%B6%E8%BF%9B%E6%A1%86%E6%9E%B6&amp;url=/archives/mybatis-plus" width="1" height="1" alt="" style="opacity:0;">MyBatis-Plus在MyBatis上增强而非重写，替代单表CRUD、条件拼装、主键生成、字段填充和逻辑删除，不替代动态SQL、复杂映射、事务、缓存及索引优化。3.5.9起分页需额外引入jsqlparser，拦截器统一且分页最后；3.3.0起ID_WORKER改名ASSIGN_ID。Spring Boot 3须用对应starter。乐观锁更新返回0即失败，自动填充仅实体更新生效。可避开版本与配置坑。]]></description><guid isPermaLink="false">/archives/mybatis-plus</guid><dc:creator>8丶9</dc:creator><category>java</category><pubDate>Tue, 20 Oct 2026 13:58:14 GMT</pubDate></item><item><title><![CDATA[01-MyBatis 基础：从配置到动态 SQL 与两级缓存]]></title><link>https://blog.89cyx.cc/archives/mybatis-basics</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=01-MyBatis%20%E5%9F%BA%E7%A1%80%EF%BC%9A%E4%BB%8E%E9%85%8D%E7%BD%AE%E5%88%B0%E5%8A%A8%E6%80%81%20SQL%20%E4%B8%8E%E4%B8%A4%E7%BA%A7%E7%BC%93%E5%AD%98&amp;url=/archives/mybatis-basics" width="1" height="1" alt="" style="opacity:0;">文章说明 MyBatis 主要收走 JDBC 中连接管理、参数设置、结果集遍历与关闭等样板代码，但 SQL 仍需手写。结合 3.5.19 与新版 MySQL Connector/J，强调配置文件元素须按 DTD 顺序、Mapper 要注册、`#{}` 是预编译占位符而 `${}` 用于 SQL 结构且须白名单；同时梳理 SqlSessionFactory/SqlSession 生命周期、驼峰映射、动态 SQL、两级缓存及常见报错。读者可据此避开驱动类、时区、字段映射、注入和连接池耗尽等问题。]]></description><guid isPermaLink="false">/archives/mybatis-basics</guid><dc:creator>8丶9</dc:creator><category>java</category><pubDate>Tue, 20 Oct 2026 13:57:35 GMT</pubDate></item><item><title><![CDATA[05-MySQL 优化与版本细节：SQL 优化清单与行为差异]]></title><link>https://blog.89cyx.cc/archives/mysql-optimization-and-versions</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=05-MySQL%20%E4%BC%98%E5%8C%96%E4%B8%8E%E7%89%88%E6%9C%AC%E7%BB%86%E8%8A%82%EF%BC%9ASQL%20%E4%BC%98%E5%8C%96%E6%B8%85%E5%8D%95%E4%B8%8E%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82&amp;url=/archives/mysql-optimization-and-versions" width="1" height="1" alt="" style="opacity:0;">本文给出可照改的 MySQL SQL 优化清单，梳理跨版本行为差异。优化先看 EXPLAIN ANALYZE，统计失真先 ANALYZE TABLE；写法上显式列名、LIMIT 配 ORDER BY、条件可走索引、IN 不宜过长，避免前导 %，警惕相关子查询。版本差异重点：VARCHAR 长度按字符，INT(11) 仅显示宽度且已废弃，引号用参数化代替转义，utf8 实为 utf8mb3；JSON 自 5.7 原生支持，8.0.17 起可建多值索引。生产选 LTS，9.7 为当前 LTS，之后改用日历版本号。]]></description><guid isPermaLink="false">/archives/mysql-optimization-and-versions</guid><dc:creator>8丶9</dc:creator><category>mysql</category><pubDate>Tue, 20 Oct 2026 05:25:32 GMT</pubDate></item><item><title><![CDATA[04-MySQL 报表实战：同环比、日期序列与多表连接]]></title><link>https://blog.89cyx.cc/archives/mysql-report-sql-practice</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=04-MySQL%20%E6%8A%A5%E8%A1%A8%E5%AE%9E%E6%88%98%EF%BC%9A%E5%90%8C%E7%8E%AF%E6%AF%94%E3%80%81%E6%97%A5%E6%9C%9F%E5%BA%8F%E5%88%97%E4%B8%8E%E5%A4%9A%E8%A1%A8%E8%BF%9E%E6%8E%A5&amp;url=/archives/mysql-report-sql-practice" width="1" height="1" alt="" style="opacity:0;">MySQL 系列第 4 篇。同环比报表要在同一行里给出本期、上一期、去年同期的几十个指标，折线图还要补出中间没有数据的那几天。这篇拆三件事：三个时间窗怎么各自聚合再横向拼成一行，日期序列怎么用递归 CTE 造出来再左连接补零，同一张表怎么用不同别名连出多表关系。]]></description><guid isPermaLink="false">/archives/mysql-report-sql-practice</guid><dc:creator>8丶9</dc:creator><category>mysql</category><pubDate>Tue, 20 Oct 2026 05:25:30 GMT</pubDate></item><item><title><![CDATA[03-MySQL 函数专题：CONCAT、CONCAT_WS 与 GROUP_CONCAT]]></title><link>https://blog.89cyx.cc/archives/mysql-string-functions</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=03-MySQL%20%E5%87%BD%E6%95%B0%E4%B8%93%E9%A2%98%EF%BC%9ACONCAT%E3%80%81CONCAT_WS%20%E4%B8%8E%20GROUP_CONCAT&amp;url=/archives/mysql-string-functions" width="1" height="1" alt="" style="opacity:0;">MySQL 系列第 3 篇。字符串拼接是最容易出静默错误的一类操作：CONCAT 遇到 NULL 整条结果就变 NULL，CONCAT_WS 会跳过 NULL 但分隔符为 NULL 时结果也是 NULL，GROUP_CONCAT 默认只给 1024 个字符且超出不报错。这篇讲透三个函数，再把常用函数按类别整理成能直接查的速查表。]]></description><guid isPermaLink="false">/archives/mysql-string-functions</guid><dc:creator>8丶9</dc:creator><category>mysql</category><pubDate>Tue, 20 Oct 2026 05:25:24 GMT</pubDate></item><item><title><![CDATA[02-MySQL 事务、锁与索引：ACID、隔离级别与索引失效]]></title><link>https://blog.89cyx.cc/archives/mysql-transactions-locks-index</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=02-MySQL%20%E4%BA%8B%E5%8A%A1%E3%80%81%E9%94%81%E4%B8%8E%E7%B4%A2%E5%BC%95%EF%BC%9AACID%E3%80%81%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E4%B8%8E%E7%B4%A2%E5%BC%95%E5%A4%B1%E6%95%88&amp;url=/archives/mysql-transactions-locks-index" width="1" height="1" alt="" style="opacity:0;">文章围绕MySQL事务、锁与索引，强调三者相互关联：事务定边界、锁管并发、索引决定锁粒度，并提供双会话可复现实验。核心结论是：ACID由undo log、redo log及锁与MVCC支撑，提交时只保证redo落盘和内存页变更；默认RR靠版本链与ReadView实现一致性读，RC每次快照读重建ReadView；锁分MDL、表级、意向和行级，next-key lock依赖索引，未走索引的UPDATE可能锁全表；死锁会被检测并回滚；索引为B+树，二级索引需回表，联合索引遵循最左前缀。读者可复现实验并排查长事务、锁等待、死锁与索引失效。]]></description><guid isPermaLink="false">/archives/mysql-transactions-locks-index</guid><dc:creator>8丶9</dc:creator><category>mysql</category><pubDate>Tue, 20 Oct 2026 05:25:23 GMT</pubDate></item><item><title><![CDATA[04-Redis 缓存实战：穿透击穿雪崩、双写一致与分布式锁]]></title><link>https://blog.89cyx.cc/archives/redis-cache-practice</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=04-Redis%20%E7%BC%93%E5%AD%98%E5%AE%9E%E6%88%98%EF%BC%9A%E7%A9%BF%E9%80%8F%E5%87%BB%E7%A9%BF%E9%9B%AA%E5%B4%A9%E3%80%81%E5%8F%8C%E5%86%99%E4%B8%80%E8%87%B4%E4%B8%8E%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81&amp;url=/archives/redis-cache-practice" width="1" height="1" alt="" style="opacity:0;">Redis 系列第 4 篇。把 Redis 挂在数据库前面，难点全在「缓存和数据库对不上」的时候。这篇讲穿透击穿雪崩三类故障的根因与对策、写读两条路径的一致性保证，以及分布式锁和限流怎么落地。]]></description><guid isPermaLink="false">/archives/redis-cache-practice</guid><dc:creator>8丶9</dc:creator><category>redis</category><pubDate>Tue, 20 Oct 2026 03:44:42 GMT</pubDate></item><item><title><![CDATA[03-Spring Boot 整合 Redis：连接配置、序列化与工具类]]></title><link>https://blog.89cyx.cc/archives/spring-boot-redis-integration</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=03-Spring%20Boot%20%E6%95%B4%E5%90%88%20Redis%EF%BC%9A%E8%BF%9E%E6%8E%A5%E9%85%8D%E7%BD%AE%E3%80%81%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%B7%A5%E5%85%B7%E7%B1%BB&amp;url=/archives/spring-boot-redis-integration" width="1" height="1" alt="" style="opacity:0;">Redis 系列第 3 篇。Spring Boot 接 Redis 只要一个 starter，但默认配置有三个坑：配置前缀写错不报错、默认的 JDK 序列化让 key 变成乱码、Jackson 2 的序列化器在新版本里已经废弃。]]></description><guid isPermaLink="false">/archives/spring-boot-redis-integration</guid><dc:creator>8丶9</dc:creator><category>redis</category><pubDate>Tue, 20 Oct 2026 03:44:40 GMT</pubDate></item><item><title><![CDATA[02-Redis 部署与高可用：容器化、主从复制与哨兵]]></title><link>https://blog.89cyx.cc/archives/redis-deploy-ha</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=02-Redis%20%E9%83%A8%E7%BD%B2%E4%B8%8E%E9%AB%98%E5%8F%AF%E7%94%A8%EF%BC%9A%E5%AE%B9%E5%99%A8%E5%8C%96%E3%80%81%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E4%B8%8E%E5%93%A8%E5%85%B5&amp;url=/archives/redis-deploy-ha" width="1" height="1" alt="" style="opacity:0;">文章聚焦 Redis 容器化部署与高可用：配置和数据目录都要挂载，并显式指定配置文件，改配置后需重启容器；连接失败应按服务、端口、密码、bind、保护模式、防火墙排查，不能随意关闭保护模式。主从复制用 REPLICAOF，SLAVEOF 在 Redis 7.0 已删除；复制异步，读己之写应读主。哨兵负责自动切换，宜奇数至少三个并设置法定人数，注意共享挂载和启动顺序；客户端需接入哨兵才能感知新主。发布订阅不存消息，不能当可靠消息队列。]]></description><guid isPermaLink="false">/archives/redis-deploy-ha</guid><dc:creator>8丶9</dc:creator><category>redis</category><pubDate>Tue, 20 Oct 2026 03:44:35 GMT</pubDate></item><item><title><![CDATA[01-Redis 核心：数据结构、持久化与内存治理]]></title><link>https://blog.89cyx.cc/archives/redis-core-data-structures</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=01-Redis%20%E6%A0%B8%E5%BF%83%EF%BC%9A%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%81%E6%8C%81%E4%B9%85%E5%8C%96%E4%B8%8E%E5%86%85%E5%AD%98%E6%B2%BB%E7%90%86&amp;url=/archives/redis-core-data-structures" width="1" height="1" alt="" style="opacity:0;">本文梳理 Redis 核心机制：它是内存键值服务器，提供 String、List、Set、Hash、ZSet 五种基础类型及 Geo、HyperLogLog、Bitmap 三种特殊类型；命令执行单线程，真正瓶颈是内存和网络带宽，生产应避免 KEYS。持久化含 RDB 快照与 AOF 日志，通常两者都开，AOF 的 everysec 是多数场景正解。配置重点为 maxmemory、淘汰策略、认证及网络暴露面。选型还须注意许可变更和安全风险：8.0.x 止于 8.0.6，仍受 CVE-2026-66373 影响，应升级到 8.2.8 以上；SLAVEOF 已删除，GEORADIUS 已废弃。]]></description><guid isPermaLink="false">/archives/redis-core-data-structures</guid><dc:creator>8丶9</dc:creator><category>redis</category><pubDate>Tue, 20 Oct 2026 03:44:34 GMT</pubDate></item><item><title><![CDATA[阿里云 OSS 接入：Java SDK 上传、下载与权限配置]]></title><link>https://blog.89cyx.cc/archives/aliyun-oss-java-sdk</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=%E9%98%BF%E9%87%8C%E4%BA%91%20OSS%20%E6%8E%A5%E5%85%A5%EF%BC%9AJava%20SDK%20%E4%B8%8A%E4%BC%A0%E3%80%81%E4%B8%8B%E8%BD%BD%E4%B8%8E%E6%9D%83%E9%99%90%E9%85%8D%E7%BD%AE&amp;url=/archives/aliyun-oss-java-sdk" width="1" height="1" alt="" style="opacity:0;">本文介绍阿里云 OSS 的 Java 接入流程，强调难点在权限与密钥管理，而非写代码。应按地域选择公网或内网 endpoint；创建 RAM 子账号并配置最小权限策略，禁用主账号 AccessKey，密钥走环境变量或配置中心，OSSClient 全局单例复用。上传用流式 putObject，objectKey 不含桶名且不以斜杠开头；桶保持私有，通过预签名 URL 控制临时访问，避免公共读暴露全部对象。403 重点查权限、桶策略、时钟偏差和地域不一致，404 多因 key 写错，也可能伪装权限问题。读者可据此完成安全接入并快速排查常见错误。]]></description><guid isPermaLink="false">/archives/aliyun-oss-java-sdk</guid><dc:creator>8丶9</dc:creator><category>云服务器与nas</category><pubDate>Tue, 20 Oct 2026 02:31:23 GMT</pubDate></item><item><title><![CDATA[MinIO 自建对象存储：纠删码原理、部署与项目现状]]></title><link>https://blog.89cyx.cc/archives/minio-self-hosted-object-storage</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=MinIO%20%E8%87%AA%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%EF%BC%9A%E7%BA%A0%E5%88%A0%E7%A0%81%E5%8E%9F%E7%90%86%E3%80%81%E9%83%A8%E7%BD%B2%E4%B8%8E%E9%A1%B9%E7%9B%AE%E7%8E%B0%E7%8A%B6&amp;url=/archives/minio-self-hosted-object-storage" width="1" height="1" alt="" style="opacity:0;">MinIO 是 S3 兼容对象存储，核心是用纠删码把对象拆成数据片和校验片，而非复制多份；按盘数配置 parity，生产至少 EC:3，单机多盘只容错盘，分布式需 4 节点以上。其社区版 2025 年移除完整控制台并停止分发镜像，2026 年仓库归档、Docker Hub 镜像删除，旧拉取命令已失效。现可换 Chainguard MinIO、Silo 或 RustFS；老 tar 可离线回退，但须核对版本校验和、改默认 minioadmin、勿暴露控制台。迁移先切写入，mc mirror 补漏、diff 验空后再切读。]]></description><guid isPermaLink="false">/archives/minio-self-hosted-object-storage</guid><dc:creator>8丶9</dc:creator><category>docker</category><pubDate>Tue, 20 Oct 2026 02:31:20 GMT</pubDate></item><item><title><![CDATA[Spring Boot 文件上传：从 MultipartFile 到可访问的 URL]]></title><link>https://blog.89cyx.cc/archives/spring-boot-file-upload</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=Spring%20Boot%20%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%EF%BC%9A%E4%BB%8E%20MultipartFile%20%E5%88%B0%E5%8F%AF%E8%AE%BF%E9%97%AE%E7%9A%84%20URL&amp;url=/archives/spring-boot-file-upload" width="1" height="1" alt="" style="opacity:0;">Spring Boot文件上传实际分为四段：浏览器提交、容器写入临时盘、业务代码用transferTo搬到业务目录、再将目录映射为URL；四段各有配置和失败点。关键结论：单文件默认上限1MB、请求默认10MB，临时目录配置键是spring.servlet.multipart.location；transferTo传相对路径会落到容器工作目录，应使用绝对路径和Path重载；原始文件名不可信，须截取文件名、由服务端生成存储名并防路径穿越；静态资源映射不鉴权，下载应流式并正确编码中文名。本机磁盘方案存在多副本、容量和冗余限制，可替换为对象存储与预签名URL。]]></description><guid isPermaLink="false">/archives/spring-boot-file-upload</guid><dc:creator>8丶9</dc:creator><category>java</category><pubDate>Tue, 20 Oct 2026 02:31:18 GMT</pubDate></item><item><title><![CDATA[RabbitMQ 从入门到落地：原理、部署、Spring Boot 与最终一致性]]></title><link>https://blog.89cyx.cc/archives/rabbitmq-from-basics-to-production</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=RabbitMQ%20%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E8%90%BD%E5%9C%B0%EF%BC%9A%E5%8E%9F%E7%90%86%E3%80%81%E9%83%A8%E7%BD%B2%E3%80%81Spring%20Boot%20%E4%B8%8E%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7&amp;url=/archives/rabbitmq-from-basics-to-production" width="1" height="1" alt="" style="opacity:0;">消息队列本质是故障隔离带，把“必须同时成功”拆成“先收下、慢慢做”，带来削峰、异步和解耦，代价是最终一致、失败需自兜、排查变长。它不用HTTP，关键在投递确认、路由和背压。RabbitMQ宜选仍有社区支持的4.3.x，Erlang需27以上，发行版源通常过旧。核心模型是Connection上开Channel，消息经Exchange路由到Queue，五种交换机差别在匹配方式。消费端要手动ACK、设置prefetch并保证幂等。分布式事务可用本地消息表，将业务与待发消息同事务写表，再由补偿任务发送；整体是最终一致而非强一致。]]></description><guid isPermaLink="false">/archives/rabbitmq-from-basics-to-production</guid><dc:creator>8丶9</dc:creator><category>消息队列</category><pubDate>Mon, 19 Oct 2026 14:13:56 GMT</pubDate></item><item><title><![CDATA[docker 搭建 Dpanel 容器管理面板]]></title><link>https://blog.89cyx.cc/archives/docker-dpanel-container-panel</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=docker%20%E6%90%AD%E5%BB%BA%20Dpanel%20%E5%AE%B9%E5%99%A8%E7%AE%A1%E7%90%86%E9%9D%A2%E6%9D%BF&amp;url=/archives/docker-dpanel-container-panel" width="1" height="1" alt="" style="opacity:0;">DPanel是国产轻量容器管理面板，可管理容器、镜像、Compose、网络与存储卷，标准版内置域名转发和证书申请，一条docker run即可部署；标准版占用80/443，冲突可选lite。它采用自定义非商业授权，源码可见但非开源，个人自用免费，商用须购买授权且禁止修改后再分发。挂载docker.sock等于交出宿主机控制权，面板被攻破等同宿主机被攻破；社区版缺少2FA，不宜直接暴露公网，建议内网/VPN或lite配外部反代。应用商店需自行填写git仓库地址才有内容。]]></description><guid isPermaLink="false">/archives/docker-dpanel-container-panel</guid><dc:creator>8丶9</dc:creator><category>docker</category><pubDate>Mon, 19 Oct 2026 12:52:25 GMT</pubDate></item><item><title><![CDATA[docker 搭建 EmuLinker-K 街机联机服务器]]></title><link>https://blog.89cyx.cc/archives/docker-emulinker-k-netplay</link><description><![CDATA[<img src="https://blog.89cyx.cc/plugins/feed/assets/telemetry.gif?title=docker%20%E6%90%AD%E5%BB%BA%20EmuLinker-K%20%E8%A1%97%E6%9C%BA%E8%81%94%E6%9C%BA%E6%9C%8D%E5%8A%A1%E5%99%A8&amp;url=/archives/docker-emulinker-k-netplay" width="1" height="1" alt="" style="opacity:0;">EmuLinker-K 是 Kaillera 协议实现，克隆后执行 docker compose up -d 部署，容器带 Java17。它只转发按键、不传画面，联机同步要求双方模拟器版本、ROM 和存档一致。防火墙只需放行 27888/udp，不必开 TCP；maxUsers=0 表示不限人数。中文服主设 charset=GBK、language=zh，避免乱码。access.cfg 热重载，封禁禁言用大厅命令；emulinker.cfg 修改需重启，挂载 conf。]]></description><guid isPermaLink="false">/archives/docker-emulinker-k-netplay</guid><dc:creator>8丶9</dc:creator><category>docker</category><pubDate>Mon, 19 Oct 2026 12:15:26 GMT</pubDate></item></channel></rss>