Redis Twitter Clone memiliki Dapatkan N + 1?

Saya sedang melihat Twitter Clone @ http://redis.io/topics/twitter-clone dan perhatikan "dapatkan" seperti N + 1 dalam kode:

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

Saya sadar bahwa semua keakraban basis data relasional harus ditinggalkan ketika berhadapan dengan Redis, tetapi bagaimanapun juga, kode di atas tampaknya kurang optimal.

Apakah ada cara untuk memperbaiki kode ini, atau apakah pemahaman saya mungkin salah?

Terima kasih sebelumnya!


person Adam Mikulasev    schedule 21.02.2011    source sumber


Jawaban (1)


Kode tersebut memang kurang optimal, namun strukturnya benar. Anda akan memiliki satu kunci dengan isi postingan dan satu daftar dengan setiap postingan pengguna.

Sekarang, untuk mengoptimalkannya saya melihat dua opsi.

  • menggunakan pipelining untuk meminta semua postingan dalam perjalanan pulang pergi yang sama.
  • menggunakan sort yang memungkinkan Anda mendapatkan lebih banyak perintah seperti kueri.

Contoh opsi kedua:

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