Redis高级特性实战:订阅、Pipeline、事务、布隆过滤器与LRU
很多人用 Redis 基本停留在缓存 分布式锁这两个场景顶多再拿 zset 做个排行榜。但 Redis 真正有意思的部分是那些平时不太用、用起来又容易踩坑的底层玩法。这篇是 Redis 实战系列的第四篇我把消息订阅、pipeline、事务、modules、布隆过滤器、缓存 LRU 这六个东西一次性聊透。它们有个共同特点单拎出来都只能解决一小类问题但组合在一起就是一套完整的Redis 高级特性武器库。这套东西适合谁负责高并发系统的后端开发、想优化缓存命中率的架构师、以及所有想把手里的 Redis 用到极致的人。我习惯把这些功能分成两类一类是减少开销的pipeline、LRU、事务都算另一类是扩展能力的消息订阅、modules、布隆过滤器属于这类。搞清楚这个分类你在设计方案时会少走很多弯路。下面直接就实战展开每个部分我都会把原理、坑点、代码一次性给全。1. 消息订阅先想清楚要不要用再动手1.1 发布/订阅的核心机制与真正的适用场景Redis 的 Pub/Sub发布/订阅是一个极简的广播系统。它只有三类角色发布者、订阅者、频道。发布者往频道里丢消息所有订阅了这个频道的客户端都能收到没人订阅时消息直接丢弃。没有存储、没有 ACK、没有重试这就是它的全部。用生活里的例子类比它像一个现场广播电台电台发布者只管对着麦克风说话谁在收音机前谁听到。你错过播报时间就再也听不到了。这个特性决定了它的适用场景必须满足三个条件实时性要求高、能容忍少量消息丢失、不需要消息堆积。比如在线状态通知、配置热更新广播、本地缓存失效通知都很合适。我见过有些团队拿它做订单超时通知结果订单服务一重启所有超时消息全丢最后还是要靠扫表兜底。这就是典型的场景误判。如果消息需要持久化、需要消费者组、需要离线补发请直接考虑 Redis Stream 或者专业消息队列Pub/Sub 不在这个赛道上。选型这一步想清楚后面就不会返工。1.2 订阅端的阻塞陷阱与消息格式还原先看最基本的代码。订阅端用 redis-py 这么写import redis r redis.Redis(host127.0.0.1, port6379, decode_responsesTrue) ps r.pubsub() ps.subscribe(order:pay) for message in ps.listen(): print(message)发布端只要一行r.publish(order:pay, {order_no:20241001,amount:99.9})这段代码能跑通但里面藏着一个新手必踩的坑订阅端在执行subscribe()之后这条连接就不能再执行普通命令了。listen()是个生成器会一直阻塞等待消息如果同一个连接上还有get、set之类的操作命令会被挂起表现就是程序卡死不动。所以订阅逻辑必须独占连接或者单独用一个线程/协程跑。我在生产环境里一般会把订阅封装成独立服务跟业务请求完全隔离。再看消息的data字段redis-py 返回的是字典结构其中channel是频道名data是消息内容。如果你开了decode_responsesTrue消息体是字符串如果没开就是 bytes直接拿去 JSON 解析会报类型错误。这里建议统一在客户端做一次解码别在业务代码里到处判断类型否则后期维护的时候会非常难受。另外模式订阅psubscribe(order:*)可以一次性订阅多个频道适合事件种类多但处理逻辑统一的场景。需要注意模式订阅和普通订阅的消息结构里channel和pattern字段不一样解析时要多加一层判断这是很多人排查半天找不到消息消失的原因之一。2. pipeline把一次网络往返变成一次网络往返2.1 RTT 开销与 pipeline 的合并原理Redis 是 TCP 协议客户端发一条命令服务端回一条响应。每次命令都要经历一次网络往返RTTRound-Trip Time。本地环境 RTT 可能只有 0.1ms看起来无所谓但跨机房、走公网时 RTT 能到 30ms 甚至更高。如果你循环执行 1000 条 set光网络等待就是 1000 × 30ms 30 秒这还没算 Redis 本身的执行时间。这就是 RTT 开销的恐怖之处。pipeline 做的事就是把一批命令在客户端攒起来一次性发到服务端再一次性读回所有响应。假设还是 1000 条 setRTT 变成 1 次时间从 30 秒降到 30ms 级别。这不是 Redis 服务端优化了多少纯粹是省掉了网络往返。所以 pipeline 最适合批量写入、批量读取、批量删除这类命令多、单条逻辑简单的场景。有个细节必须说清楚pipeline 不保证原子性。它只是把多条命令打包传输服务端还是逐条执行的执行到一半如果客户端断开前面执行的命令已经生效后面的就丢了。这与事务有本质区别别混淆。如果既要批量又要原子请看下一章的事务。2.2 实操代码与经典坑点redis-py 的 pipeline 用法import redis r redis.Redis(host127.0.0.1, port6379, decode_responsesTrue) pipe r.pipeline(transactionFalse) for i in range(10000): pipe.set(fuser:{i}:flag, 1) pipe.execute()注意这里transactionFalse设置的是非事务型 pipeline等于纯批量化传输。如果传True默认中间会包一层MULTI/EXEC虽然也是批量执行但会额外保证原子性开销略高。批量写入场景用transactionFalse就够了别默认都开事务。我在实际项目中还踩过两个坑。第一个是大批量命令导致内存暴涨pipeline 把 20 万条命令一次发出客户端缓冲区、服务端输入缓冲区都会受到冲击短时间内存翻倍。所以建议每批控制在 5000~10000 条之间分片提交。第二个是超大响应阻塞连接pipeline 里混入SMEMBERS、LRANGE这类可能返回百万级元素的大 Key 操作读取响应时会长时间占用连接阻塞后续业务。建议 pipeline 只放简单命令大 Key 单独处理。另外一个容易被忽略的点pipeline 与 Lua 脚本、事务三者有递进关系。单条命令没法合并思路pipeline 合并了传输但不保证原子Lua 脚本和事务既合并又原子。追求原子性时优先 Lua其次再考虑事务最后才轮到 pipeline 兜底。3. 事务Redis 事务和你想的不太一样3.1 MULTI/EXEC 的执行机制Redis 事务由MULTI、EXEC、DISCARD、WATCH四个命令组成。流程是客户端发送MULTI开启事务后续命令全部进入一个队列而不是立即执行直到发送EXEC服务端才按顺序执行队列里的所有命令。如果在事务开启后想放弃发DISCARD把队列清空即可。用代码看更直观pipe r.pipeline() pipe.multi() pipe.set(stock:1001, 99) pipe.incr(stock:1001) result pipe.execute()这两条命令会被打包在一个事务里执行要么都执行完要么中间出错时也不影响其他命令执行。注意这里的要么只是顺序保证不是原子性保证不Redis 事务确实是原子性执行EXEC一旦开始这个连接上的所有命令不会被其他请求插队。从这个角度看事务是原子的。但它和传统数据库事务最大的不同在于不支持回滚。3.2 为什么 Redis 不回滚以及 WATCH 的正确姿势只要有一条命令在入队阶段语法错误整个事务会被EXEC拒绝执行但如果命令在运行时出错Redis 不会终止整个事务也不会回滚之前已经执行的命令。比如先SET再LPOP一个字符串 KeyLPOP运行时抛错但SET已经生效了。官方给的理由很坦诚回滚会破坏 Redis 简单、快速的定位内部实现的复杂度和性能代价不成比例。所以使用 Redis 事务前必须把运行时错误必须靠代码兜底当成默认假设。具体做法是检查execute()返回的数组逐条对比每个元素是正常结果还是异常对象发现异常再做补偿。别指望像 MySQL 那样一个ROLLBACK解决。Redis 提供WATCH做乐观锁事务执行前先WATCH一个 Key如果EXEC时发现该 Key 被其他客户端修改过事务直接不执行返回nil。典型应用是库存扣减while True: with r.pipeline() as pipe: try: pipe.watch(stock:1001) stock int(pipe.get(stock:1001)) if stock 0: raise Exception(库存不足) pipe.multi() pipe.decr(stock:1001) pipe.execute() break except redis.WatchError: # 被其他客户端改了重试 continueWATCH非常适合先读后写且对并发要求高的场景。需要注意WATCH不能在不同连接之间共享状态每次开启事务前都要先WATCHEXEC执行完WATCH自动释放。3.3 事务和 Lua 脚本的取舍实战中我很少单纯用MULTI/EXEC做复杂业务逻辑更多是配合 Lua 脚本。核心原因是 Redis 官方把 Lua 脚本当成事务的加强版脚本里可以写判断、循环、条件分支而且执行过程中不会被其他命令打断具备原子性。一个典型的 Lua 限流或秒杀脚本能把多个命令的读写判断压缩成一个原子操作既减少网络往返又避免竞态。比如这个简化版的扣库存 Lua 脚本local stock tonumber(redis.call(GET, KEYS[1])) if not stock or stock 0 then return -1 end redis.call(DECR, KEYS[1]) return stock - 1在 redis-py 里通过script_load和evalsha执行。脚本出现业务异常时可用redis.call(DEL, KEYS[1])做补偿。我的建议是简单的事务场景用MULTI/EXEC涉及条件分支和回滚补偿的场景用 Lua 脚本。有人说事务 WATCH也能模拟条件分支但应对高并发时WATCH的冲突重试代价很高这个取舍要结合吞吐要求来定。4. modules 与布隆过滤器给 Redis 装上外挂4.1 modules 生态扩展 Redis 的正确姿势Redis Modules 是一套动态加载的扩展机制可以在不修改 Redis 核心的前提下新增数据结构、命令。最常用的几个模块包括布隆过滤器模块RedisBloom、JSON 处理模块RedisJSON、全文检索模块RediSearch、图数据库模块RedisGraph等。这些模块大多以动态链接库.so文件形式存在加载方式有两种。第一种是配置文件加载在redis.conf里加一行loadmodule /path/to/redisbloom.so然后重启 Redis。第二种是运行时加载MODULE LOAD /path/to/redisbloom.so MODULE LIST MODULE UNLOAD redisbloom运行时加载不用重启适合灰度测试但生产环境我还是建议写进配置文件保证 Redis 重启后模块自动恢复。用官方的一体化发行版Redis Stack可以直接内置常用模块省去手动编译的麻烦本地开发时特别舒服。模块属于 Redis 核心之外的第三方能力选型时要确认它会定期更新、与 Redis 版本兼容避免把整个缓存集群绑在一个没人维护的模块上。4.2 布隆过滤器原理与内存量化估算布隆过滤器是一个很节省内存的概率数据结构。它的核心是一个位数组和多个哈希函数。写入时把 key 经过 k 个哈希函数算出 k 个位置全部置为 1查询时同样算出 k 个位置只要有任意一个位是 0就说明 key 一定不存在而如果全部是 1只能说 key 可能存在。这就是宁可漏网、绝不误杀的反向过滤它可以明确排除不存在的 key但可能把不存在的 key 误判为存在。用在缓存场景里非常经典查询前先过一遍布隆过滤器如果 key 不存在就不去查数据库直接返回空这样能挡掉大量缓存穿透请求。为什么它省内存假设要存储 1000 万个 key如果直接用 Redis String 存每个 key 光键名加值就是几十字节轻松突破几百 MB用布隆过滤器在误判率 1% 的情况下只需要约 12 MB 左右差距明显。这里有公式可以算。假设容量为 n、期望误判率为 p则位数组大小 m -(n × ln p) / (ln 2)^2哈希函数个数 k (m / n) × ln 2代入 n 10,000,000p 0.01ln p -4.605ln2 ≈ 0.693可得 m ≈ -(10,000,000 × -4.605) / 0.4805 ≈ 95,800,000 bit约 11.4 MBk ≈ (95,800,000 / 10,000,000) × 0.693 ≈ 6.6取 7 个哈希函数。想要误判率降到 0.1%内存大约要增长到 17 MB 左右按需调整即可。实际使用中这个估算足够指导容量规划不需要精确到 byte。RedisBloom 里可以直接用命令创建并写入BF.RESERVE user_cache 0.001 10000000 BF.ADD user_cache user:1001 BF.EXISTS user_cache user:1001 BF.EXISTS user_cache user:9999BF.RESERVE第一个参数是 key第二个是误判率第三个是预估容量。不调用RESERVE直接用BF.ADD也可以但会使用默认参数误判率偏低且容量固定后续扩容麻烦。所以我建议一开始就显式RESERVE。容量规划时宁可稍微往大估因为布隆过滤器没法删除元素也不能简单扩容预估太小后期数据量上来后误判率会急剧上升。4.3 布隆过滤器的删除难题与集群部署注意点布隆过滤器最尴尬的问题是可以写入、可以查询但不能删除。位数组里的 1 可能是多个 key 共同叠加的结果强行置 0 会误杀其他 key。解决方案有几种一是定期重建比如按天生成 key过期后重建新的布隆过滤器二是用带计数的布隆过滤器Count Bloom或者布谷鸟过滤器Cuckoo Filter这类支持删除的变种。我对大多数业务场景的建议是优先接受不能删除这个限制设计时按时间分片简单可靠。集群部署下还有两个现实问题。第一如果使用集群模式布隆过滤器的 key 必须放在同一个哈希槽中而多条命令在写入时会分散到不同节点这要求客户端保证 key 路由一致性或者用hash tag把它们集中到一个槽位。第二布隆过滤器的误判率会随数据容量增长快速恶化监控上要加上误判率或容量告警尽早发现容量逼近上限的情况。见过一个团队把一天的访问量全塞进一个固定容量的过滤器一周后误判率失控缓存穿透又回来了最后只能半夜重建。这类问题预防的成本远低于收拾的成本。5. 缓存 LRURedis 能撑多少数据全看这块怎么配置5.1 从 maxmemory 到淘汰策略的完整参数大多数人和 LRU 打交道的起点都是 Redis 内存被打满后开始频繁淘汰 Key然后惊觉缓存命中率下降。要避免这种被动局面先搞清楚 Redis 这层完整的机制。首先是maxmemory参数它设定了 Redis 可以使用的最大内存。不设置64 位系统默认是 0也就是不限制但这样做非常危险——操作系统内存耗尽时Redis 进程会被系统直接杀死或者触发大量交换导致性能雪崩。生产环境必须显式设置比如maxmemory 512mb maxmemory-policy allkeys-lru maxmemory-samples 5maxmemory-policy是核心常见选项有noeviction达到上限后写入报错、volatile-lru只对设置了过期时间的 Key 做 LRU、allkeys-lru所有 Key 都参与 LRU、volatile-ttl淘汰剩余 TTL 最短的 Key等。这里有个典型误区很多人以为maxmemory等于缓存容量其实它是 Redis 的总内存限制包括数据本身、缓冲区和内部结构。给数据预留的内存要小于maxmemory一般建议至少留出 20%~30% 的富余否则大流量一来缓冲区膨胀直接触发淘汰风暴。maxmemory-samples 5是 Redis 实现近似 LRU的关键。它不会扫描全部 Key而是从所有 Key 中随机采样 5 个淘汰其中最久没被访问的那个。采样数越大淘汰结果越接近严格 LRU但扫描成本越高。并发量大的业务一般用 5~10 就够了不要为了更精准调到 20实测性能损耗很明显命中率提升却很有限。5.2 LRU 与 LFU 的选择逻辑严格来说Redis 默认的 LRU 是近似的不是真正的 LRU。如果你需要更精确地识别冷热数据Redis 4.0 之后引入了 LFULeast Frequently Used淘汰策略通过统计访问频率来判断冷热而不是只看最近一次访问时间。这两者的区别用一个场景就能讲明白某个 Key 昨天被大量访问今天完全没被访问。严格 LRU 会认为它是热点因为最近访问过LFU 会认为它已经冷了因为访问频率在衰减。听上去 LFU 更聪明但它也有自己的问题如果一个 Key 在短时间内被循环访问频率被拉高即使未来很久都不再访问它也会一直占着内存。而且 LFU 需要额外维护访问计数内存和 CPU 开销都比 LRU 高。我的建议是普通缓存场景用allkeys-lru如果存在明显的热点数据周期性变化或者想防止刷量导致的缓存污染才用allkeys-lfu。5.3 淘汰策略之外缓存穿透、击穿与 LRU 的配合把 LRU 配置好不等于缓存高可用它只是解决了内存不够时淘汰谁的问题。真正实战时要配合解决三个经典问题。缓存穿透指查询一个不存在的 Key每次都会打到数据库典型解法是布隆过滤器拦截也就是第四章的内容。缓存击穿指某个热点 Key 刚好过期大量请求同时穿透到数据库解法是加锁重建或设置热点 Key 永不过期 后台异步更新。缓存雪崩指大量 Key 同时过期或 Redis 不可用导致请求直接打到数据库解法是过期时间加随机偏移量并做好熔断降级。LRU 在这三者中扮演的角色是兜底资源水位。当 Redis 内存逼近上限时合理配置的 LRU 能保证最冷的数据先被淘汰给热点数据腾位置。但淘汰本身就是一种被动行为如果你发现命中率持续低于 80%不要只调maxmemory-samples该检查数据访问模型是否合理、是否有大 Key 占内存、是否存在把 Redis 当数据库用的场景。优化缓存命中率七分靠数据设计三分靠淘汰策略。6. 常见问题与排查技巧实录6.1 Pub/Sub 与 pipeline 高频问题速查消息订阅部分最典型的问题是客户端重启后收不到消息。Pub/Sub 本身不持久化订阅连接断开期间的任何消息都会消失排查时重点确认两点客户端断线重连后有没有重新subscribe在集群模式下发布和订阅是否在同一个节点。Redis 集群的 Pub/Sub 在旧版里是广播式的客户端连着其中一个节点也能收到其他节点的消息但不同版本行为有差异最好在压测环境里先验证清楚。pipeline 部分最常见的问题是返回结果顺序对不上。execute()返回的数组顺序与入队顺序一一对应但如果你在 pipeline 里混用了transactionTrue且中间某条命令报错返回结果会和预期出现偏差。排查时建议先打印返回数组的长度和内容定位到底哪一条命令异常。另一个高频坑是 pipeline 里塞入超时命令比如BLPOP这会让整条管道的执行时间拉长阻塞后续所有命令。记住原则任何带阻塞特性的命令都别放 pipeline。6.2 事务、布隆过滤器与 LRU 排查要点事务的坑最容易出现在回滚幻觉上。有的同学看到EXEC抛异常就以为事务整体没执行实际上 Redis 不会回滚之前的命令早生效了。排查方法是看execute()返回数组中每条命令的正常值或异常对象逐一确认。另外一个常见隐患是WATCH和事务之间还夹了其他命令执行这会导致WATCH失效或作用范围扩大建议把一个读-判-写流程完全收敛到同一个 pipeline 里。布隆过滤器排查时优先看两条容量是否接近上限、误判率是否符合预期。RedisBloom 有BF.DEBUG命令可以查看当前过滤器状态包括已插入数量和误判率预估线上出现穿透时先跑这条命令判断是不是过滤器满了。LRU 的排查更多看指标INFO stats里的evicted_keys是淘汰 Key 数如果这个值在快速上涨说明内存压力大优先扩容或优化 Key 大小而不是盲目调淘汰策略。6.3 一套环境初始化配置参考我整理了一份平时新环境部署 Redis 时的初始化配置适配大部分中小规模业务。直接贴出来方便作为底稿使用maxmemory 512mb maxmemory-policy allkeys-lru maxmemory-samples 10 appendonly no save lazyfree-lazy-eviction yes关闭持久化并禁止save是为了把 Redis 彻底当作纯缓存用避免磁盘和 fork 带来的性能抖动maxmemory-samples 10是我在命中率和性能之间的均衡点lazyfree-lazy-eviction yes开启后淘汰大 Key 时会在后台异步释放内存避免阻塞主线程。如果你的业务有强持久化需求需要另配 AOF 或 RDB这套配置就不完全适用了。常见问题排查我习惯先看几个指标INFO stats里的evicted_keys和keyspace_hits/missesINFO memory里的used_memory以及LATEST LATENCY之类的延迟监控。这些指标能快速告诉我内存是不是不够、淘汰是不是频繁、命中率是不是在恶化。问题定位清楚之后再按上面的思路区分调整参数、改造数据模型还是重新选型不要上来就拍脑袋改配置。我个人在实际项目里最深的体会是Redis 的这些高级特性单独用都不难难的是知道什么时候不该用。Pub/Sub 再好消息要持久化就得换方案pipeline 再快需要原子性时还得交给 LuaLRU 再省内存误判率失控时照样穿透。把这六个特性当作一套工具组合每类问题先判断属于减少开销还是扩展能力再决定拿哪一个工具上去基本不会跑偏。最后分享一个小技巧布隆过滤器和 LRU 其实是一对黄金搭档一个挡穿透一个保命中配合好了缓存系统的稳定性会有一个质的提升。

