Изменить массив, возвращаемый через конвейеры PHPRedis, чтобы включить ключ в качестве индекса каждого элемента массива - PullRequest
0 голосов
/ 02 июля 2018

Я использую phpredis в своем приложении, и у меня следующая структура данных. Идентификатор учетной записи выступает в качестве ключа для каждого пользователя:

    $data = array(
        "accId1"=> array("userId" => "user0234", "username" => "apples", "appversion" => "1.0"),
        "accId2"=> array("userId" => "user2342", "username" => "roses", "appversion" => "2.0")
....
);

Для хранения вышеупомянутого в Redis я использую конвейеры так:

$pipeline = $redis->multi(Redis::PIPELINE);
        foreach ($data as $accId => $userInfo) {
            $pipeline->hMSet($accId, $userInfo);
        }
        $pipeline->exec();

Для поиска:

$accIdSet = getAccountIds();
$pipeline = $redis->multi(Redis::PIPELINE);
        foreach ($accIdSet as $accId) {
            $pipeline->hMGet($accId, array("userId", "username", "appversion"));
        }
        return $pipeline->exec();

Возвращает следующий массив:

(
    [0] => Array
        (
            [userId] => user0234
            [username] => apples
            [appverion] => 1.0
        )

    [1] => Array
        (
            [userId] => user2342
            [username] => roses
            [appversion] => 2.0
        )
)

Это все хорошо, за исключением индекса массива. Система, над которой я работаю, требует, чтобы индексы были фактическим ключом, хранящимся в Redis, а не числовым индексом, который у него есть в настоящее время.

Теперь я знаю, что могу перебрать этот массив и использовать некоторый PHP, чтобы изменить индекс на фактический ключ, но прежде чем перейти туда, я хотел бы знать, есть ли у меня гораздо более эффективный и более чистый вариант для решения этой проблемы.

Я открыт для любых предложений, даже если они меняют функции, которые я использую для взаимодействия с Redis. Спасибо!

1 Ответ

0 голосов
/ 22 июня 2019

Я также столкнулся с этой проблемой, кажется, может быть восстановлен непосредственно сам Redis. Может быть, это обходной путь:

$data = $pipeline->exec();
foreach($data as $k => $v) {
    $data[$k]['accId1'] = $accIdSet[$k];
}
return $data;
...