Redis jak przechowywać tablicę asocjacyjną? Set, Hash czy List?

Jestem trochę zdezorientowany ze wszystkimi dostępnymi opcjami przechowywania Redis. Chcę zrobić coś prostego i nie chcę tego przerabiać. Pracuję z phpredis i Redis v2.8.6.

Mam prostą tablicę asocjacyjną, którą muszę przechowywać. Muszę również być w stanie odzyskać element za pomocą jego klucza i pętli na wszystkich przedmiotach.

$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',
    )
);

Więc do tej pory używałem hash typu. przechowywanie tablicy tak:

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

W ten sposób mogłem łatwo uzyskać dostęp do klucza, jak to:

public function getPost($postId)
{
    return json_decode($this->redis->hGet('posts', $postId), true);
}

// This is returning the information of Post A
$post = getPost(12345);

Ale teraz muszę zapętlić wszystkie posty Nie wiem jak to zrobić i czy mogę to zrobić z moją obecną strukturą. Nie wiem, czy muszę przechowywać wszystkie post_id na innej liście, aby móc zapętlić wszystkie posty?

Więc moje pytanie brzmi, jakiego typu danych powinienem użyć do przechowywania mojej listy postów, pozwalając mi pobrać pojedynczy post według jego id i zapętlać wszystkie posty?

Dzięki, Maxime

Author: maxwell2022, 2014-02-25

3 answers

Możesz użyć SET i Hash oraz sortować w kombinacji

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

Aby uzyskać jeden 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"

Aby uzyskać wszystkie 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"

Jeśli nie chcesz używać sort, możesz użyć Fetch All the key names from SET używając SMEMBERS a następnie użyć Redis Pipeline aby pobrać wszystkie klucze

 24
Author: Jack Daniel's,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 00:20:18

Tylko dla ludzi szukających kodu PHP, oto, czego użyłem:

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

Mam nadzieję, że to pomoże niektórym z was;)

 11
Author: maxwell2022,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 00:03:08

W PHP możesz po prostu zrobić

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

Then

$value = json_decode($redis->get($key));
Albo użyj dowolnej techniki serializacji. Kodowanie/dekodowanie JSON było wystarczająco wydajne, aby mnie to nie obchodziło.
 7
Author: Darth Egregious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 15:21:49