分类 ALL 下的文章 - CorePlayers
首页
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
搜 索
1
DDD领域驱动设计:从底层原理到生产级全链路落地实战
46 阅读
2
2026技术架构新趋势:从微服务回调到AI原生架构设计
46 阅读
3
Go + 云原生2026:从微服务到AI Infra的实战架构
36 阅读
4
事件驱动架构(EDA):从理论到项目落地的完整实践
36 阅读
5
Prompt 工程与 PGvector RAG 知识库:从文档 ETL 到查询增强的完整闭环
35 阅读
ALL
(79)
AI
(20)
前端
(24)
后端
(23)
Dify/Coze
(7)
架构设计
(6)
登录
/
注册
搜 索
标签搜索
AI Agent
边缘计算
RSC
虚拟线程
Java
Spring Boot 4
Vibe Coding
AI原生
SDD
全栈开发
高并发
Project Loom
性能优化
2026趋势
协议标准
工具调用
MCP协议
多Agent协作
CrewAI
Spring AI
EthanCcc
累计撰写
79
篇文章
累计收到
1
条评论
首页
栏目
ALL
AI
前端
后端
Dify/Coze
架构设计
页面
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
用户登录
登录
注册
ALL
2025-05-12
Bun 1.2 全栈实战:新一代 JavaScript 运行时深度评测
Bun 作为新兴的 JavaScript 运行时,在 2025 年发布的 1.2 版本中新增了大量企业级特性,正逐步从一个"快速的 Node.js 替代品"进化为"全栈开发一体化平台"。本文将从实际项目出发,全面评测 Bun 1.2 的核心能力。Bun 1.2 核心特性1. 内置 PostgreSQL 客户端:Bun 1.2 新增了原生 SQL 支持,无需安装第三方驱动,可以直接编写参数化查询。性能比 node-postgres 快 3-5 倍。import from "bun"; const users = await sql`SELECT * FROM users WHERE age > $`;2. Bun.serve() HTTP 服务器升级:支持 HTTP/2 和 WebSocket 零配置,内置压缩和 TLS。3. 改进的 Node.js 兼容性:Bun 1.2 的 Node.js 兼容率已从 90% 提升至 97%,大部分 npm 包可以直接运行。构建全栈应用使用 Bun 的全栈能力,一个简单的 API 服务只需要几十行代码:const server = Bun.serve( return new Response("Not Found", ); }, });与 Node.js/Deno 对比在相同的 HTTP 服务基准测试中,Bun 1.2 的吞吐量是 Node.js 20 的 2.8 倍,是 Deno 2.0 的 1.6 倍。启动速度方面,Bun 平均在 25ms 内完成冷启动,而 Node.js 需要约 80ms。但需要注意,Bun 在 Windows 上的支持仍然落后于 macOS/Linux。何时应该迁移到 Bun?如果你的项目是一个新启动的全栈应用,或者对服务端性能有较高要求,Bun 1.2 是一个非常值得考虑的选择。但对于依赖大量原生 C++ 模块的大型项目,建议等待生态进一步成熟。
2025年05月12日
16
0
1
2025-05-10
MySQL 性能调优实战:索引优化、SQL 调优与分库分表策略
数据库性能问题是后端开发中最常见的瓶颈。然而,很多开发者的"优化"就是在字段上加个索引——然后发现还是慢。本文将系统梳理 MySQL 性能调优的三个核心维度:索引优化、SQL 调优和分库分表,并介绍 Druid 监控工具的使用。索引优化的本质:数据结构的选择B+Tree 为什么是 MySQL 的首选?B+Tree 的所有数据都存在叶子节点,非叶子节点只存索引——这让单次磁盘 I/O 能检索更多索引键。在 16KB 的 InnoDB 页中,假设主键是 BIGINT(8字节)+ 指针(6字节),一个非叶子节点大约能存 16KB / 14B ≈ 1170 个索引键。三层 B+Tree(根→中间→叶子)约能索引 1170 × 1170 × 16 ≈ 两千万行。这意味着绝大多数 OLTP 查询只需 1~3 次磁盘 I/O。最左前缀原则:面试必问CREATE INDEX idx_a_b_c ON users(a, b, c); -- 走索引(匹配最左前缀) SELECT * FROM users WHERE a = 1; SELECT * FROM users WHERE a = 1 AND b = 2; -- 不走索引(跳过了 a) SELECT * FROM users WHERE b = 2; SELECT * FROM users WHERE c = 3; -- 部分走索引(a 走索引,c 不走) SELECT * FROM users WHERE a = 1 AND c = 3;索引失效的常见场景-- 1. 函数操作(索引列参与计算) SELECT * FROM orders WHERE DATE(create_time) = '2025-01-01'; -- 失效! -- 改为:WHERE create_time >= '2025-01-01' AND create_time < '2025-01-02'; -- 2. 隐式类型转换 SELECT * FROM users WHERE phone = 13800138000; -- phone 是 VARCHAR,失效! -- 3. LIKE 前置模糊 SELECT * FROM articles WHERE title LIKE '%MySQL%'; -- 完全失效 -- 4. OR 条件不全有索引 SELECT * FROM users WHERE name = 'ABC' OR age = 25; -- age 没有索引覆盖索引:最优雅的性能优化CREATE INDEX idx_name_age ON users(name, age); SELECT name, age FROM users WHERE name = 'ABC'; -- 不需要回表!SQL 执行计划分析(EXPLAIN 必看项)EXPLAIN SELECT * FROM orders WHERE user_id = 100 AND status = 'paid'; -- 关键指标 -- type: const > eq_ref > ref > range > index > ALL(绝对不能出现 ALL) -- key: 实际使用的索引 -- rows: 扫描行数(越小越好) -- Extra: Using filesort / Using temporary(出现就说明需要优化)慢查询分析:找到瓶颈-- 开启慢查询日志 SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1; -- 用 mysqldumpslow 分析 mysqldumpslow -s t -t 10 /var/log/mysql/slow.logDruid SQL 监控// Spring Boot 集成 Druid spring: datasource: druid: stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin filter: stat: enabled: true slow-sql-millis: 1000 log-slow-sql: true通过 /druid/index.html 可视化查看:SQL 执行次数、耗时分布、连接池状态、慢查询列表。分库分表策略垂直分库:按业务拆分用户库(user_db)、订单库(order_db)、商品库(product_db),各库独立部署、独立扩容。水平分表:ShardingSphere-JDBC 配置# sharding.yml rules: - !SHARDING tables: t_order: actualDataNodes: ds0.t_order_$-> databaseStrategy: standard: shardingColumn: user_id shardingAlgorithmName: db_inline tableStrategy: standard: shardingColumn: order_id shardingAlgorithmName: order_inline shardingAlgorithms: db_inline: type: INLINE props: algorithm-expression: ds$-> order_inline: type: INLINE props: algorithm-expression: t_order_$->总结MySQL 优化有一个优先级:SQL 优化 > 索引优化 > 架构优化。大多数性能问题的根源在于糟糕的 SQL 和缺失的索引,而不是"数据库配置参数不够好"。Druid 监控是你发现这些问题的眼睛,而分库分表是最后的底牌——在此之前,请先确保 SQL 和索引已经做到最好。
2025年05月10日
11
0
1
2025-05-08
多模态 RAG:图像检索增强生成的完整实践指南
传统 RAG(检索增强生成)主要处理文本数据,但在实际应用中,大量知识以图像、图表、PDF 扫描件等形式存在。多模态 RAG 将 RAG 的能力从文本扩展到图像,使得 AI 应用可以理解和检索视觉信息。本文将提供完整的技术实现方案。多模态 RAG 的架构设计一个典型的多模态 RAG 系统包含以下组件:1. 多模态嵌入模型:CLIP(Contrastive Language-Image Pre-training)是目前最主流的多模态嵌入模型。它可以将图像和文本映射到同一个向量空间,使得文本查询可以直接检索相关图像。OpenAI 的 CLIP ViT-L/14 模型在多项基准测试中表现最优,而开源替代方案如 Chinese-CLIP 在中文场景中更具优势。2. 多模态文档解析:PDF、PPT 等文档中的图文混合内容需要专门的解析器。Unstructured 库和 LlamaParse 是目前最成熟的方案,它们可以将复杂文档拆解为"文本块 + 关联图像块"的结构化片段。3. 多向量存储:支持向量搜索的数据库(如 Milvus、Weaviate)需要同时存储文本嵌入和图像嵌入,并维护它们之间的关联映射。完整流程1. 文档解析:将 PDF 中的文本和图像分别提取,记录它们在页面中的位置关系。2. 嵌入生成:文本块使用 text-embedding-3-large 生成嵌入,图像使用 CLIP 生成嵌入。3. 存储:将两种嵌入及元数据存入向量数据库,同时建立"文本块 ↔ 图像块"的映射表。4. 检索:用户查询时,使用相同的嵌入模型将查询转为向量,同时搜索文本向量和图像向量。5. 生成:将检索到的文本和图像 URL/描述一起传入多模态 LLM(如 GPT-4o),生成集成答案。
2025年05月08日
24
0
1
2025-04-25
Vue 3 Composition API 实战:从 Options API 到 Composables 思维转型
Vue 3 的 Composition API 不仅仅是一种新的 API 风格,它代表了一种全新的代码组织思维——从"按选项类型组织"转向"按逻辑关注点组织"。本文将从一个真实项目的重构案例出发,深入讲解 Composition API 的实战技巧。Options API 的痛点:逻辑碎片化考虑一个典型的搜索组件,使用 Options API 编写时,一个功能(搜索)的逻辑会散落在 data、watch、methods、mounted、beforeUnmount 等多个选项中。当组件变得复杂时,在数百行代码中追踪一个功能的完整逻辑变得极其困难。Composition API 的解决方案:按功能聚合同样的搜索功能,用 Composition API 重写后,所有搜索相关的逻辑——状态、副作用、清理——都被封装在一个 composable 函数中。这就是 Composable(组合函数) 的核心思想。function useSearch() \n finally \n }\n\n function debounceSearch(val) , 300);\n }\n\n watch(keyword, debounceSearch);\n onBeforeUnmount(() => clearTimeout(timer));\n\n return ;\n}ref vs reactive:何时用哪个?// ref:适用于基本类型和需要整体替换的场景\nconst count = ref(0);\nconst user = ref();\ncount.value++; // 需要 .value\nuser.value = ; // 可以整体替换\n\n// reactive:适用于复杂对象,不需要 .value\nconst state = reactive(, settings: });\nstate.user.name = '李四'; // 直接访问,无 .value\n\n// reactive 的限制:不能整体替换\nlet state = reactive();\nstate = reactive(); // 破坏了响应式引用\n// 用 ref 包装对象避免此问题实战建议:对于组件内部状态,优先使用 ref(更灵活,类型推断更好);对于包含多个相关属性的配置对象,使用 reactive。Composable 设计原则1. 单一职责一个 Composable 只做一件事。如果 useUser() 既管理用户认证又管理用户偏好设置,应该拆分为 useAuth() 和 usePreferences()。2. 可配置而非硬编码function useSearch( = ) 3. 清理副作用function useEventListener(target, event, handler) 实战案例:可复用的数据获取 Composablefunction useFetch(url) catch (e) \n finally \n }\n\n if (isRef(url)) ); }\n else \n\n return ;\n}从 Options API 迁移的渐进策略不需要一次性重写整个项目:新组件直接用 Composition API,提取可复用的 Composable 从现有 mixin 开始转化,复杂组件(超过 300 行)逐个重构,利用 setup 语法糖进一步简化代码。Options API 不会消失——对于简单组件,它仍然是非常好的选择。Composition API 的价值主要体现在复杂组件的逻辑组织和跨组件的逻辑复用。
2025年04月25日
12
0
1
2025-04-22
Go 1.24 泛型新特性与生产实战
Go 1.24 在 2025 年初发布,泛型特性迎来了第二次重大迭代。从 Go 1.18 的泛型初版到如今的 1.24,泛型已经从"实验性功能"进化为了"生产级基础设施"。本文将从实战角度解析 Go 1.24 泛型的最佳实践。Go 1.24 泛型新特性1. 类型推断增强:Go 1.24 显著改进了泛型函数的类型推断能力,大部分场景下不再需要显式指定类型参数。// Go 1.21 需要显式指定类型 result := Map[int, string](nums, strconv.Itoa) // Go 1.24 自动推断 result := Map(nums, strconv.Itoa)2. Range over func:迭代器模式正式进入标准库,使得泛型集合可以无缝使用 for-range 循环。3. 标准库泛型化:slices、maps、cmp 等包新增了大量泛型工具函数,大幅减少重复代码。实战:构建类型安全的泛型仓库层在典型的三层架构中,每个实体的 CRUD 操作通常高度相似。使用 Go 1.24 泛型可以消除这些重复:type Repository[T any, ID comparable] interface 通过泛型接口和实现,原本需要为每个实体(User、Order、Product 等)重复编写的 200+ 行仓储代码可以压缩为一个通用实现。性能考量Go 的泛型在编译时进行单态化(monomorphization),这意味着每个具体类型会生成独立的代码,不存在运行时开销。但这也意味着编译时间和二进制大小会有所增加。在我们的测试中,泛型化后的仓库层代码量减少了 60%,而二进制大小仅增加了 3.2%,编译时间增加 8%。
2025年04月22日
12
0
1
1
...
12
13
14
...
16