Добавить массив к существующему ключу в redis с помощью php

#php #redis

#php #redis

Вопрос:

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

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

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

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

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

Мой код:

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

if(is_array($origin) amp;amp; 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. Сложно понять, не с чем работать. Включите массив, который вы зацикливаете, и то, что вы ожидаете от кода.

2. Я просто вставляю свой журнал. надеюсь, это имеет смысл

Ответ №1:

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

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