如何使用数组增量?

时间:2014-02-28 11:12:34

标签: php arrays memcached

我知道可以这样做:

$wgMemc->set( $key, 2, 60*30 );
$wgMemc->incr( $key );

但如果数值在数组中,如果这样?:

$wgMemc->set( $key, array( 'enabled' => $row->enabled, 'disabled' => 0 ), 60*30 );
$wgMemc->incr( ??? );

激发相同行为的最佳方式是什么?

1 个答案:

答案 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);