Redis Twitter Clone มี N + 1 รับ?

ฉันกำลังดู Twitter Clone @ http://redis.io/topics/twitter-clone และสังเกตเห็นว่า "get" เหมือน N + 1 ในโค้ด:

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)


รหัสนั้นไม่ดีเท่าที่ควร แต่โครงสร้างนั้นถูกต้อง คุณจะมีหนึ่งคีย์พร้อมเนื้อหาโพสต์และหนึ่งรายการพร้อมโพสต์ของผู้ใช้แต่ละคน

ตอนนี้ เพื่อเพิ่มประสิทธิภาพ ฉันเห็นสองตัวเลือก

  • ใช้ pipelining เพื่อขอโพสต์ทั้งหมดในรอบเที่ยวเดียวกัน
  • ใช้ 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