web-dev-qa-db-ja.com

Redisは連想配列を保存する方法は?セットまたはハッシュまたはリスト?

私は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によって単一の投稿を取得し、すべての投稿をループすることができますか?

ありがとう、マキシム

27
maxwell2022

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つのハッシュを取得するには:

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"

ソートを使用したくない場合は、[〜#〜] smembers [〜#〜]を使用してSETからすべてのキー名を取得し、Redis Pipelineを使用してすべてのキーを取得できます。

25
Jack Daniel's

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

これがあなたの一部を助けることを願っています;)

12
maxwell2022

PHPでできること

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

それから

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

または、好きなシリアル化手法を使用します。 JSONエンコード/デコードは、私が気にしないほど十分なパフォーマンスを発揮しました。

8
Darth Egregious