32

我对 Redis 的所有可用存储选项有点困惑。我想做一些简单的事情,我不想过度设计它。我正在使用phpredisRedis v2.8.6

我有一个需要存储的简单关联数组。我还需要能够通过其键检索项目并遍历所有项目。

$a = array(
    '12345' => array(
        'name' => 'Post A',
        'val2' => 'blah blah',
        'val3' => 'blah blah blah',
    ),
    '54321' => array(
        'name' => 'Post B',
        'val2' => 'blah blah',
        'val3' => 'blah blah blah',
    ),
    '998877' => array(
        'name' => 'Post C',
        'val2' => 'blah blah',
        'val3' => 'blah blah blah',
    )
);

所以到目前为止我所做的是使用hash类型。像这样存储我的数组:

foreach ($a as $key => $value) {
    $this->redis->hSet('posts', $key, json_encode($value));
}

像这样我可以像这样轻松访问密钥:

public function getPost($postId)
{
    return json_decode($this->redis->hGet('posts', $postId), true);
}

// This is returning the information of Post A
$post = getPost(12345);

但是现在我需要遍历所有我不知道该怎么做的帖子,以及我是否可以用我目前的结构来做。我不知道是否需要将所有内容存储post_id在另一个列表中以便能够遍历所有帖子?

所以我的问题是我应该使用哪种数据类型来存储我的帖子列表,允许我通过其 id 获取单个帖子并遍历所有帖子?

谢谢,马克西姆

4

3 回答 3

32

您可以结合使用 SET 和 Hash 和 SORT

redis 127.0.0.1:6379> HMSET TEST_12345 name "Post A" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> HMSET TEST_54321 name "Post B" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> HMSET TEST_998877 name "Post C" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> SADD All_keys TEST_12345 TEST_54321 TEST_998877
(integer) 3
redis 127.0.0.1:6379> HGETALL TEST_12345

获取一个哈希:

redis 127.0.0.1:6379> HGETALL TEST_12345
1) "name"
2) "Post A"
3) "val2"
4) "Blah Blah"
5) "val3"
6) "Blah Blah Blah"

获取所有哈希

redis 127.0.0.1:6379> SORT All_keys BY nosort GET *->name GET *->val2 GET *->val3
1) "Post A"
2) "Blah Blah"
3) "Blah Blah Blah"
4) "Post B"
5) "Blah Blah"
6) "Blah Blah Blah"
7) "Post C"
8) "Blah Blah"
9) "Blah Blah Blah"

如果您不想使用排序,您可以使用 Fetch All the key names from SET using SMEMBERS然后使用 Redis Pipeline 获取所有键

于 2014-02-25T00:20:18.807 回答
13

只是对于寻找 PHP 代码的人来说,这是我最终使用的:

// Create a post hash
$key = 'post:'.$post->getId();
$this->redis->hSet($key, 'data', serialize($post->toArray()));

// Add a post in the account posts SET
$this->redis->sAdd($account->getId().':posts', $post->getId());

// You can execute the above code as many time as you need 
// to add an object in a SET

// Fetch the first $limit posts for this account
// SORT <account_id>:posts BY nosort GET <account_id>:post:*->data
$key = $account->getId().':posts';
$keys = $this->redis->sort($key, array(
    'by' => 'nosort',
    'limit' => array($offset, $limit),
    'get' => 'post:*->data'
));

// All Good !
var_dump($keys);

我希望这会对你们中的一些人有所帮助;)

于 2014-02-26T00:03:08.137 回答
10

在 PHP 中你可以做

$redis->set($key, json_encode($value));

然后

$value = json_decode($redis->get($key));

或者使用您喜欢的任何序列化技术。JSON 编码/解码的性能足以让我不在乎。

于 2014-10-23T15:00:23.893 回答