เพิ่ม vs Set ใน Memcached


17

ฉันไม่เข้าใจความแตกต่างระหว่าง ADD และ SET เบาะแสใด ๆ ดูเหมือนว่า ADD จะรวม SET หรือ ADD นั้นจะคืนค่า false ถ้ามีบางอย่างอยู่ในนั้นและ SET ก็แค่เขียนทับ ขอบคุณ!

แก้ไข: คำถามเฉพาะของฉันคือ "เมื่อใดที่คุณจะใช้การเพิ่มมากกว่าการตั้งค่าหรือการตั้งค่าแทนที่จะเพิ่มหรือไม่"

คำตอบ:


22

คุณได้รับคำตอบสำหรับคำถามแรกของคุณแล้ว: เจตนาของADDการทำงานเฉพาะเมื่อไม่มีคีย์อยู่ในขณะSETนั้นเพื่ออัพเดตค่าโดยไม่คำนึงว่ามีอยู่จริงหรือไม่ ถ้าคุณคุ้นเคยกับ SQL มันก็เหมือนกับความแตกต่างระหว่างINSERTข้อความค้นหา ( ADD) และUPDATE( SET)

ในส่วนที่เกี่ยวกับคำถามเพิ่มเติมของคุณคุณจะใช้แบบใดก็ตามที่เหมาะสมกับวัตถุประสงค์ของคุณ ฉันจะบอกว่าSETมันเป็นการดำเนินการทั่วไปมากขึ้นเพราะมันเป็นเรื่องธรรมดามากกว่าที่คุณเพียงแค่ต้องการพูดว่า "ฉันต้องการกุญแจfooเพื่อให้มีค่าbarและฉันไม่สนใจว่ามันจะอยู่ในนั้นหรือไม่" อย่างไรก็ตามจะมีโอกาส (บ่อยครั้ง) เมื่อจำเป็นต้องทราบว่ารหัสไม่ได้อยู่ในแคชแล้ว

ตัวอย่างที่ควรคำนึงถึงเมื่อADDเหมาะสมคือการจัดเก็บเซสชันใน memcache (ซึ่งฉันไม่แนะนำ) ซึ่งหากคุณกำลังสร้าง ID เซสชันของคุณแบบสุ่ม (หรือผ่านการแฮช) คุณไม่ต้องการ เพื่อสร้างเซสชันใหม่ด้วยคีย์เดียวกับที่มีอยู่ซึ่งจะทำให้ผู้ใช้รายหนึ่งสามารถเข้าถึงข้อมูลของผู้ใช้รายอื่นได้ ในกรณีนี้เมื่อคุณสร้างเซสชั่นที่คุณจะใช้ADDและหากมันกลับสถานะความล้มเหลวคุณจะต้องสร้าง ID เซสชั่นใหม่และลองอีกครั้ง แน่นอนว่าการอัปเดตเซสชันจะใช้SETเมื่อผู้ใช้ทำงานผ่านแอปพลิเคชันของคุณ


1
ฉันอาจจะ nitpicking เล็กน้อยที่นี่ แต่ในการเปรียบเทียบของคุณกับ SQL ถ้า "เพิ่ม" เปรียบเทียบกับ INSERT "set" จะเปรียบเทียบกับ REPLACE แทนที่จะเป็น UPDATE
matteo

2
ดังนั้นการใช้คำว่า "คร่าว ๆ " หากคุณต้องการได้รับnitpicky จริงๆREPLACEไม่ใช่แม้แต่ SQL ... เป็น "ภาษาที่ได้รับแรงบันดาลใจจาก SQL ที่ MySQL เข้าใจ" (ยิ้ม)
womble

3

นอกจากคำตอบข้างต้นโดย user-id 'womble' โปรดพิจารณาประเด็นต่อไปนี้ด้วย:

  1. ความเป็นไปได้ของสภาพการแข่งขันที่มี 'ชุด' ซึ่งตรงข้ามกับ 'เพิ่ม' ดูลิงก์ด้านล่างเพื่อตอบโดย Nick Johnson: /programming/13234556/using-memcache-add-instead-of-set

  2. หากคุณรู้ว่า 'เพิ่ม' จะทำเช่นนั้นอย่าใช้ 'ชุด' นี้คือการหลีกเลี่ยงการส่งข้อมูลผ่านเครือข่ายเหล่านี้เป็นสาย RPC และเกือบทุกครั้งที่มีการใช้เครือข่ายทราฟฟิกเมื่อเทียบกับการค้นหาคู่คีย์ - ค่าใน memcache ดังนั้นหากคุณสามารถหลีกเลี่ยงทราฟฟิกเครือข่ายที่ดีที่สุดในกรณีนี้เวลาตอบสนองของคุณจะเร็วขึ้น


ดู Appstats ( https://developers.google.com/appengine/docs/python/tools/appstats (โดย Google)) และเพื่อให้เข้าใจจุดที่ 2 ขึ้นไปโปรดดูhttp://www.youtube.com/watch ? v = bvp7CuBWVgAโดย Guido Van Rossum (@Google)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.