memcached 事务和并发
memcache transactions and concurency
我在使用内存缓存、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;
}
}
调试信息:
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'");
}
调试信息:
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 了吗?
它与 php7.0 一起使用,并且使用的是旧的内存缓存扩展。迁移到 memcached 解决了这个问题。如何?我不知道。
我在使用内存缓存、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;
}
}
调试信息:
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'");
}
调试信息:
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 了吗?
它与 php7.0 一起使用,并且使用的是旧的内存缓存扩展。迁移到 memcached 解决了这个问题。如何?我不知道。