Redis内存满时,应先通过配置文件或命令设置maxmemory限制,并启用LRU等淘汰策略;Windows下需替换为64位redis-server.exe以解决地址空间不足导致的启动失败问题。

phpEnv 本身不控制 Redis 内存分配,它只是启动 Redis 进程的容器;真正卡住的是 Windows 下 redis-server.exe 启动时的内存映射行为 —— 尤其当 maxmemory 设得较大(比如 ≥1GB)但系统未预留足够虚拟地址空间时,会直接静默失败或报错 Failed to allocate memory for the heap。
redis-server.exe 在 Windows 上启动就崩溃,没日志也没端口监听
这是最典型的症状:你双击 redis-server.exe redis.windows.conf 或用 phpEnv 的服务按钮启动,窗口一闪而过,任务管理器里看不到进程,6379 端口也不占用。
根本原因不是物理内存不够,而是 Windows 32 位子系统限制(即使你在 64 位系统上运行)—— redis-server.exe 默认是 32 位 PE 文件,其用户态虚拟地址空间上限约 2GB(实际可用常不到 1.5GB)。当你在 redis.conf 里设了 maxmemory 2gb,Redis 启动时尝试预分配大块内存页,但地址空间碎片化或已占用过高,VirtualAlloc() 失败,进程直接退出。
- 检查方式:用命令行启动并加
--loglevel verbose,看是否输出Can't allocate memory for the heap或类似提示 - 临时验证:把
maxmemory改成512mb,再试 —— 如果能起来,基本锁定是地址空间问题 - 不要依赖 phpEnv 的“一键启动”界面,它不暴露 stderr 输出,必须手动命令行调试
用 64 位 redis-server.exe 替换 phpEnv 自带的 32 位版本
phpEnv 自带的 Redis 通常是微软旧版(MicrosoftArchive/redis),只提供 32 位二进制。你需要手动替换为真正支持大内存的 64 位构建:
立即学习“PHP免费学习笔记(深入)”;
- 去 tporadowski/redis 下载最新
Redis-x64-*.zip(注意不是 MicrosoftArchive 那个) - 解压后,把里面的
redis-server.exe、redis-cli.exe、redis.windows.conf覆盖到 phpEnv 的Redis目录下(路径类似C:\phpEnv\Redis\) - 编辑
redis.windows.conf,确保maxmemory明确设置(例如maxmemory 2gb),且maxmemory-policy不是noeviction(否则写入超限直接报错) - phpEnv 的服务管理功能仍可使用,但它调用的就是你刚换掉的那个
redis-server.exe
phpEnv 的 PHP 进程连不上本地 Redis,报 Connection refused
这常被误认为 Redis 没起来,其实是 Redis 起来了但监听配置不对。Windows 下的 Redis 默认绑定 127.0.0.1,但某些 phpEnv 版本的 Apache/Nginx 会走 IPv6 回环(::1),导致连接被拒绝。
- 打开
redis.windows.conf,确认有bind 127.0.0.1 ::1(同时监听 IPv4 和 IPv6 回环) - 或者更稳妥:注释掉
bind行,让 Redis 监听所有接口(仅限开发环境),并确保protected-mode yes保持开启(防外网访问) - PHP 连接时显式指定 IP:
$redis->connect('127.0.0.1', 6379),别用localhost(Windows 下可能解析为 ::1) - 检查 phpEnv 的防火墙弹窗是否被误拒 —— 第一次启动 Redis 时,Windows 防火墙可能拦截入站连接
真正麻烦的点在于:Windows 下的 Redis 内存问题不是配个 maxmemory 就完事,它卡在二进制兼容性、地址空间、IPv6 解析三个层面上。换 64 位 redis-server.exe 是绕不开的第一步,否则再调参数也白搭。



















