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

24
demandé sur maxwell2022 2014-02-25 03:17:59

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

24
répondu Jack Daniel's 2014-02-25 00:20:18

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

11
répondu maxwell2022 2014-02-26 00:03:08

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.

7
répondu Darth Egregious 2015-02-13 15:21:49