[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"articles-1-10":3},{"code":4,"msg":5,"data":6},200,"成功",{"list":7,"total":100},[8,21,30,39,48,56,65,74,82,91],{"id":9,"title":10,"slug":11,"summary":12,"wordCount":13,"readingTime":14,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":19,"likeCount":18,"commentCount":18,"publishTime":20},"2101860362313854978","语音转文字技术实践，分片、保活、声纹：内网转写系统的四个关键实现","yuyinzhuanwenzijishushijianfenpianbaohuoshengwenneiwangzhuanxiexitongdesigeguanjianshixian","经过半个月的时间不断学习和模型的训练，调试，整个语音识别这块的技术栈进行研究，本次主要是端到端，不调用互联网的API接口，自己通过小模型的学习，实现一套支持语音文件识别文字、识别声纹、杂波过滤、支持在线校对等于一体的语音识别文字，整个效果可以实现技术自主可控，成本低廉和可以正式使用的工具； 下面直接先看效果： ![](https:\u002F\u002Fseabrid.cn\u002Ffile\u002F2026\u002F2101862133727817728.png) ![](https:\u002F\u002Fseabrid.cn\u002Ffile\u002F2026\u002F2101862219169984512.png) ![](https:\u002F\u002Fseabrid.cn\u002Ffile\u002F2026\u002F2101862248702078976.png) ![](https:\u002F\u002Fseabrid.cn\u002Ffile\u002F2026\u002F2101863368358948864.png) > 只有 CPU、没有 ...",21155,70,"0","",2,0,72,"2026-09-21 00:00:00",{"id":22,"title":23,"slug":24,"summary":25,"wordCount":26,"readingTime":27,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":28,"likeCount":18,"commentCount":18,"publishTime":29},"2069808550190837762","Qdrant 深度解析：面向向量搜索的高性能数据库","qdrant-shendujieximianxiangxiangliangsousuodegaoxingnengshujuku","## 一、什么是 Qdrant？ Qdrant 是一个**开源的向量数据库（Vector Database）**，专门用于存储、管理和检索高维向量数据。它通过高效的**近似最近邻搜索（ANN, Approximate Nearest Neighbor）**算法，实现毫秒级的相似度查询。 **核心定位：** > Qdrant = 向量存储 + 相似度搜索 + 过滤能力 **适用场景：** - 语义搜索（Semantic Search） - 推荐系统（Recommendation System） - 图像\u002F音频检索 - 大模型 RAG（知识检索增强） --- ## 二、为什么需要向量数据库？ 传统数据库（如 MySQL、PostgreSQL）主要处理结构化数据，而 AI 应用更多是**\"语义相似性\"**问题，例如： - \"找和这段话意思相近的内容\" - \"推荐和用户兴趣相似的商品\" **向量表...",2650,8,414,"2026-06-24 23:43:05",{"id":31,"title":32,"slug":33,"summary":34,"wordCount":35,"readingTime":36,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":37,"likeCount":18,"commentCount":18,"publishTime":38},"2058861222097383425","Umi-OCR Docker 部署与 API 接口调用指南","umi-ocr-docker-bushuyu-api-jiekoudiaoyongzhinan","Umi-OCR 是一款免费、开源、可批量的离线 OCR 软件，支持截屏识别、批量导入图片、PDF 文档识别、排除水印\u002F页眉页脚、扫描\u002F生成二维码等功能。其 Docker 部署方案使得在 Linux 服务器或桌面环境下运行和集成变得非常便捷。 ### 一、Docker 部署 Umi-OCR #### 1. 部署前提 在开始部署前，请确保您的主机 CPU 支持 AVX 指令集，这是运行 Umi-OCR Linux 版本的必要条件。 ```bash lscpu | grep avx ``` 如果命令输出中包含 `avx` 和 `avx2`，则可以继续部署。 #### 2. 构建 Docker 镜像 首先，下载官方提供的 Dockerfile 并构建镜像。 ```bash # 1.",3556,11,505,"2026-05-25 18:42:19",{"id":40,"title":41,"slug":42,"summary":43,"wordCount":44,"readingTime":45,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":46,"likeCount":18,"commentCount":18,"publishTime":47},"2054207490390814721","基于Spring AI Alibaba构建智能点餐助手Agent","jiyuspring-ai-alibabagoujianzhinengdiancanzhushouagent","> 手把手带你入门Agent开发，实现一个能理解自然语言、自动推荐菜品的AI点餐助手 ## 一、背景：从规则到智能 传统的点餐推荐通常由硬编码逻辑实现——根据人数计算菜品数量，按荤素比例筛选，最后返回结果。这种方式虽然确定、高效，但缺乏**灵活性**：用户无法用自然语言表达“今晚4个人，想吃辣一点的，预算200左右”，更无法追问调整。 随着大模型和Agent技术的成熟，我们可以构建一个**智能点餐Agent**：用户用平常说话的方式提出需求，Agent自动调用工具函数完成推荐，并以友好的格式返回结果。 Spring AI Alibaba 提供了完整的 Agent 开发框架（基于 `ReactAgent`），结合阿里云 DashScope 大模型，可以快速搭建此类应用。 本文将带你从零开始，开发一个功能完整的智能点餐助手。 --- ## 二、环境准备 ### 2.1 基础要求 - JDK 1...",14914,49,491,"2026-05-12 22:29:59",{"id":49,"title":50,"slug":51,"summary":52,"wordCount":53,"readingTime":27,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":54,"likeCount":18,"commentCount":18,"publishTime":55},"2051303568504320001","1000 万短信 1 小时发完，怎么设计线程池？","1000-wanduanxin-1-xiaoshifawanzenmeshejixianchengchi","设计一个能在一小时内稳定发送一千万条短信的线程池，绝不仅仅是设置几个参数那么简单。这是一个典型的**高并发、IO密集型**任务，需要从架构层面进行系统性设计，以确保高性能、高可靠和系统稳定。 以下是完整的设计方案： ### 🎯 核心目标与约束 首先，明确我们的目标： * **总量**: 10,000,000 条短信 * **时限**: 1 小时 (3600 秒) * **平均速率**: `10,000,000 \u002F 3600 ≈ 2778` 条\u002F秒 这意味着我们的系统需要稳定地维持近 2800 QPS 的发送能力。 ### 🛠️ 线程池核心配置 在生产环境中，严禁使用 `Executors.newFixedThreadPool()` 等方式创建线程池，因为它们使用无界队列，在海量任务下极易导致内存溢出（OOM）。我们必须手动创建 `ThreadPoolExecutor` 并进行精细化配置...",2565,397,"2026-05-04 00:00:00",{"id":57,"title":58,"slug":59,"summary":60,"wordCount":61,"readingTime":62,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":63,"likeCount":18,"commentCount":18,"publishTime":64},"2041716173987442689","Tailwind CSS 完整字典\u002F速查表（前端开发常用）","tailwind-css-wanzhengzidiansuchabiaoqianduankaifachangyong","## 📐 布局 Layout | 类别 | 常用类 | 说明 | |:---|:---|:---| | **容器** | `container` `mx-auto` `px-4` | 居中容器 | | **显示** | `block` `inline` `inline-block` `hidden` `flex` `grid` `table` | 显示模式 | | **定位** | `static` `relative` `absolute` `fixed` `sticky` | 定位方式 | | **层级** | `z-0` ~ `z-50` | z-index | --- ## 📊 Flexbox 弹性布局 | 属性 | 类名 | 示例 | |:---|:---|:---| | 方向 | `flex-row` `flex-col` `flex-row-reverse` | 主轴方向...",8667,28,400,"2026-04-08 11:14:02",{"id":66,"title":67,"slug":68,"summary":69,"wordCount":70,"readingTime":71,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":72,"likeCount":18,"commentCount":18,"publishTime":73},"2039999965848203266","Vue 3 异步请求控制：串行与并行的优雅实践","vue-3-yibuqingqiukongzhichuanxingyubingxingdeyouyashijian","在 Vue 3 的开发中，处理异步请求是家常便饭。我们经常遇到这样的场景：需要等待一个或多个 API 请求完成后，才能进行下一步的数据处理或页面渲染。如何清晰、高效地控制这些请求的执行顺序，是构建健壮应用的关键。 本文将探讨在 Vue 3 中控制异步请求的两种核心模式：**串行执行**和**并行执行**，并结合 `async\u002Fawait`、`Promise.all` 等现代 JavaScript 特性，提供清晰、可维护的解决方案。 #### 🎯 场景一：串行执行，处理请求依赖 当一个请求的执行依赖于前一个请求的返回结果时，我们必须确保它们按顺序执行。例如，先获取用户 ID，再根据 ID 获取用户的详细信息和订单列表。 在 Vue 3 的 ` 加载中...",5219,17,388,"2026-04-03 17:34:26",{"id":75,"title":76,"slug":77,"summary":78,"wordCount":79,"readingTime":27,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":80,"likeCount":18,"commentCount":18,"publishTime":81},"2027264498228850690","SQL 性能避坑：为什么阿里强制禁用 ORDER BY RAND()？","sql-xingnengbikengweishenmealiqiangzhijinyong-order-by-rand","在阿里巴巴的《Java 开发手册》及众多高并发系统的数据库规范中，**`ORDER BY RAND()`** 被列为**强制禁止**的写法。这并非因为语法错误，而是因为它在数据量稍大时，会引发严重的性能问题，甚至导致数据库雪崩。 以下是其被禁用的核心原因、底层机制分析及推荐的替代方案： ### 1. 核心痛点：为什么 `ORDER BY RAND()` 是“性能毒药”？ 当执行 `SELECT * FROM table_name ORDER BY RAND() LIMIT N;` 时，MySQL 的执行过程极其低效，主要包含以下三个致命步骤： 1. **全表扫描与逐行计算**： MySQL 必须扫描表中的**每一行数据**，并为每一行调用一次 `RAND()` 函数生成一个随机数。这意味着即使你只需要 1 条数据，如果表里有 100 万行，它也要计算 100 万次随机数。 2.",2468,403,"2026-03-23 11:27:10",{"id":83,"title":84,"slug":85,"summary":86,"wordCount":87,"readingTime":88,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":89,"likeCount":18,"commentCount":18,"publishTime":90},"2010914302024806401","HashMap 是不是线程安全的？如果让你来实现一个线程安全的 HashMap 你要怎么设计？如果不用加锁你要怎么设计？","hashmap-shibushixianchenganquanderuguorangnilaishixianyigexianchenganquande-hashmap-niyaozenmeshejiruguobuyongjiasuoniyaozenmesheji","HashMap 的线程安全性是多线程编程中的一个重要问题，下面我将为你详细解答，并探讨线程安全 HashMap 的设计方案。 # 🔒 HashMap 的线程安全性分析 ## HashMap 的非线程安全本质 HashMap 在设计上**不是线程安全**的。当多个线程同时访问和修改同一个 HashMap 实例时，会导致不可预知的行为。 ### 并发环境下的主要问题： - **数据竞争**：多个线程同时执行 put\u002Fremove 操作可能导致数据丢失或覆盖 - **死循环**：在扩容过程中，多线程可能导致链表形成环，引发 CPU 100% 问题 - **大小不一致**：size() 方法返回的结果可能不准确 ### 特例分析 需要注意的是，当 HashMap 作为**方法内的局部变量**，且每个线程拥有独立实例时，不存在线程安全问题。 # 🛠️ 实现线程安全 HashMap 的设计方案 #...",4270,14,442,"2026-01-13 11:18:25",{"id":92,"title":93,"slug":94,"summary":95,"wordCount":96,"readingTime":97,"categoryId":15,"tags":16,"coverImage":16,"thumbnail":16,"status":17,"isTop":18,"isRecommended":18,"allowComments":18,"password":16,"viewCount":98,"likeCount":18,"commentCount":18,"publishTime":99},"2010884680939794434","Trie树介绍","trieshujieshao","### 🌲 Trie树的核心特性 Trie树有三个基本性质： 1. **根节点不包含字符**，它作为所有字符串的起点。 2. 从根节点到任意一个节点的路径上，经过的所有字符连接起来，就是该节点对应的字符串（或前缀）。 3. 每个节点的所有子节点所包含的字符都互不相同。 它的核心思想是 **空间换时间**，通过将字符串的公共前缀合并存储，避免了大量无谓的字符串比较，使得查询效率在很多情况下优于哈希表。 ### 🧱 结构与基本操作 一个典型的Trie树节点（TrieNode）通常包含两部分信息： * **子节点指针**：可以是固定大小的数组（如处理26个小写英文字母时使用长度为26的数组）或更灵活的映射（如`Map`），用于指向下一个字符节点。 * **结束标记**：一个布尔值（如`isEndOfWord`），标记从根节点到当前节点的路径是否构成了一个完整的单词（而不仅仅是前缀）。...",2273,7,441,"2026-01-13 09:20:39","42"]