如何配置Memcached存储超默认大小缓存?Yii2缓存报错求助
解决Memcached存储大对象失败及Windows下配置无效问题
问题背景
使用Yii2框架开发时,为减少数据库交互,尝试将70万+行精简后(约25MB)的数据存入Memcached缓存,持续触发以下错误:
MemcachePool::set(): Server 127.0.0.1 (tcp 11211, udp 0) failed with: SERVER_ERROR object too large for cache (3)
尝试的无效操作及异常
- 执行命令
memcached -I 128m调整单个对象最大限制,仅收到警告且配置不生效:WARNING: Setting item max size above 1MB is not recommended! Raising this limit increases the minimum memory requirements and will decrease your memory efficiency.
- 执行该命令后Memcached卡顿,需按
CTRL+C终止;执行memcached --version无输出 - 修改注册表中
ImagePath为c:\memcached\memcached.exe" -d runservice -m 2048,配置仍未生效
当前Yii2缓存组件配置
'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => '127.0.0.1', 'port' => '11211' ] ] ]
运行环境
- Windows 11
- XAMPP v7.4.30
- PHP 7.4
- Yii2框架
正确配置步骤(Windows平台)
停止Memcached服务
打开管理员权限的命令提示符,执行:net stop memcached修改服务启动参数
- 打开注册表编辑器:执行
regedit - 定位到路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached - 找到
ImagePath键值,修改为(注意替换为你的实际安装路径):
说明:"c:\memcached\memcached.exe" -d runservice -m 2048 -I 128m-m 2048:设置Memcached总可用内存为2048MB-I 128m:设置单个缓存对象的最大大小为128MB(大写字母I,不是小写L)
- 打开注册表编辑器:执行
重启服务并验证
执行命令重启服务:net start memcached可通过执行
memcached -h验证服务是否正常(能输出帮助信息则说明配置生效),或用PHP代码测试大对象存储:$memcache = new Memcache(); $memcache->connect('127.0.0.1', 11211); // 生成25MB左右的测试数据 $testData = str_repeat('x', 25 * 1024 * 1024); if ($memcache->set('test_big_obj', $testData, 0, 3600)) { echo "大对象存储成功"; } else { echo "存储失败:" . $memcache->getResultMessage(); }
优化建议
Memcached并非为存储超大对象设计,调大限制会降低内存效率,建议:
- 拆分缓存项:按业务维度(如ID区间、分类)将大数据拆分为多个小缓存键
- 缓存核心数据:仅缓存高频访问的热点数据,避免全量存储
- 替换为Redis:Redis对大对象支持更友好,同时提供丰富的数据结构适配复杂业务场景
内容的提问来源于stack exchange,提问作者Irvan Hilmi
相关产品推荐
相关产品推荐

