Redis Twitter Клон имеет N + 1 Получить? - PullRequest
1 голос
/ 21 февраля 2011

Я смотрю на клон Twitter'а @ http://redis.io/topics/twitter-clone и заметил, что N + 1-подобный "get" в коде:

foreach($posts as $p) { if (showPost($p)) $c++; if ($c == $count) break; } function showPost($id) { $r = redisLink(); $postdata = $r->get("post:$id"); ...

Я знаю, что вся семейная реляционная база данных должна быть оставлена ​​дома при работе с Redis, но в любом случае приведенный выше код кажется довольно неоптимальным.

Есть ли способы улучшить этот код, или я понимаювозможно неверно?

Заранее спасибо!

1 Ответ

1 голос
/ 21 февраля 2011

Этот код действительно неоптимальный, но структура правильная. У вас будет один ключ с телом поста и один список с постами каждого пользователя.

Теперь, чтобы оптимизировать его, я вижу два варианта.

  • с использованием конвейерной обработки для запроса всех сообщений в одном и том же цикле.
  • с использованием sort , что позволяет использовать более похожие на запросы команды.

Пример второго варианта:

redis> LPUSH uid:123:posts 1
(integer) 1
redis> LPUSH uid:123:posts 3
(integer) 2
redis> LPUSH uid:123:posts 5
(integer) 3
redis> LPUSH uid:123:posts 7
(integer) 4
redis> SET post:1 test1
OK
redis> SET post:2 test2
OK
redis> SET post:3 test3
OK
redis> SET post:5 test5
OK
redis> SET post:7 test7
OK
redis> SORT uid:123:posts DESC GET post:* LIMIT 0 100
1) "test7"
2) "test5"
3) "test3"
4) "test1"
...