1

私は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());

さて、以前は投稿のすべての属性を(json_encoded)のdataフィールドに格納していて、次のような情報を取得していました。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ことにし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) の 1 つのフィールドに格納していましたが、現在はオブジェクトの属性ごとに 1 つのフィールドがあります。

前:

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 メンバーが追加されたので、何が最善の解決策なのか疑問に思っています。

それは...ですか:

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

それとも私がまだ知らない何か?これを行うための最良の、より速い方法は何ですか?

4

2 に答える 2

-1

ハッシュに関する redis.io ドキュメントから始めると、複数のハッシュ メンバーを取得できるコマンドがあることがわかります。特に、すべてのフィールドと値を取得する場合は「HGETALL 」、値を含む一連のフィールドを取得する場合は「 HMGET」です。

さらに、それらを設定するには、「 HMSET」を使用して1回のパスで設定することをお勧めします

于 2014-02-26T09:44:04.077 に答える