คำถามที่น่าสนใจเกี่ยวกับการจัดการข้อมูลใน Redis
ซึ่งเป็น key-value database และจัดเก็บข้อมูลลงใน memory เป็นหลัก
แต่ก็สามารถ persist ข้อมูลลลง disk ได้เช่นกัน
โดย use case หลัก ๆ ของ Redis มักจะเป็น caching data
แต่ Redis นั้นมันเป็น data structure database
นั่นคือ เราสามารถจัดเก็บข้อมูลในรูปแบบต่าง ๆ พื่อให้ง่ายต่อการใช้งาน
ดังนั้นเราลองมาทำความรู้จักกันนิดหน่อยว่ามีอะไรให้ใช้งานบ้าง ?

เป้าหมายหลัก ๆ ลดการทำงาน และ เพิ่มประสิทธิภาพของระบบงาน
ตัวอย่างเช่น

ถ้าต้องการเก็บข้อมูล log หรือ transaction แล้วแสดงผลเรียงจากใหม่ไปเก่า

ถ้าเป็นการจัดเก็บใน database ปกติ ก็ insert ไปเรื่อย ๆ
จากนั้นก็ทำการ query ข้อมูล แล้ว order by จากวันที่สร้าง
แบบนี้มันดีไหม ?

ทำไมไม่เก็บข้อมูลจากใหม่ไปเก่าเลยละ ?
จะได้ไม่ต้องมา order by ทีหลัง น่าคิดมาก ๆ
ดังนั้นถ้าใช้ Redis เราสามารถเลือกใช้งาน data structure ชื่อว่า List

การใช้งานก็เพียงเพิ่มข้อมูลเข้าไปด้านหน้า หรือ ฝั่งซ้ายนั่นเอง
ใช้งานผ่าน command LPUSH
ดังนั้นเมื่อดึงข้อมูลก็ดึงจากซ้ายไปขวาก็ได้ข้อมูลเรียงจากใหม่ไปเก่าแล้ว !!

แต่ถ้าไม่ต้องการให้แต่ละ element หรือ member ใน List ไม่ซ้ำกัน
ก็สามารถเปลี่ยนไปใช้ data structure ชื่อว่า Set ได้เลยแบบง่าย ๆ
หรือถ้าเป็นข้อมูลที่ต้องการทำแบบ append only เช่น logging
ก็สามารถเรื่องใช้ Stream ได้อีกด้วย

ถ้าต้องการจัดการข้อมูลในรูปแบบของ Queue (First-In First-out)

อยากจัดการข้อมูลเข้าออกแบบ queue จะทำอย่างไรใน Redis
ปกติใน Redis จะมี pub/sub ให้ใช้งาน แต่ยังไม่ตรงตามที่ต้องการ
จึงทำการ implement ด้วยตัวเอง ผ่าน data structure และ command ของ Redis ดีกว่า
แนวคิดเป็นดังนี้

  • ข้อมูลจะเก็บในรูปแบบของ List
  • ข้อมูลเข้าจะมาทางซ้ายเสมอ ใช้งานผ่าน LPUSH
  • ข้อมูลออกทางขวาเสมอ ใช้งานผ่าน RPOP

ทำดังนี้

ถ้าต้องการเก็บข้อมูลพวก raking ต่าง ๆ เช่น Leader board หรือ Top spender ของระบบ

เราจะออกแบบและดึงข้อมูลมากอย่างไร ?
ความต้องการประกอบไปด้วย

  • ข้อมูลต้องไม่ซ้ำ ดังนั้นใช้ Set ได้
  • ข้อมูลต้องเรียงลำดับจากคะแนนหรือยอดการสั่งซื้อ ดังนั้นถ้าใช้ Set มันไม่เรียงลำดับตามที่ต้องการให้ จึงต้องเปลี่ยนไปใช้ SortedSet แทน

หรือถ้าต้องการค้นหาข้อมูลก็สามารถใช้ Redisearch หรือ Vector type ได้เลย …
หรือพวก bloom filter และ Cuckoo filter สำหรับการตรวจสอบข้อมูล ที่ลด memory ลงอย่างมาก
หรือข้อมูลแบบ time serie ก็มีให้ใช้งาน

ลองศึกษาและนำไปใช้งานกันดูครับ
หัวใจสำคัญคือ data modeling ที่ต้องใช้งาน
เราพยายามลดขั้นตอนให้น้อยลง เลือกให้เหมาะสมกับงาน
ตัวอย่างเป็น Design for read นั่นเอง เพื่อให้ง่ายต่อการอ่านข้อมูล