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