У Redis Twitter Clone есть N + 1 Get?

Я смотрю на Twitter Clone @ 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 все знакомые с реляционными базами данных нужно оставить дома, но в любом случае приведенный выше код кажется довольно неоптимальным.

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

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


person Adam Mikulasev    schedule 21.02.2011    source источник


Ответы (1)


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

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

  • используя конвейерную обработку, чтобы запрашивать все сообщения в одном круговом пути.
  • используя 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"
person seppo0010    schedule 21.02.2011