我在PHP中遇到了一个使用Memcached的bug。这是我的代码:
<?php
$mc = new \Memcached();
$mc->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
$mc->addServer("127.0.0.1", 11211);
$mc->touch("key", time() + 600);
$touchResult = $mc->getResultCode();
$mc->set("key", 1, time() + 600);
$setResult = $mc->getResultCode();
echo "<pre>";
echo "Touch result: $touchResult\n";
echo "Set result: $setResult\n";
echo "</pre>";当您第一次运行此命令时,输出如下:
Touch result: 16
Set result: 0这是第二次:
Touch result: 0
Set result: 5如果我错了就纠正我,但这是个错误,对吗?有人知道解决办法吗?
下面是我使用的版本:
PS。如果您想知道结果代码意味着什么,请看这里:
0 RES_SUCCESS
5 RES_WRITE_FAILURE
16 RES_NOTFOUND更新
我对代码做了更多的分析,发现一些更有趣的东西。无论touch和set正在处理的是什么touch,都会发生这种错误。只要touch操作返回0 (这意味着成功),set操作就会失败。
更新
我也设法产生了一些其他的错误。例如,从服务器获取一些key,然后再对其他add进行add处理,也会导致严重的问题(RES_END代码)。我相信所有这些问题都与二进制协议有关。在我看来,二进制协议的实现似乎不太稳定。没有二进制协议就可以工作的操作会做得很好,但是一旦协议被设置为二进制,就会导致阻塞问题。
发布于 2013-05-14 07:44:49
好的。
在第一次,您触摸没有存在的关键-结果是RES_NOTFOUND.当你设置-你写值成功- RES_SUCCESS。
在下一次您触摸已存在的键(在第一行中设置它)并获得操作RES_SUCCESS的结果时,接下来您尝试为已存在的键结果false设置值。好的。
如果要更改现有值,则必须使用Memcached::替换()方法而不是"set“
https://stackoverflow.com/questions/16537528
复制相似问题