ปัญหาที่พบเจอ หรือ use case ที่ต้องทำในระบบงาน เป็นดังนี้
ต้องการข้อมูลของ Top 10 user ที่ทำการสั่งซื้อสินค้ามากที่สุด
โดยการทำงานปกติมีขั้นตอนดังนี้
- ทำการเพิ่มข้อมูลการสั่งซื้อของผู้ใช้งาน
- ทำการนับจำนวน order ของผู้ใช้งานแต่ละคนไปเรื่อย ๆ โดยใน counter
- ทำการดึงข้อมูลผู้ใช้งานที่สั่งมากที่สุด 10 คน (Top 10 และ sorting)
จากขั้นตอนการทำงานดังกล่าว
เมื่อไปดูระบบงานท่ีสร้างขึ้นมา
พบว่ามีการใช้งาน RDBMS ดังนี้
ดูเหมือนว่าจะปกติ แต่พบว่ามีปัญหาเมื่อจำนวนคนใช้งานมากขึ้น
ต้องดึงข้อมูลมากขึ้นdatabase ถูกใช้งานมากขึ้น
ดังนั้นจึงลองหาวิธีอื่น ๆ มาแก้ไขหน่อย
หนึ่งในวิธีที่ชอบใช้คือ Redis มาเก็บข้อมูล
แนวคิดในการใช้งานคือ
ทุกครั้งที่มีการเพิ่ม order เข้ามาของแต่ละ user
ต้องทำการเพิ่มจำนวนการสั่งซื้อของ user ด้วยเสมอ
นั่นคือ 2 operation เกิดขึ้นด้วยการเรียก Redis ครั้งเดียว
เพราะว่า ไม่ต้องการส่ง command มายัง redis 2 ครั้ง
จึงคิดว่า เขียน Lua script ไปใน Redis กันไปเลย
จะช่วยให้การทำงานง่ายขึ้นมา
โดยสามารถ Run หรือ เก็บ Lua script ใน Redis ได้เลย
แต่การเก็บไว้ใน Redis จะมี performance ดีกว่า
ตัวอย่างการใช้งานเป็นดังนี้
Data structure ที่ใช้ใน use case นี้คือ Sorted Set
เพื่อเก็บข้อมูลที่ไม่ซ้ำกัน รวมทั้งทำการเรียงลำดับจากมากไปน้อยให้เลยโดยที่ command ที่ใช้คือ
- ZADD สำหรับเพิ่มข้อมูล
- ZRANGE สำหรับดึงข้อมูล
- เมื่อเพิ่มข้อมูลก็ทำการ INCR เพื่อนับจำนวนไปเลย
เขียน Lua script ง่าย ๆ ได้ดังนี้
[gist id="8d1225c2e1d6036d1243804f5261dce6" file="counter.lua"]คำอธิบาย
- ทำการส่ง 2 มา 2 key ประกอบไปด้วย ข้อมูลของ order และ counter ของแต่ละ user
- ถ้าเพิ่ม order ใหม่เข้ามา จะทำการเพิ่มข้อมูลด้วย ZADD และเพิ่มข้อมูลจำนวน order ด้วย INCR
ลองใช้งานผ่าน docker นิดหน่อย
[gist id="8d1225c2e1d6036d1243804f5261dce6" file="1.txt"]เพียงเท่านี้ก็สามารถจัดการปัญหาด้วย Redis ได้แล้ว
ได้ลองเขียน Lua script เพิ่มด้วย สนุกดี