Elasticsearch 写入成功却搜不到的排查
Elasticsearch写入成功,并不意味着文档立即进入搜索结果。本文从一次“保存成功却搜不到”的场景出发,区分写入确认、搜索可见性与持久化,利用测试索引复现实时GET与搜索结果不一致的现象,并解释Refresh、Flush和translog的职责。随后梳理刷新参数、批量写入、索引别名、自定义路由和PIT视图中的误区,给出排查顺序、业务改造建议与可见性延迟监控方法,避免用强制刷新掩盖真正的问题。
这个话题下有 22 篇手记。
Elasticsearch写入成功,并不意味着文档立即进入搜索结果。本文从一次“保存成功却搜不到”的场景出发,区分写入确认、搜索可见性与持久化,利用测试索引复现实时GET与搜索结果不一致的现象,并解释Refresh、Flush和translog的职责。随后梳理刷新参数、批量写入、索引别名、自定义路由和PIT视图中的误区,给出排查顺序、业务改造建议与可见性延迟监控方法,避免用强制刷新掩盖真正的问题。
RabbitMQ 消息积压并不总能靠增加消费者解决。Ready 下降可能只是消息转为 Unacked,Prefetch 调大也不等于业务并发提升。本文从消息状态、确认语义与客户端排队入手,分析过度预取、下游容量不足及并发配置失效等原因,给出队列与通道诊断命令,并通过 PerfTest 设计对照实验。最后结合幂等处理、有限重试、资源预算和清空时间估算,建立以业务完成率及端到端延迟为核心的排障与调优方法。
Kafka传统消费者组把分区作为最小分配单位,消费者数量一旦超过分区数,多出的实例就只能空闲;逐条确认、失败重试、毒消息隔离和峰值扩容也往往需要业务自行补齐。Kafka 4.x引入Share Groups,以记录级获取锁替代分区独占,并提供ACCEPT、RELEASE、REJECT、RENEW四种处理结果,让多个消费者能够同时协作处理同一分区中的不同任务。本文结合Kafka 4.3.x,从工作原理、记录状态机、顺序与投递语义、Java客户端实现、关键配置、幂等设计、长任务续锁、保留策略和迁移步骤等方面展开,说明Share Groups适合哪些任务队列场景,又为何不能简单视为RabbitMQ等传统消息队列的完全替代品。
Valkey 9.1 已不再只是 Redis OSS 7.2 的兼容分支,而是在安全、可观测性、I/O 性能、内存效率和集群运维上形成独立路线。本文解析数据库级 ACL、Lua 模块化、TLS 热更新、JSON 日志、线程利用率指标、HGETDEL、MSETEX 与 CLUSTERSCAN 等变化,并结合 Java 客户端兼容、复制迁移、灰度切换、数据校验和真实压测,说明哪些 Redis 项目适合迁移、哪些场景需要谨慎,以及如何保留生产回滚能力。
博客搜索看似只是一次关键词查询,但真正可靠的搜索需要处理输入规范化、召回策略、排序逻辑、分页一致性、缓存隔离以及用户反馈等多个环节。本文记录一次真实的博客搜索重构过程:针对短关键词“AI”无法命中的问题,分析 MySQL 全文检索与模糊匹配叠加导致的召回缺陷,重新设计搜索契约,将字面匹配作为结果召回依据,全文检索作为排序辅助,同时完善 URL 编码、分页边界、空结果状态和自动化测试。通过这次改造,搜索功能从“偶尔能用”变成了一条行为明确、结果稳定、可持续演进的搜索链路。
实现基于微信公众号验证码的文章解锁功能:未关注用户仅能阅读文章前1/3,底部“查看全文”引导关注;关注后发送关键词“博客”即获6位数字验证码,验证码存入Redis(5 分钟有效、单次使用),前端通过 CSS max‑height 与渐变遮罩实现内容截断。用户验证成功后在浏览器 LocalStorage 标记全局解锁状态,实现全站解锁。后端采用 Spring Boot 提供验证码生成/验证 API 与微信消息处理接口,配合 Redis 保存验证码,整体架构为 浏览器 ↔ Spring Boot ↔ Redis ←→ 微信服务器。实现步骤包括 Redis 配置、验证码服务实现、微信接入及前端交互逻辑。
本文详细演示了在已装 Docker 的服务器上,使用 Docker 部署单节点 Elasticsearch(7.12.1)和 Kibana(7.12.1),包括创建专用网络、加载镜像、配置容器参数及端口映射。随后通过 Kibana 的 DevTools 界面验证 ES 连接,并使用 MyBatis‑Plus 编写 Java 示例代码,将 MySQL 中的酒店数据批量转换为文档(HotelDoc),利用 RestHighLevelClient 的 BulkRequest 写入名为 hotel 的索引。最终在 Kibana 页面成功展示导入的数据,实现 MySQL 数据在 Elasticsearch 与 Kibana 可视化的完整流程。
Redis在Java项目中常见的穿透、击穿、雪崩等缓存问题,可通过布隆过滤、互斥锁或逻辑过期、随机TTL等手段防御;为保证缓存与库的一致性,采用延迟双删或基于消息队列的最终一致方案;大key导致内存压力时,可拆分分片或使用合适的数据结构;通过配置allkeys‑lru、合理的maxmemory‑policy 以及 Jedis 连接池的 maxTotal、maxIdle、testOnBorrow 等参数,提升内存管理和连接稳定性。整体提供了代码示例和实践要点,帮助开发者在实际使用 Redis 时避免性能瓶颈和数据错误。
本文提供 Redis 6 标准配置文件示例,说明如何通过命令行加载配置、单位写法以及包含其它文件的用法。列出模块加载方式、网络参数(bind、protected‑mode、端口、tcp‑backlog、unix‑socket、连接超时、keepalive)及其安全警示。重点介绍 TLS/SSL 配置,包括启用 tls‑port、证书/私钥文件、客户端证书、DH 参数、CA 证书及客户端认证模式。整体展示各项可选指令的作用与最佳实践。
本文提供在 CentOS 7 上一步步安装 JDK 8、MySQL 8、Redis 6 与 Nginx 的完整指南。包括卸载旧 Java、使用 yum 安装 OpenJDK 并配置环境变量;添加阿里云和 MySQL 官方仓库、安装并启动 MySQL、开放 3306 端口;安装编译依赖后源码编译 Redis、编辑配置、创建 systemd 服务实现开机自启;通过 epel 安装 Nginx、设置开机启动、检查状态并放通 HTTP/HTTPS 防火墙端口。
文章介绍了在 SpringBoot 中通过 @Document 的 EL 表达式实现 Elasticsearch 按日期动态创建索引的完整方案。核心思路是把索引后缀(如 yyyy_MM_dd)封装为 Bean(esIndex),并在每天零点的定时任务中销毁旧 Bean、重新注册新值,同时手动调用 ElasticsearchRestTemplate 创建索引,以保证 shards、replicas 等配置不丢失。实体类需声明 createIndex = false,避免自动创建导致参数缺失;示例代码包括配置类、实体、Repository 与 Controller,演示了定时更新索引和保存数据后在 Kibana 中观察新索引的效果。
在 Windows 10 上部署 EMQX 时,直接运行 `emqx start` 会报 “Unable to load emulator DLL”。原因是缺少 Erlang/OTP 运行时。解决办法是先从 Erlang 官方或阿里云盘下载安装 Erlang/OTP,完成后重新打开命令行,进入 EMQX 的 `bin` 目录执行 `emqx install`。安装成功后再执行 `emqx start`,即可在浏览器访问 `http://127.0.0.1:18083`,使用用户名 `admin`、密码 `public` 登录。完成后可通过 `emqx stop` 停止服务。