问题
我写了一个多线程实现的代码,并尝试使用redis作为计数器,这是我的代码。当我尝试使用redis作为计数器时,我经常会在值中得到':'(冒号),有时不会,是因为我循环太快,redis甚至没有注意到吗?
输出结果
cclilshy@192 debug % php st.php
registerRedis success!
registerSocket success!
1
2
3
1
2
string(2) ":5"
1
2
3
string(2) ":9"
3
string(1) "9"
// the up is the output. Why?
编号
$func = function($handle){
for($i=0;$i<3;$i++){
echo $handle->counter().PHP_EOL;
}
var_dump($handle->total());
};
//$handle->counter() :
public function counter($record = true){
if($record = false){
return $this->count;
}
$this->thread->counter();
$this->count++;
return $this->count;
}
//$handle->total() :
public function total(){
return $this->thread->counter(false);
}
//$handle->thread->counter() :
public function counter($record = true){
if($record === false){
return $this->redis->get('thread.' . $this->pids[0] . '.count');
}
return $this->redis->incr('thread.' . $this->pids[0] . '.count');
}
1条答案
按热度按时间mf98qq941#
Redis的设计是单线程的,所以它总是以同步的方式为你的线程服务。
响应如下所示,因为未解析RESP协议,它向您返回整数原始表示形式
是的,其中一个原因可能是解析器进程在您已经返回下一个值时仍被阻塞