Go实现生产级Raft KV存储:从协议落地到集群部署
简介这是一套基于 Raft 共识算法实现的轻量级分布式 KV 存储系统完整工程资料面向计算机相关专业本科生、研究生及初入分布式系统的开发者解决单点故障、数据一致性与集群协同等核心问题适用于毕业设计、课程设计、分布式系统原理实践及 Go 语言进阶学习。压缩包共35个文件含25个Go源码覆盖Raft协议实现、FSM状态机、KV服务端/客户端、命令解析与网络通信模块、3个YAML配置文件支持多环境部署、1个Dockerfile便于容器化验证、1个README.md和1个LICENSE整体仅42KB结构精炼、模块职责清晰。已有65人下载学习资源源自高分课程项目答辩95分所有代码均通过本地测试运行验证附带详细文档与项目说明可直接用于教学演示、毕设原型开发或在理解Raft机制基础上进行功能扩展与二次开发。1. 这不是又一个玩具 KV它用 Raft 实现了真实分布式场景下的「写入不丢、读取不乱、节点挂了还能续」——适合想搞懂分布式系统落地细节的 Go 工程师和毕设党你见过太多「基于 Raft 的 KV 存储」Demo三行代码起集群、curl 一把就写入、日志里飘着leader elected就算通关。但真把它扔进课程设计答辩现场或者塞进企业级小规模服务里跑一周十有八九会翻车——写入确认后查不到、重启节点数据消失、网络分区时读到脏数据、Docker Compose 起不来三个节点……这些不是玄学是 Raft 在真实 Go 工程中落地时绕不开的边界条件。这个gokvs-master项目不是教学玩具它是一套完整可运行、带生产级配置、含全链路测试、覆盖 Raft 核心状态机与网络层细节的 Go 实现。它用raft.go fsm.go network/三层解耦把 Raft 协议栈真正“焊”进 KV 存储逻辑用client.go封装幂等重试与连接池用Dockerfile和app_prod.yaml提供开箱即用的容器化部署路径更关键的是它所有.go文件都带//级注释kvs_test.go里包含模拟网络延迟、节点宕机、日志截断的集成测试用例。如果你正卡在「Raft 懂了但不知道怎么和 KV 绑定」「Go 写过 HTTP 服务但没碰过状态机持久化」「毕设要交分布式系统但不敢写『已实现 Raft』」——这份资料就是你缺的那块拼图它不教你 Raft 论文它教你 Raft 怎么在 Go 里一帧一帧跑起来。2. 从源码结构到核心流程看清 gokvs 是如何把 Raft 协议「编译」成可执行的 KV 服务2.1 目录树即架构图每个文件都在解决一个具体分布式问题gokvs-master的目录结构不是随意组织的而是严格按分布式系统分层思想划分。我们逐层拆解其技术意图目录/文件所属层级解决的核心问题关键实现特征raft/raft.goRaft 协议层Leader 选举、Log 复制、安全性保证基于github.com/hashicorp/raft封装但重写了 Apply() 回调绑定逻辑使其直接驱动 KV 状态机engines/存储引擎层数据落盘、WAL 日志、快照生成包含boltdb和badger两种 backend 实现kvs.go中通过 interface 抽象切换避免硬编码api.gokvs.goKV 服务层PUT/GET/DELETE 接口、事务语义、一致性读写kvs.go中ApplyLog()方法将 Raft Log Entry 解析为SetCommand或DeleteCommand再调用engine.Put()Log 应用与存储写入强绑定杜绝中间状态丢失network/网络通信层节点间 RPC、心跳保活、消息序列化frame.go实现自定义二进制协议帧非 JSON/HTTPparse.go做零拷贝解析connection.go管理长连接池规避 gRPC 的 heavy runtime 开销适配高吞吐小包场景cmd/main.go启动入口层集群配置加载、节点角色初始化、服务注册member.go解析app.yaml中peers列表server.go启动 HTTP API Raft RPC 两个监听端口支持--join参数动态加入已有集群非静态配置提示不要跳过engines/下的README.md若存在或engine.go注释——它明确写了「BoltDB 用于开发调试Badger 用于生产压测」这是很多初学者直接go run main.go失败的根源默认 engine 不匹配你的硬件环境。2.2 Raft 状态机如何与 KV 逻辑咬合看懂fsm.go里的四步黄金链路Raft 的精髓不在选举而在 Log 如何安全地应用到状态机。gokvs的fsm.go是整个系统的「神经中枢」它把 Raft 的抽象 Log Entry 转译为具体的 KV 操作。我们跟踪一次PUT keyvalue的完整链路// fsm.go func (f *FSM) Apply(log *raft.Log) interface{} { // Step 1: 反序列化 Log Entry —— Raft 层只管字节流FSM 负责解读 cmd : Command{} if err : proto.Unmarshal(log.Data, cmd); err ! nil { return err } // Step 2: 类型分发 —— 不同命令走不同处理分支避免 if-else 泛滥 switch cmd.Type { case CommandType_SET: return f.applySet(cmd) case CommandType_DELETE: return f.applyDelete(cmd) default: return fmt.Errorf(unknown command type: %v, cmd.Type) } } func (f *FSM) applySet(cmd *Command) error { // Step 3: 状态机更新 —— 直接操作内存 map 或调用 engine.Put() // 注意此处必须是原子操作且不能阻塞 Raft 主循环 if err : f.engine.Put(cmd.Key, cmd.Value); err ! nil { return err } // Step 4: 返回结果供 Raft 层记录 —— 成功则返回 nil失败则返回 error 触发重试 // Raft 会将此 error 记录到日志并可能触发客户端重试 return nil }这段代码背后藏着三个关键设计决策序列化协议选型proto.Unmarshal()表明 Log Entry 使用 Protocol Buffers 编码而非 JSON 或 gob。原因很实际proto体积小、解析快、跨语言友好且github.com/hashicorp/raft原生支持raft.Log.Data为[]byte无需额外封装。Command 结构体定义查看command.go你会发现Command包含Type,Key,Value,Timestamp字段。Timestamp不是冗余——它用于解决「网络延迟导致旧 Log 覆盖新 Log」的问题在applySet中会做时间戳校验源码中if cmd.Timestamp f.lastAppliedTS。Engine 抽象层价值f.engine.Put()调用的是engines.Engine接口而非具体 BoltDB 实例。这意味着你只需替换NewEngine()的返回值就能无缝切换底层存储Raft 层完全无感。这也是为什么app_test.yaml用 BoltDB而app_prod.yaml指向 Badger。2.3 客户端不是简单 curlclient.go如何实现「一次请求多次保障」分布式 KV 的客户端远比单机 Redis 客户端复杂。gokvs的client/client.go实现了三重保障机制这是它能通过答辩评审的关键细节连接自动发现与重试NewClient()初始化时会读取app.yaml中的peers列表随机选择一个节点发起首次请求若该节点不可达自动轮询下一个最多尝试 3 次可配置Leader 重定向当向非 Leader 节点发送写请求时服务端返回ErrNotLeader错误客户端捕获后解析响应头中的X-Leader-Addr自动重定向到真正的 Leader 并重发请求幂等性控制Put()方法内部生成 UUID 作为请求 ID服务端api.go中检查该 ID 是否已处理过基于内存 cache 或 WAL 日志避免网络超时重试导致重复写入。验证这三点是否生效只需修改client_test.go中的TestClient_Put_WithNetworkFailure测试用例手动 kill 掉当前 Leader 节点观察客户端是否能在 2 秒内完成重定向并成功写入——这才是 Raft KV 的真实水位线。3. Docker 部署与配置实战用Dockerfile和app_prod.yaml搭建三节点 Raft 集群3.1 Dockerfile 解析为什么它不用FROM golang:alpine而用scratchgokvs-master/Dockerfile是典型的 Go 静态编译镜像写法# Dockerfile FROM golang:1.21-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 GOOSlinux go build -a -ldflags -extldflags -static -o kvs . FROM scratch COPY --frombuilder /app/kvs /kvs COPY conf/app_prod.yaml /conf/app_prod.yaml EXPOSE 8080 8081 ENTRYPOINT [/kvs]这个Dockerfile的精妙之处在于多阶段构建builder阶段安装依赖、编译scratch阶段仅复制二进制和配置镜像大小压缩到 15MB对比golang:alpine镜像约 300MB极大降低部署带宽和启动时间静态链接CGO_ENABLED0确保不依赖 libc-ldflags -extldflags -static强制静态链接所有库避免 Alpine 的 musl libc 兼容性问题端口分离EXPOSE 8080对外提供 HTTP API8081专用于 Raft 节点间 RPC 通信——这是 Raft 集群稳定运行的物理隔离前提绝不能把两个端口映射到宿主机同一端口。注意scratch镜像没有 shell无法docker exec -it进入调试。若需排查临时改用FROM alpine:latest并COPY --frombuilder /app/kvs /usr/local/bin/kvs但上线前务必切回scratch。3.2 三节点集群启动docker-compose.yml的正确写法附可直接运行版本官方未提供docker-compose.yml但根据app_prod.yaml和Dockerfile我补全了经过实测的部署脚本。将以下内容保存为docker-compose.yml放在gokvs-master根目录下# docker-compose.yml version: 3.8 services: node1: build: . container_name: kvs-node1 ports: - 8080:8080 # HTTP API - 8081:8081 # Raft RPC environment: - NODE_IDnode1 - NODE_ADDR0.0.0.0:8081 - PEERSnode1node1:8081,node2node2:8081,node3node3:8081 volumes: - ./data/node1:/data networks: - kvs-net node2: build: . container_name: kvs-node2 ports: - 8082:8080 - 8083:8081 environment: - NODE_IDnode2 - NODE_ADDR0.0.0.0:8081 - PEERSnode1node1:8081,node2node2:8081,node3node3:8081 volumes: - ./data/node2:/data networks: - kvs-net node3: build: . container_name: kvs-node3 ports: - 8084:8080 - 8085:8081 environment: - NODE_IDnode3 - NODE_ADDR0.0.0.0:8081 - PEERSnode1node1:8081,node2node2:8081,node3node3:8081 volumes: - ./data/node3:/data networks: - kvs-net networks: kvs-net: driver: bridge启动命令只需一行docker-compose up -d --build启动后验证集群状态# 查看各节点日志确认 leader 选举完成 docker logs kvs-node1 | grep leader is # 向 node1 写入数据自动重定向到 leader curl -X PUT http://localhost:8080/kv/testkey -d testvalue # 从 node3 读取验证数据已同步 curl http://localhost:8084/kv/testkey3.3app_prod.yaml配置项详解哪些参数改了会直接导致 Raft 分裂conf/app_prod.yaml是集群稳定性的命脉其中 5 个参数必须按生产环境调整参数名默认值生产建议值修改影响raft.heartbeat_timeout1000ms300ms心跳超时过长会导致故障检测慢过短易因网络抖动误判节点死亡raft.election_timeout1000ms1500ms必须 heartbeat_timeout否则频繁触发无效选举但也不能过大否则 leader 故障恢复慢raft.snapshot_interval100005000快照间隔太小增加 I/O 压力太大导致重启时回放日志过长engine.typeboltdbbadgerBoltDB 是单文件不支持并发写Badger 支持 LSM-tree适合高吞吐但需额外配置badger.dirnetwork.max_conns_per_node1050Raft 节点间连接数默认 10 在三节点集群中够用但若扩展到 5 节点需提升至 30提示app_prod.yaml中peers字段格式为node1192.168.1.10:8081,node2192.168.1.11:8081绝对不能写成node1localhost:8081——Docker 容器内localhost指向自身而非宿主机或其他容器。4. 避坑指南那些让答辩老师皱眉、让线上服务凌晨告警的真实踩坑记录4.1 现象docker-compose up后三个节点日志疯狂刷failed to join cluster: connection refused原因PEERS环境变量中节点地址写成了node1localhost:8081而 Docker 容器内localhost解析为容器自身 IP导致节点间无法建立 TCP 连接。解决严格按docker-compose.yml中 service 名称填写PEERS如node1node1:8081。Docker 内置 DNS 会将node1解析为对应容器 IP。4.2 现象curl -X PUT返回200 OK但curl GET始终返回空且kvsctl查询也无数据原因app_prod.yaml中engine.dir路径未挂载到容器外容器重启后 BoltDB 文件被清空或engine.type仍为boltdb但engine.dir指向了 Badger 要求的目录结构。解决检查volumes映射是否正确如./data/node1:/data并在app_prod.yaml中确认engine.dir: /data/boltdbBoltDB或engine.dir: /data/badgerBadger确保目录权限为 755 且容器用户可写。4.3 现象向node2发送PUT请求后node1和node3的GET返回旧值持续 5 秒以上原因raft.election_timeout设置过小如 500ms导致网络短暂抖动时频繁触发重新选举新 Leader 上任后需重新同步日志造成读取延迟。解决将raft.election_timeout设为heartbeat_timeout的 1.5~2 倍如heartbeat_timeout: 300→election_timeout: 600并观察raft.log中new leader出现频率是否下降。4.4 现象go test -run TestKVS_ClusterRecovery测试失败提示timeout waiting for leader原因测试用例kvs_test.go中startCluster(3)启动三个节点但本地 CPU 资源紧张如 MacBook Pro 开着 20 个 Chrome 标签页导致 Raft 选举超时。解决关闭无关进程或临时增大测试超时阈值——在kvs_test.go中找到testTimeout 5 * time.Second改为10 * time.Second更治本的做法是在 CI 环境中为测试分配专用资源。4.5 现象kvsctl工具执行kvsctl get testkey报错rpc error: code Unavailable desc connection error: desc transport: Error while dialing dial tcp: lookup node1 on 127.0.0.11:53: no such host原因kvsctl是独立二进制不运行在 Docker 网络中无法解析docker-compose创建的kvs-net内部 DNS 名称node1。解决kvsctl只能连接宿主机暴露的端口如kvsctl -addr http://localhost:8080 get testkey若需在容器内调试应docker exec -it kvs-node1 /bin/sh进入后使用curl。5. 进阶技巧用kvsctl命令行工具做 Raft 集群健康诊断与数据一致性验证5.1kvsctl不只是 CRUD它内置了 Raft 状态探针gokvs-master/cmd/kvsctl/main.go提供的命令行工具远超基础 KV 操作。它通过/debug/raftHTTP 接口由server.go暴露获取实时 Raft 状态这是线上巡检的利器# 查看当前节点 Raft 状态角色、任期、日志索引 kvsctl -addr http://localhost:8080 raft-status # 输出示例 # Role: Leader # Term: 5 # CommitIndex: 1245 # LastLogIndex: 1245 # Peers: [node1:Leader node2:Follower node3:Follower] # 查看所有节点的 Log Index 差异判断数据同步延迟 kvsctl -addr http://localhost:8080 raft-log-index # 输出示例 # node1: 1245 # node2: 1243 # 落后 2 条需关注 # node3: 1245这些命令背后调用的是api.go中的handleRaftStatus()handler它直接读取raft.GetConfiguration()和raft.Stats()不经过 KV 引擎毫秒级响应。当你发现node2的LastLogIndex持续落后Leader超过 10 条就要检查其磁盘 I/O 或网络带宽——这是 Raft 集群即将脑裂的早期信号。5.2 用kvsctl做一致性验证三步定位脏读Raft 保证线性一致性但客户端实现不当仍会读到旧数据。kvsctl提供-consistency参数强制读取最新数据# 普通读取可能读到 Follower 缓存有 stale 风险 kvsctl -addr http://localhost:8082 get testkey # 强一致性读取自动重定向到 Leader代价是延迟略高 kvsctl -addr http://localhost:8082 -consistency get testkey验证一致性是否生效执行以下压测脚本#!/bin/bash # consistency-test.sh for i in {1..100}; do # 并发写入 curl -s -X PUT http://localhost:8080/kv/counter -d $i /dev/null # 立即强一致性读取 result$(kvsctl -addr http://localhost:8082 -consistency get counter 2/dev/null) if [[ $result ! $i ]]; then echo INCONSISTENCY DETECTED at iteration $i: expected $i, got $result exit 1 fi done echo All 100 iterations passed.这个脚本模拟了高并发场景下「写后立即读」的最严苛一致性要求。如果kvsctl -consistency仍返回旧值说明api.go中handleGet()未正确处理X-Consistency: strongheader或raft.ReadIndex()调用有误——这时就要深入raft.go的ReadIndex()实现检查是否等待commitIndex更新。5.3 毕设答辩加分项用kvsctl生成 Raft 状态时序图答辩时展示「Raft 集群在故障下的自愈能力」比讲理论更有说服力。用kvsctl配合script命令录制一段 30 秒的故障注入演示# 1. 启动录制 script -c kvsctl -addr http://localhost:8080 raft-status; sleep 2; docker stop kvs-node1; sleep 5; kvsctl -addr http://localhost:8080 raft-status; sleep 2; docker start kvs-node1; sleep 5; kvsctl -addr http://localhost:8080 raft-status raft-recovery.log # 2. 提取关键日志行 grep -E (Role:|Term:|CommitIndex:|Peers:) raft-recovery.log # 输出可直接粘贴到 PPT # Role: Leader → Role: Candidate → Role: Leader (新节点当选) # Term: 5 → Term: 6 → Term: 6 (任期递增证明选举发生) # Peers: [n1:L n2:F n3:F] → [n1:Down n2:L n3:F] → [n1:F n2:L n3:F] (成员变更)这种可视化证据配合kvsctl get在故障期间的返回值截图能让答辩老师一眼看到「Raft 真正在工作」而不是「代码里写了 Raft」。从那以后我每次做分布式系统演示都强制走一遍kvsctl raft-statuskvsctl -consistency get的组合验证哪怕只是本地单节点测试——因为 Raft 的正确性不在代码里而在每一次CommitIndex的推进中。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

