Добавить массив к существующему ключу в redis, используя php - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь добавить массив к существующему ключу в redis, используя php.

То, что я сейчас делаю, пытается сначала получить массив в ключе. Если ключ не существует, установите двумерный массив на этот ключ.

Если ключ существует, получите исходный массив в этом ключе, а затем добавьте массив к исходному массиву. Затем верните его к этому ключу.

Моя проблема в том, что, когда два разных клиента A и B добавляют новый массив одновременно, некоторый массив отсутствует.

Я предполагаю, что клиенты A и B получают один и тот же исходный массив, но A возвращает его первым. Затем B возвращает его обратно, перезаписывает только что установленную запись клиента A.

Мой код:

$cache = new Redis();
$origin = $cache->getArray(self::CACHE_PREFIX . $uid);

if(is_array($origin) && count($origin) > 0){
   array_push($origin, $arr);
   $master = $origin;
}else{
   $master = [$arr];
}
$cache->setArray(self::CACHE_PREFIX . $uid, $master);

Что я должен сделать, чтобы сделать это правильно?

РЕДАКТИРОВАТЬ:

вот лог

2019-03-22 11:57:45 1553227065.3247 ORIGINfalse //Client A operate, the key is not exist
2019-03-22 11:57:45 1553227065.326  MASTER[{"sids":["759"],"to":"7223","status":1,"type":"notice"}] //Client A insert an new array
2019-03-22 11:57:45 1553227065.3402 ORIGIN[{"sids":["759"],"to":"7223","status":1,"type":"notice"}] //Client A operate
2019-03-22 11:57:45 1553227065.3402 ORIGIN[{"sids":["759"],"to":"7223","status":1,"type":"notice"}] //Client B operate
2019-03-22 11:57:45 1553227065.3411 MASTER[{"sids":["759"],"to":"7223","status":1,"type":"notice"},{"sids":["764"],"to":"7223","status":1,"type":"notice"}] //Client A append an new array
2019-03-22 11:57:45 1553227065.3413 MASTER[{"sids":["759"],"to":"7223","status":1,"type":"notice"},{"sids":["760"],"to":"7223","status":1,"type":"notice"}] //Client B also append an new array ,and overwrite Client A's data

1 Ответ

0 голосов
/ 22 марта 2019

Я решаю эту проблему.Оказывается, я использую неправильную структуру данных, я должен использовать список.И используйте метод Lpush и Lpop.

, когда Клиент вставляет данные, просто помещает данные в список.нет необходимости получать исходные данные и объединять их с новыми данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...