web-dev-qa-db-fra.com

Redis comment stocker le 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 trop le concevoir. Je travaille avec phpredis et Redis v2.8.6.

J'ai ce tableau associatif simple que je dois stocker. J'ai également besoin de pouvoir récupérer un élément par sa clé et faire une 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',
    )
);

Donc, ce que je faisais jusqu'à présent, c'était d'utiliser le type hash. stocker mon tableau comme ceci:

foreach ($a as $key => $value) {
    $this->redis->hSet('posts', $key, json_encode($value));
}

Comme ça, 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 parcourir 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 je dois stocker tous les post_id dans une autre liste pour pouvoir parcourir tous les messages?

Ma question est donc de savoir quel (s) type (s) de données dois-je utiliser pour stocker ma liste de publications, ce qui me permet de récupérer une seule publication par son identifiant et de boucler sur toutes les publications?

Merci, Maxime

27
maxwell2022

Vous pouvez utiliser SET et Hash et SORT en combinaison

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 hachage:

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"

POUR OBTENIR Tous les 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 le tri, vous pouvez utiliser Récupérer tous les noms de clés de SET en utilisant SMEMBERS puis utiliser Redis Pipeline pour récupérer toutes les clés

25
Jack Daniel's

Juste pour ceux qui recherchent 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;)

12
maxwell2022

Dans PHP vous pouvez simplement faire

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

Ensuite

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

Ou utilisez la technique de sérialisation que vous préférez. L'encodage/décodage JSON était suffisamment performant pour que je m'en fiche.

8
Darth Egregious