memcache交易和concurency

时间:2017-02-18 09:20:48

标签: php concurrency locking memcached

使用memcache,php,锁和并发查询时我有一个非常奇怪的问题。请看一下主要功能:

class memcachedata {

public function getdata($key,$params) {
        $timeout = 3600;
        $mem = $this->memcache;
        $expiry = $mem->get(md5($key.$params.'_lock'));
        $this->log('GET EXPIRY');
        if ($expiry) {
           $data   = $mem->get(md5($key));
           $this->log('DATA GET');
        } else
        {
           $this->log('SET LOCK');
       $mem->set(md5($key.$params.'_lock'),'locked',$timeout);
           $data = $this->calculate_external_data($key,$params);//curl here
           if ($data) {
               $mem->set(md5($key.$params),$data,$timeout);
               $this->log('DATA UPDATED'); 
               }
        }
    return $data;
}
}

DEBUG INFO:

00:00:00 GET EXPIRY
00:00:00 GET DATA
00:00:00 GET EXPIRY
00:00:00 SET LOCK
00:00:00 DATA UPDATED
00:00:01 GET EXPIRY
00:00:01 GET DATA

这是正确的结果。

问题是当在一个(或)单独会话中多次从其他函数或多个用户调用此函数时,例如:

function getuserinfo($username,$message){
return $this->getdata('users',"'$username','$message'");
}

DEBUG INFO:

00:00:00 GET EXPIRY
00:00:00 SET LOCK
00:00:00 DATA UPDATED
00:00:00 GET EXPIRY
00:00:00 SET LOCK
00:00:00 DATA UPDATED
00:00:03 GET EXPIRY
00:00:03 SET LOCK
00:00:03 DATA UPDATED

为什么函数getdata看不到锁?是时候开始使用MQ吗?

1 个答案:

答案 0 :(得分:0)

这是使用php7.0并使用旧的memcache扩展。转移到memcached解决了这个问题。怎么样?我不知道。

相关问题