相关新闻

解析临时项目命名:从4324234 aiai 11看开发实践

解析临时项目命名:从4324234 aiai 11看开发实践

1. 项目概述"4324234 aiai 11"这个看似随机的字符串组合,实际上是一个典型的测试项目命名案例。在软件开发、数据科学和人工智能领域,我们经常会遇到这种临时性的项目代号。这类名称通常由数字和字母随机组合而成,主要用于内部开发…

2026/10/14 19:49:57 阅读更多 →
从数据库Schema到本体建模:语义升级的完整迁移指南

从数据库Schema到本体建模:语义升级的完整迁移指南

1. 为什么数据库 Schema 不是本体,但它是最好的起点1.1 关系模型的天花板:Schema 描述的是“表”,而不是“世界”最早接触本体建模,是在一个老项目的数据治理改造中。当时手里有一张跑了好几年的订单表,二十多列&#…

2026/10/14 19:49:57 阅读更多 →
Windows下用Python一行命令开Web Server:从基础到自定义

Windows下用Python一行命令开Web Server:从基础到自定义

说实话,在Windows上遇到“临时要开个网页服务”这种需求时,我从来不会去装什么重型程序。项目要做本地预览、同事要拷大文件、前端调接口要看CORS结果,这些场景我都是直接打开命令行,敲一条python -m http.server,完事…

