我是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);
}
还是其他我还不知道的东西? 什么是最好,更快的方法呢?
答案 0 :(得分:0)
如果您已阅读redis的来源,您会发现这是不可能的。有一种解决方法,使用lua脚本在单个redis调用中组合'sort'和'hgetall'命令。
'get pattern'由函数'lookupKeyByPattern'处理。 https://github.com/antirez/redis/blob/unstable/src/sort.c#L61
答案 1 :(得分:-1)