32

Redis で利用可能なすべての保存オプションについて少し混乱しています。私は単純なことをしたいのですが、それを過度に設計したくありません。私はと働いていphpredisますRedis 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すべての投稿をループできるようにするために、すべてを別のリストに保存する必要があるかどうかわかりませんか?

だから私の質問は、投稿のリストを保存するためにどのデータ型を使用すればよいですか?

ありがとう、マキシム

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

1 つの HASH を取得するには:

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 に答える