Redis comment stocker un tableau associatif? Set ou Hash ou List?
je suis un peu confus avec toutes les options de stockage disponibles de Redis.
Je veux faire quelque chose de simple et je ne veux pas en faire trop.
Je travaille avec phpredis
et Redis v2.8.6
.
j'ai ce tableau associatif simple que je dois stocker. J'ai aussi besoin d'être en mesure de récupérer un élément par sa clé et boucle sur tous les éléments.
$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',
)
);
alors ce que je faisais jusqu'à maintenant était d'utiliser hash
type. ranger mon tableau comme ceci:
foreach ($a as $key => $value) {
$this->redis->hSet('posts', $key, json_encode($value));
}
comme si je pouvais accéder à la clé facilement comme ceci:
public function getPost($postId)
{
return json_decode($this->redis->hGet('posts', $postId), true);
}
// This is returning the information of Post A
$post = getPost(12345);
mais maintenant je dois boucler tous les messages Je ne sais pas comment le faire et si je peux le faire avec ma structure actuelle. Je ne sais pas si j'en ai besoin pour stocker tous les post_id
dans une autre liste pour pouvoir boucler tous les messages?
alors ma question Est quel(S) type (S) de données dois-je utiliser pour stocker ma liste de messages, me permettant de récupérer un seul message par son id et en boucle sur tous les messages?
Merci, Maxime
3 réponses
vous pouvez utiliser la combinaison SET et Hash et 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
Pour OBTENIR un 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"
to GET All HASH
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"
si vous ne voulez pas utiliser sort vous pouvez utiliser Fetch tous les noms de clés de SET en utilisant SMEMBERS et ensuite utiliser Redis Pipeline pour récupérer toutes les touches
juste pour ceux qui cherchent le code PHP, voici ce que j'ai fini par utiliser:
// 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);
j'espère que cela aidera certains d'entre vous ;)
en PHP vous pouvez simplement faire
$redis->set($key, json_encode($value));
$value = json_decode($redis->get($key));
ou utilisez n'importe quelle technique de sérialisation que vous préférez. JSON encode / decode était assez performant pour que je m'en fiche.