2026/10/14 19:49:57 阅读更多 →

最新新闻

区间DP解“拿糖果”:从贪心误区到最优策略实战解析

区间DP解“拿糖果”:从贪心误区到最优策略实战解析

说实话,我第一次看到“拿糖果”这道题的时候,差点把它当成热身题给秒了。题面本身非常朴素:有 n 堆糖果排成一行,每堆糖果数量用一个整数数组表示,两个人轮流从最左端或最右端拿走一整堆,直到全部取完&…

2026/10/15 0:46:40 阅读更多 →
光通信技术突破:陶瓷封装与智能光功率控制解析

光通信技术突破:陶瓷封装与智能光功率控制解析

1. 光通信行业现状与易天定位光纤通信作为现代信息社会的基石,其市场规模在过去五年保持着年均12%的复合增长率。根据行业调研数据显示,2023年全球光模块出货量已突破1.8亿只,其中数据中心互连场景占比达到47%。在这个快速扩张的市场中&#…

2026/10/15 0:46:40 阅读更多 →
CEC2010到CEC2017:进化计算基准测试集完整指南与避坑经验

CEC2010到CEC2017:进化计算基准测试集完整指南与避坑经验

简介:面向进化计算与智能优化领域的研究者、工程师及高校学生,这份测试集汇总了CEC2010、CEC2013、CEC2014、CEC2015、CEC2017等历届单目标实参数优化竞赛的基准问题,可用于验证和对比各类新颖优化算法的寻优能力与收敛性能。压缩包内共516个…

