Я новичок в 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();
Или что-то еще, чего я еще не знаю? Как лучше и быстрее это сделать?