
คำถามที่น่าสนใจเกี่ยวกับการจัดการข้อมูลใน 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
ทำดังนี้
[gist id="b5c674dd98273d7bc2ab3e13c50b941e" file="3.txt"]ถ้าต้องการเก็บข้อมูลพวก raking ต่าง ๆ เช่น Leader board หรือ Top spender ของระบบ
เราจะออกแบบและดึงข้อมูลมากอย่างไร ?
ความต้องการประกอบไปด้วย
- ข้อมูลต้องไม่ซ้ำ ดังนั้นใช้ Set ได้
- ข้อมูลต้องเรียงลำดับจากคะแนนหรือยอดการสั่งซื้อ ดังนั้นถ้าใช้ Set มันไม่เรียงลำดับตามที่ต้องการให้ จึงต้องเปลี่ยนไปใช้ SortedSet แทน
หรือถ้าต้องการค้นหาข้อมูลก็สามารถใช้ Redisearch หรือ Vector type ได้เลย ...
หรือพวก bloom filter และ Cuckoo filter สำหรับการตรวจสอบข้อมูล ที่ลด memory ลงอย่างมาก
หรือข้อมูลแบบ time serie ก็มีให้ใช้งาน
ลองศึกษาและนำไปใช้งานกันดูครับ
หัวใจสำคัญคือ data modeling ที่ต้องใช้งาน
เราพยายามลดขั้นตอนให้น้อยลง เลือกให้เหมาะสมกับงาน
ตัวอย่างเป็น Design for read นั่นเอง เพื่อให้ง่ายต่อการอ่านข้อมูล