如何排序SET并获得完整的HASH

时间:2014-02-26 07:02:24

标签: redis phpredis

我是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(json_encoded)的HASH字段中,我正在获取这样的信息:

$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的{​​{1}}分隔中,这解决了我的冲突问题

现在我遇到的问题是从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个帖子,这意味着我想要10 SET(包含所有字段和值)以构建hash对象。

我之前将所有对象信息存储在哈希(post)的一个字段中,现在我对象的每个属性都有一个字段。

之前:

data

现在:

myHash:<id> data

在我使用myHash:<id> id "1234" created "2010-01-01" author "John"获取前10个帖子(以及轻松分页)之前,就像这样:

SORT

现在我有我的哈希的X成员,我想知道什么是最好的解决方案。

是吗:

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

或者也许:

$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);
}

还是其他我还不知道的东西? 什么是最好,更快的方法呢?

2 个答案:

答案 0 :(得分:0)

如果您已阅读redis的来源,您会发现这是不可能的。有一种解决方法,使用lua脚本在单个redis调用中组合'sort'和'hgetall'命令。

'get pattern'由函数'lookupKeyByPattern'处理。 https://github.com/antirez/redis/blob/unstable/src/sort.c#L61

答案 1 :(得分:-1)

如果您从hashes上的redis.io文档开始,您会发现有些命令可以让您获得多个哈希成员。特别是“HGETALL”用于提取所有字段和值,或“HMGET”用于提取一组带有值的字段。

此外,为了设置它们,我建议使用“HMSET

一次设置它们