เขียนโดย วุฒิไกร ลิ่มสกุล :: 04 สิงหาคม 2558
ruby caching คือการจัดเก็บ output ไว้เป็น file โดยจะทำการบันทึก ในรูปแบบของ html โดยค่าตั้งต้นจะเก็บไว้ที่ public/ ซึ่งเราสามารถที่จะปรับเปลี่ยนตำแหน่งได้ เมื่อมีการร้องขอข้อมูล ของ file ที่มีอยู่ในแคชที่จัดเก็บไว้มันก็จะวิ่งเข้ามาที่ ไฟล์ที่จัดเก็บเป็นแคชไว้แทน ที่จะวิ่งไปที่เราเรียกหาไฟล์เช่น ฐานข้อมูล
ruby caching จะช่วยลดภาระการทำงานของ server ลงได้มาก เช่น แทนที่จะต้องร้องขอข้อมูลจาก ฐานข้อมูล ก็เปลี่ยนไปเป็นการเรียกข้อมูลจาก cache file แทน ช่วยในการ แสดงผลที่รวดเร็ว เป็นต้น
การใช้งาน ruby caching ก็มีหลากหลายรูปแบบที่ ruby มีให้ใช้ เช่น
- ActiveSupport::Cache::Store
- ActiveSupport::Cache::MemoryStore
- ActiveSupport::Cache::FileStore
- ActiveSupport::Cache::MemCacheStore
- ActiveSupport::Cache::EhcacheStore
- ActiveSupport::Cache::NullStore
แต่วันนี้ผมจะแนะนำการใช้งาน ActiveSupport::Cache::MemoryStore จะเป็นการเก็บข้อมูลของไฟล์ไว้ใน memory ซึ่งการใช้งานก็ไม่ยุ่งยากเพียงแค่ 3 ขั้นตอนก็สามารถใช้งานได้แล้ว
1. การสร้าง object ของไฟล์แคชขึ้นมา
[code language="ruby"] cache = ActiveSupport::Cache::MemoryStore.new [/code]
2.การเขียนข้อมูลลงในไฟล์แคช
[code language="ruby"] cache.write('company', 'swiftlet') [/code]
3.การอ่านไฟล์จากแคชที่เก็บไว้
[code language="ruby"] cache.read('company') [/code]
สำหรับเมื่อเราไม่ต้องการใช้งานไฟล์แคช ที่เก็บไว้แล้วก็สามารถที่จะลบไฟล์ทิ้งได้โดยใช้คำสั่ง
[code language="ruby"] cache.clear [/code]
ซึ่งจะหมายถึงการลบไฟล์แคชที่จัดเก็บไว้ทั้งหมด โดยไฟล์แคช สามารถที่จะกำหนดเวลาให้ลบออกเองอัตโนมัติ ได้โดยทำการแก้ไข ในส่วนของการสร้าง object ของ ไฟล์แคช ใน ข้อที่ 1 ของการใช้แคช เช่น กำหนดเวลาให้ใช้งานแคช ได้ 5 นาทีหลังจากนั้นให้ลบทิ้ง
[code language="ruby"] cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes) [/code]
หรือจะกำหนดเวลาให้สามารถที่จะลบแคช แต่ละ field ใน object ก็ได้
[code language="ruby"] cache.write('company', 'swiftlet', expires_in: 1.minute) [/code]
สำหรับการใช้ แคช ในระบบที่ข้อมูลไม่คงที่ หรือมีการเปลี่ยนแปลงตลอดเวลา ก็จะทำให้ เกิดปัญหาที่ข้อมูลที่แสดงจะมีการผิดพลาด อย่างเช่น เก็บข้อมูลของ ผู้ใช้นาย A ไว้ใน แคช ตลอดไป แล้ววันหนึ่งนาย A เปลี่ยนชื่อเป็นนาย B ระบบก็จะทำการในหาข้อมูลใน แคช ก่อนว่ามีข้อมูล ของนาย A หรือไม่เนื่องจาก มีการเก็บ แคช ไว้ ก็จะทำการดึงข้อมูลของนาย A ที่ แคช ไว้มาแสดง ซึ่งจริงๆแล้ว ข้อมูลของนาย A มีการเปลี่ยนแปลงไปแล้ว จำคำนี้ไว้ “ทุกปัญหามีทางแก้ไขเสมอ” ruby ก็มีการใช้ namespace ในการจัดเก็บไฟล์แคช เพื่อไม่ให้ข้อมูลผิดพลาดเมื่อมีการแก้ไขระหว่างการทำ caching การใช้ก็ไม่ยากอีกเช่นเคย ให้แก้ไข ในส่วนของการสร้าง object ของไฟล์แคช ใน ข้อที่ 1
[code language="ruby"] cache = ActiveSupport::Cache::MemoryStore.new(namespace: Time.now) [/code]
เพียงแค่นี้เราก็ไม่ต้องกลัวข้อมูลผิดพลาดในระหว่างการทำ caching แล้ว