2026/10/15 0:45:39 阅读更多 →
Z源逆变器仿真建模与PWM控制策略详解

Z源逆变器仿真建模与PWM控制策略详解

1. Z源逆变器概述与仿真意义Z源逆变器作为电力电子领域的重要拓扑结构,近年来在新能源发电、电动汽车和工业驱动等领域展现出独特优势。与传统电压源型和电流源型逆变器不同,Z源网络通过独特的阻抗网络实现了升降压功能,同时避免了传统拓扑中…

2026/10/15 0:45:39 阅读更多 →
普通程序员有没有必要学习 Agent 开发?从零手写 ReAct Agent 到 LangGraph 实战

普通程序员有没有必要学习 Agent 开发?从零手写 ReAct Agent 到 LangGraph 实战

一、先说结论:有必要,而且窗口期就在当下 如果你是一个每天写 CRUD、调接口、改 Bug 的普通后端 / 前端 / 全栈程序员,看到「Agent」「智能体」这些词,第一反应很可能是:“这不就是调一下大模型 API 吗?跟我…

2026/10/15 0:45:39 阅读更多 →
深入理解 Claude Code:CLAUDE.md、Hooks、Skills、Subagents 全解析

深入理解 Claude Code:CLAUDE.md、Hooks、Skills、Subagents 全解析

1. 引言 Claude Code 是 Anthropic 推出的命令行 AI 编程助手,它不仅能理解自然语言指令,还能通过一系列机制实现高度可定制、可扩展的自动化编码工作流。对于想要真正驾驭 Claude Code 的开发者来说,仅仅会提问远远不够,理解其四…

2026/10/15 0:45:39 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →