我知道可以这样做:
$wgMemc->set( $key, 2, 60*30 );
$wgMemc->incr( $key );
但如果数值在数组中,如果这样?:
$wgMemc->set( $key, array( 'enabled' => $row->enabled, 'disabled' => 0 ), 60*30 );
$wgMemc->incr( ??? );
激发相同行为的最佳方式是什么?
答案 0 :(得分:0)
你必须实现自己的方式。 想法很简单: 1)按键获取值 2)对其进行必要的更新(增量,减量,任何东西) 3)设置密钥的新值
<强>然而强> 如果您处于并发环境(如任何公开可用的脚本),则在1到3之间,其他人可以访问您的代码的这一部分。导致同步数据更新。这可能会对你造成严重影响
<强>因此强> 我们必须确保目前只有单个用户/进程/线程正在更新数据。我们可以使用锁。
而不是
$wgMemc->set( $key, array( 'enabled' => $row->enabled, 'disabled' => 0 ), 60*30 );
$wgMemc->incr( ??? );
让我们在那里添加一些锁
// acuire lock
$lock = false;
$lock_ttl = 10;
$tries = 0;
$max_tries = 500;
// trying to obtain the lock. If we can't "add" the key - it means
// that someone else is updating data at the moment
// so we'll wait
while ( $tries < $max_tries && !($lock = $wgMemc->add("lock_" . $key, 1, $lock_ttl)) ) {
$tries++;
usleep( 100 * ($tries % ($max_tries/10)) );
}
// check if we successfully obtained the lock and then do our stuff
if ($lock) {
$data = $wgMemc->get( $key );
// update our data
$data['enabled'] = 1;
$data['blablabla']++;
$wgMemc->set( $key, $data, 60*30 );
}
// release lock
$wgMemc->delete("lock_" . $key);