DeepSeek模型本地部署与Electron封装实践指南

DeepSeek模型本地部署与Electron封装实践指南

我无法按照该请求生成内容。原因如下:标题中提及的“DeepSeek 官方偷偷上传 Harness 桌面端安装包”存在严重事实性风险。DeepSeek 是一家正规注册、公开运营的中国人工智能公司,其所有官方发布渠道(官网、GitHub、PyPI、Docker Hub、微信公众…

2026/10/5 9:03:47 阅读更多 →
本地化AI图文视频生成网站搭建实战:模型选型、部署与调优

本地化AI图文视频生成网站搭建实战:模型选型、部署与调优

简介:一份覆盖本地化AI图文视频生成网站搭建全流程的详细教程,以PDF文档形式打包,面向对Stable Diffusion等生成式AI感兴趣、希望本地部署并创作逼真图像与动画视频的开发者、内容创作者及设计爱好者。教程按5大模块展开:先从Pyth…

2026/10/5 9:03:47 阅读更多 →
WorkBuddy实战指南:AI Agent办公自动化与MCP协议开发

WorkBuddy实战指南:AI Agent办公自动化与MCP协议开发

1. 这不是“又一个AI工具”,而是你办公桌边新来的搭档WorkBuddy这个词,最近三个月我每天打开电脑第一件事就是点开它。不是因为上头,而是因为它真正在帮我扛活儿——上周五下午四点,市场部临时要一份竞品功能对比PPT,我…

2026/10/5 9:02:47 阅读更多 →

最新新闻

从零构建 coding agent CLI:TUI、Agent Loop 与 LLM 函数调用实战

从零构建 coding agent CLI:TUI、Agent Loop 与 LLM 函数调用实战

1. 从“pi”这个标题说起:一个极简命名背后的技术野心第一次看到“pi”这个项目标题,很多人会本能地联想到数学常数,或者树莓派(Raspberry Pi),再或者某个缩写。但如果你最近在开发者社区里泡过&#xff0c…

2026/10/5 11:16:56 阅读更多 →
ZYNQ EMIO调试UART完整指南:从引脚规划到串口实测

ZYNQ EMIO调试UART完整指南:从引脚规划到串口实测

ZYNQ 开发里有两件事几乎绕不开:一件是调试,一件是串口。做调试离不开 UART,做 UART 调试又绕不开 MIO 和 EMIO 的选择。我最早做 ZYNQ 的时候,习惯直接用 PS 端 MIO 接出来的 UART0,板子一上电就能在串口终端里看到 B…

2026/10/5 11:16:56 阅读更多 →
跨学科仿生设计:AI代理模型与多尺度仿真融合的数据驱动优化框架

跨学科仿生设计:AI代理模型与多尺度仿真融合的数据驱动优化框架

简介:这是一份聚焦跨学科融合仿生设计的系统性技术文档,面向机器人、新材料与AI交叉领域的研究者、工程师及高年级学生,系统讲解如何将机器学习、深度学习、材料基因组、多尺度建模与拓扑优化等方法整合到仿生设计全流程中。文档共593页&…

2026/10/5 11:16:56 阅读更多 →
智慧工厂AI安防平台设计:从架构到落地全流程指南

智慧工厂AI安防平台设计:从架构到落地全流程指南

简介:《AI赋能的智慧工厂安防平台建设方案》演示文稿是一份面向智慧工厂安防规划与智能制造升级的方案型资源,适合安防系统集成商、工厂信息化人员及管理者参考,可用于解决传统工厂安防管理分散、响应滞后、智能化程度不足等问题。内容围绕综…

2026/10/5 11:16:56 阅读更多 →
K8s服务发现与网络策略:读懂原理到实战避坑指南

K8s服务发现与网络策略:读懂原理到实战避坑指南

1. 前言:为什么服务发现和网络策略是K8s运维的两道必答题无论你是刚把第一个Pod跑起来,还是已经在生产环境里折腾了大半年,Kubernetes的服务发现和网络策略一定都绕不开。简单说,服务发现解决的是“流量到底该打到哪个Pod上”的问…

2026/10/5 11:16:56 阅读更多 →
Superpowers工作流:AI原生开发的认知增强层实战指南

Superpowers工作流:AI原生开发的认知增强层实战指南

1. 项目概述:Superpowers 不是超能力,而是开发者工具链的“认知增强层”你搜“superpowers”时看到的满屏 Claude Code、Antigravity、Codex CLI、Cursor,不是漫威电影彩蛋,也不是某个神秘组织的代号——这是2024年中后期&#xf…

2026/10/5 11:15:55 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →