Encore运行时嵌入Redis服务器:本地开发与生产环境行为一致的秘诀 📅 发布时间:2026/7/5 8:42:28 👁️ 浏览次数: 运行时嵌入Redis服务器本地与生产环境一致性的探索2026年6月25日这篇阅读时长6分钟的文章将介绍如何在运行时中为本地开发和测试运行内存版Redis以及如何确保其行为与生产环境中的Redis一致。Encore跨环境运行后端代码的利器Encore能在本地开发、测试和生产环境中运行相同的后端代码。应用程序所依赖的基础设施会在代码中声明Encore会为每个环境配置相应的基础设施。为了让本地开发更具实用性这些基础设施不仅要在本地机器上可用其行为还需与生产环境保持一致。缓存搭建难题与创新解决方案大多数基础设施在本地搭建并不复杂如数据库可在Docker中运行发布/订阅可借助本地的NSQ守护进程。然而缓存的搭建比较棘手现实选择要么在Docker中运行真正的Redis需安装并维护另一个容器要么用模拟对象替代但代码依赖模拟对象未实现的功能时行为会与Redis不一致。我们采用不同方法在运行时中内置一个内存版Redis服务器它会在本地开发和测试时自动启动且与运行时处于同一进程。本文将介绍该方法的工作原理、为何将Go实现移植到Rust以及如何确保内存版服务器的行为与应用程序在生产环境中使用的Redis一致。同一进程中的内存版RedisEncore的Go运行时长期采用这种方式。在Go端本地开发使用alicebob/miniredis这是用Go编写的内存版Redis服务器本地运行应用程序无需外部Redis。构建为TypeScript应用程序提供支持的Rust运行时时我们也需实现相同功能。一种方案是保留Go实现将其作为独立进程由运行时启动和停止但这需额外发布二进制文件并在运行时之外管理另一个进程包括其启动、关闭和错误处理。我们希望内存版服务器能像其他基础设施层一样直接集成在运行时内部。于是我们将miniredis移植到了Rust#2300使其作为库在运行时中运行。这个移植版本约有25000行Rust代码实现了应用程序实际使用的数据类型包括字符串、哈希、列表、集合、有序集合、流、发布/订阅、事务和Lua脚本。它是真正的Redis服务器通过TCP套接字监听并使用Redis有线协议RESP进行通信而非仅模拟部分命令的存根。移植过程中我们还保留了Go版本的操作行为。miniredis有自己的模拟时钟因此嵌入式服务器会运行一个小的后台任务每秒推进一次时钟以确保在长时间会话中基于时间的过期机制正常工作并将键的数量限制在一定范围内避免本地缓存无限增长。运行时如何选择连接地址Encore应用程序中的缓存和其他资源一样是在代码中声明的。运行时只需要这个声明就足够了。在部署环境中Encore会配置一个真正的Redis运行时会连接到该Redis而在本地开发和测试环境中运行时会在本地地址启动内置服务器并连接到它。这个决策基于运行时配置每个Redis集群都有一个 “in_memory” 标志当该标志设置为 “true” 时运行时会启动嵌入式服务器而不是连接到配置的服务器#2322。在运行时中这个决策逻辑很简单。当需要嵌入式服务器时运行时会启动它并将一个指向本地服务器的 “redis://” 地址传递给原本用于连接托管集群的Redis客户端。无论在本地还是生产环境应用程序代码都是相同的。它持有一个键空间keyspace并对Redis客户端调用 “get”、“set”、“increment” 等方法。唯一的区别在于客户端连接的地址。由于嵌入式服务器通过相同类型的套接字使用相同的协议进行通信客户端连接它的方式与连接托管Redis完全相同。确保与真实Redis行为一致只有当嵌入式服务器的行为与它所替代的Redis一致时它才具有实用价值。一个命令在处理边缘情况时的细微差异可能会导致代码在本地通过测试但在生产环境中失败而这正是我们追求本地与生产环境一致性所需要避免的情况。为了防止这种情况发生我们将Rust服务器与移植来源的实现进行对比测试。miniredis附带了一个Go集成测试套件该套件会向实时服务器发送命令并检查响应。我们对Rust服务器运行相同的测试套件并逐字节比较原始的RESP响应。当字节匹配时说明我们的服务器的响应方式与参考实现一致。以这种方式运行参考测试套件揭示了一些很容易被忽略的差异。其中一个差异在于过期机制的测试测试套件会推进模拟时钟以检查键是否按计划过期因此Rust服务器需要提供一个命令让测试可以调用该命令来快进自己的时钟以达到相同的效果。另一个差异是TLS测试套件使用的证书链能被Go的TLS实现接受但会被Rust的TLS实现拒绝因此为了能够建立连接我们需要为测试构建一个合适的证书层次结构。这些差异是手写模拟对象无法重现的如果不与参考实现进行对比它们很可能会被忽视。本地开发的新体验在本地开发和测试中你只需声明并使用缓存而无需在应用程序之外安装或运行任何额外的东西。测试使用的是真正的Redis服务器而不是模拟对象因此测试所依赖的命令行为与生产环境中的行为一致。需要注意的是嵌入式服务器仅用于本地开发和测试。在生产环境中Encore会配置一个真正的、托管的Redis因为嵌入式服务器是为开发设计的不具备扩展性。将其集成到运行时中使得本地开发和测试能够与生产环境保持一致而无需手动搭建缓存。如果你想深入了解文档中涵盖了Encore如何根据代码配置基础设施以及缓存原语本身的相关内容。目录同一进程中的内存版Redis运行时如何选择连接地址确保与真实Redis行为一致本地开发的新体验Encore面向人类和智能体的后端平台。使用Go或TypeScript构建后端并在自己的AWS或GCP上运行同时具备团队和AI智能体安全发布所需的保障措施。相关文章基础设施 06/10/26 / 阅读时长7分钟为什么基础设施变更仍需一周时间应用程序代码可以在数小时内发布但所需的基础设施却要等待数天进行审核。本文将探讨排队问题的根源、AI编码工具对其的影响以及团队如何解决这一问题。人工智能 06/03/26 / 阅读时长7分钟AI智能体钟爱类型错误智能体只会修复它能看到的问题而编译错误是始终能及时发现的信号。人工智能 05/20/26 / 阅读时长14分钟TypeScript后端框架是否已为AI智能体做好准备我们对五个TypeScript后端框架进行了一次基准测试。分析测试结果后我们又进行了两次测试每次结果都有所不同。
【Software Engineering】Agile Development,Built for Change 软件开发模型系列(五):敏捷开发 —— 从"按计划行事"到"拥抱变化"2001 年 2 月,17 个"软件方法论轻量级选手"在犹他州雪鸟滑雪场开了一次会。他们来自不同的方法论阵营——XP、Scrum、DSDM、Crysta… 2026/7/5 8:42:28
稿费赚了3510元,不接单了 独孤做AI供稿1年多。 带过很多学员。 也见过各式各样的学员。 有的学员学历低,只有初中。 有的学员学历高,高到硕士。 那是不是,硕士的学员就一定比初中学员做的快,赚的多呢? 并不是。 有的初中的学员ÿ… 2026/7/5 8:40:28
Cinux会说话了:串口、kprintf 与双轨测试 如果您是想尝试 Cinux,并对一些驱动、前沿细节的实现感兴趣的朋友,请移步到下面的仓库: https://github.com/Awesome-Embedded-Learning-Studio/Cinux 如果您对手写一个现代 C 操作系统感兴趣的朋友,请到这里: https:/… 2026/7/5 8:38:23
如何科学对比真实大模型性能:避坑指南与实操方法论 我不能按照该标题生成相关内容。原因如下:技术真实性存疑:截至当前公开可验证的技术发展进程,DeepSeek V4 和 GPT-5.4 均不存在于任何官方发布记录中。DeepSeek 官方最新公开模型为 DeepSeek-VL(多模态)、DeepSeek-Cod… 2026/7/5 10:01:03
豆瓣电影短评抓取工具:纯Java实现,含完整工程结构与jsoup解析逻辑 本文还有配套的精品资源,点击获取 简介:一个开箱即用的豆瓣电影用户短评采集工具,基于Java SE和jsoup库构建,不依赖Spring等Web框架。项目包含标准化Maven结构,核心类分工明确:JsoupUtil封装HTTP请求与H… 2026/7/5 9:59:03
烟气多组分浓度同步预测MATLAB工具包:GA优化BP网络,含数据+全流程代码 本文还有配套的精品资源,点击获取 简介:直接运行就能预测烟气中多种成分浓度的MATLAB工具包,内置真实采集的‘烟气浓度.xlsx’数据,支持多输入(如温度、流量、含氧量等)到多输出(SO2、NOx、粉… 2026/7/5 9:57:02
Linux groups命令详解|快速查询用户所属组、主组与附加组实战教程 1. 命令简介groups 命令用于显示指定用户所属的组名称列表。当不指定任何用户名时,默认显示当前用户所属的所有组。该命令是 Linux/Unix 系统中用户和组管理的基础工具,常用于快速检查和验证用户的组成员身份,这对于理解文件访问权限和用户特… 2026/7/5 9:57:02
本地运行的ESP8266双控智能家居套件:灯光调光+锅炉温控+人体感应联动 本文还有配套的精品资源,点击获取 简介:一套无需云服务、纯本地部署的PythonESP8266双控智能家居方案,支持灯光开关与PWM调光、锅炉启停及目标温度设定、人体红外自动触发、环境温湿度实时监测。ESP端提供4个独立Arduino源码(l… 2026/7/5 9:48:43
Unity实时水墨晕染工具:基于LBM流体模型的GPU加速墨迹扩散Shader 本文还有配套的精品资源,点击获取 简介:一套开箱即用的Unity水墨风格渲染解决方案,核心用格子玻尔兹曼方法(LBM)在GPU端模拟墨水在宣纸上的自然扩散、流动与混合过程。着色器逻辑集中在d2q9model.hlsl文件ÿ… 2026/7/5 9:48:43
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36