Как СОРТИРОВАТЬ НАБОР и ПОЛУЧИТЬ полный ХЭШ

Я новичок в Redis, и я должен сказать, что мне это нравится до сих пор :)

Я столкнулся с проблемой, я не уверен, как решить ее более эффективным способом. У меня есть SET из HASH. Каждый HASH описывает пост.

Вот код для создания и хранения HASH:

// Create the HASH
$key = 'post:'.$post->getId();
$this->redis->hSet($key, 'created', $post->getCreated());
$this->redis->hSet($key, 'author', $post->getAuthor());
$this->redis->hSet($key, 'message', $post->getMessage());

// Store the HASH in the SET
$this->redis->sAdd('posts', $post->getId());

Теперь, ранее я сохранял все атрибуты сообщения в поле data поля HASH (json_encoded) и получал такую ​​информацию:

$key = 'posts';
$data = $this->redis->sort($key, array(
    'by' => 'nosort',
    'limit' => array($offset, $limit),
    'get' => 'post:*->data '
));

if (!is_array($data)) {
    return array();
}

foreach ($data as &$post) {
    $post = json_decode($post, true);
}

Это работало отлично, у меня была вся информация о сообщениях :)

Но у меня были конфликты при обновлении сообщения в Redis (одновременные обновления), поэтому я решил, что все атрибуты сообщения будут разделены fields из HASH, и это устранило мою проблему с конфликтами.

Теперь у меня проблема, чтобы получить HASH из моего SET. Должен ли я указывать каждое отдельное поле следующим образом:

$key = 'posts';
$data = $this->redis->sort($key, array(
    'by' => 'nosort',
    'limit' => array($offset, $limit),
    'get' => array('post:*->created', 'post:*->author', 'post:*->message')
));

Или есть другой способ получить полный HASH непосредственно в SET?

Я слышал о pipeline, но не уверен, что это то, что мне нужно, и могу ли я использовать его с phpredis

С уважением, Максим


ОБНОВЛЕНИЕ

Я не уверен, что ясно объяснил. У меня есть несколько элементов в наборе (post_id). Я хочу получить первые 10 сообщений SET, что означает, что я хочу 10 hash (со всеми их полями и значениями), чтобы построить объект post.

Раньше я хранил всю информацию об объекте в одном поле хеша (data), теперь у меня по одному полю на атрибут объекта.

до:

myHash:<id> data

в настоящее время:

myHash:<id> id "1234" created "2010-01-01" author "John"

До того, как я использовал SORT для получения первых 10 сообщений (и легкого разбиения на страницы), вот так:

$key = 'posts';
$data = $this->redis->sort($key, array(
    'by' => 'nosort',
    'limit' => array(0, 10),
    'get' => 'post:*->data '
));

Теперь, когда у меня есть X участников в моем хэше, мне интересно, какое решение является лучшим.

Is it:

$key = 'posts';
$data = $this->redis->sort($key, array(
    'by' => 'nosort',
    'limit' => array($offset, $limit),
    'get' => 'post:*->data '
));

Или, может быть:

$key = 'posts';
$data = $this->redis->sort($key, array(
    'by' => 'nosort',
    'limit' => array($offset, $limit),
    'get' => '#'
));

foreach($data as $post_id) {
   $posts[] = $this->redis->hGetAll('post:'.$post_id);
}

Или наконец:

$key = 'posts';
$data = $this->redis->sort($key, array(
    'by' => 'nosort',
    'limit' => array($offset, $limit),
    'get' => '#'
));

$pipeline = $this->redis->multi();
foreach ($data as $post_id) {
    $pipeline->hGetAll('post:'.$post_id);
}

return $pipeline->exec();

Или что-то еще, чего я еще не знаю? Как лучше и быстрее это сделать?


person maxwell2022    schedule 26.02.2014    source источник
comment
Являются ли члены X для каждого хеш-ключа постоянными? Просто "id", "создал", "автор"?   -  person yinqiwen    schedule 27.02.2014
comment
Да, но у меня больше 3 полей, у меня 10   -  person maxwell2022    schedule 27.02.2014
comment
Ну, вы можете написать 10 «получить шаблон» в команде сортировки, ограничений нет. Это самый быстрый способ.   -  person yinqiwen    schedule 27.02.2014
comment
Вы когда-нибудь узнавали, какой метод работает лучше всего?   -  person Billy    schedule 03.01.2015


Ответы (2)


Если вы прочитали исходный код Redis, вы обнаружите, что это невозможно. Существует обходной путь, который использует сценарий lua для объединения команд sort и hgetall в одном вызове redis.

«Получить шаблон» обрабатывается функцией «lookupKeyByPattern». https://github.com/antirez/redis/blob/unstable/src/sort.c#L61

person yinqiwen    schedule 26.02.2014

Если вы начнете с документации redis.io по хэши, вы найдете там - это команды, которые позволяют вам получить несколько членов хеша. В частности, "HGETALL" для извлечения всех полей и значений или "HMGET" для извлечения набора полей с их значениями.

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

person The Real Bill    schedule 26.02.2014
comment
Я хочу сделать это из набора, а не из хэша. Я знаю hashgetall, но это не то, что я ищу - person maxwell2022; 26.02.2014