Я написал многопоточную реализацию кода и попытался использовать 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');
}
Redis является однопоточным по своей конструкции, поэтому он в любом случае обслуживает ваши потоки синхронно.
Ответ выглядит так, потому что протокол RESP не анализируется и возвращает вам необработанное представление для целого числа.
Да, одной из причин может быть то, что процесс синтаксического анализатора все еще заблокирован в то время, когда вы уже возвращаете следующее значение.
Я решил эту проблему, используя отдельное соединение Redis для каждого процесса.