私は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();
それとも私がまだ知らない何か?これを行うための最良の、より速い方法は何ですか?