#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.
когда клиент вставляет данные, просто помещайте данные в список. нет необходимости получать исходные данные и соединять их с новыми данными.