ข้อมูลหลักอีคอมเมิร์ซ

แฟลชเซลและสต็อกสินค้า

ขายตามสต็อกที่มีจริงเมื่อมีผู้ซื้อหนึ่งหมื่นคนกดซื้อในวินาทีเดียวกัน และกันบอตออกไป

การลดสต็อก
อะตอมมิก
หน่วยที่ขายเกิน
0
การจองที่ปล่อยตัวเอง
10 นาที
ขั้นที่ 1 จาก 6
โหลดสต็อก

สินค้า 500 หน่วยเปิดขาย

เซสชันตัวอย่างplaying
# โหลดสต็อก
hotkv> SET stock:sneaker-x 500
OK

ตัวอย่างแบบแอนิเมชันพร้อมคำสั่ง HotKV จริงและคำตอบตัวอย่าง คลิกขั้นตอนใดก็ได้เพื่อข้ามไปยังขั้นนั้น คำสั่งและคำตอบยังคงเป็นภาษาอังกฤษ ตรงตามที่คุณพิมพ์และเห็นใน HotKV

ปัญหา

ในแฟลชเซล ฐานข้อมูลสต็อกเป็นคอขวดในจังหวะที่สำคัญที่สุดพอดี การตรวจแบบอ่านแล้วเขียนขายเกินสต็อกเมื่อมีการทำงานพร้อมกัน ตะกร้าที่ถูกทิ้งล็อกสต็อกไว้ตลอดไป และบอตซื้อสต็อกก่อนที่ลูกค้าจริงจะโหลดหน้าเสร็จ

HotKV จัดการอย่างไร

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

ทีละขั้นตอน

เกิดอะไรขึ้นบ้าง ทีละคำสั่ง

  1. 01

    โหลดสต็อก

    สินค้า 500 หน่วยเปิดขาย

    SET stock:sneaker-x 500
  2. 02

    คุมบอตไว้

    ลูกค้าแต่ละรายลองได้สองครั้งต่อ 10 วินาที บอตเกินทันที

    GCRA.LIMIT buy:customer:881 10000 2
  3. 03

    เอาหนึ่งหน่วย

    DECR เป็นแบบอะตอมมิก การคลิกพร้อมกัน 10,000 ครั้งเอาได้ไม่เกิน 500 หน่วย

    DECR stock:sneaker-x
  4. 04

    จองไว้สิบนาที

    การจองหมดอายุเองหากทิ้งการชำระเงิน และตัวกวาดคืนหน่วยนั้นกลับเข้าสต็อก

    SET hold:sneaker-x:order-7781 customer:42 NX EX 600
  5. 05

    จัดการเมื่อขายหมด

    เมื่อ DECR ต่ำกว่าศูนย์ หน่วยนั้นถูกคืนและผู้ซื้อเห็นว่าขายหมดแล้ว สต็อกไม่ติดลบนาน

    INCR stock:sneaker-x
  6. 06

    ส่งคำสั่งซื้อให้การจัดส่ง

    คำสั่งซื้อที่ชำระแล้วถูกต่อท้ายสตรีม ระบบคลังสินค้าทำงานกับมันตามจังหวะของตนเอง

    XADD orders * order 7781 sku sneaker-x customer 42
เหมาะกับงานแบบไหน

สถานการณ์จริง

การปล่อยสนีกเกอร์และสินค้าที่ระลึก

รุ่นลิมิเต็ดขายหมดในไม่กี่วินาทีโดยไม่ขายเกินแม้แต่คู่เดียว

การจำหน่ายตั๋ว

ที่นั่งถูกจองไว้ไม่กี่นาทีระหว่างการชำระเงิน และปล่อยอัตโนมัติหากผู้ซื้อออกไป

การจัดส่งอาหารและของชำ

ช่วงเวลาจัดส่งเป็นตัวนับ ที่ลดแบบอะตอมมิกเมื่อลูกค้าจอง

อยู่ในตัว

สิ่งที่คุณได้รับ

ตัวนับแบบอะตอมมิก

DECR และ INCR เปลี่ยนสต็อกในขั้นเดียวโดยไม่มี race

DECRINCRBY

การจองที่หมดอายุ

การจองเป็นคีย์ที่มี TTL

SETNXEX

การป้องกันบอต

ขีดจำกัดต่อลูกค้าพร้อมเวลาลองใหม่ที่แม่นยำ

GCRA.LIMIT

การส่งต่อคำสั่งซื้อ

สตรีมสำหรับการจัดส่ง พร้อม consumer group และการตอบรับ

XADDXREADGROUP
ข้อมูลอ้างอิง:DECRSETGCRA.LIMITXADD

คำถามที่พบบ่อย

การจองที่หมดอายุคืนสต็อกได้อย่างไร

การจองที่หมดอายุสังเกตได้ผ่าน keyspace notification หรือการกวาดเป็นระยะ ซึ่งเพิ่มตัวนับสต็อกกลับไปอีกครั้ง

ตรวจสต็อกโดยไม่เอาออกได้ไหม

ได้ GET คืนจำนวนปัจจุบัน มีแต่ DECR ที่จอง

ตะกร้าที่มีหลายรายการล่ะ

ใช้ MULTI และ EXEC หรือฟังก์ชัน เพื่อลดหลายตัวนับพร้อมกัน

กรณีใช้งานที่เกี่ยวข้อง

ลองกับเวิร์กโหลดของคุณเอง

HotKV ใช้โปรโตคอลของ Redis คุณจึงชี้ไคลเอนต์ที่มีอยู่มาที่ HotKV แล้วรันคำสั่งเดียวกันนี้ได้