Ruby caching

เขียนโดย วุฒิไกร ลิ่มสกุล :: 04 สิงหาคม 2558

ruby caching

        ruby caching คือการจัดเก็บ output ไว้เป็น file โดยจะทำการบันทึก ในรูปแบบของ html โดยค่าตั้งต้นจะเก็บไว้ที่ public/ ซึ่งเราสามารถที่จะปรับเปลี่ยนตำแหน่งได้ เมื่อมีการร้องขอข้อมูล ของ file ที่มีอยู่ในแคชที่จัดเก็บไว้มันก็จะวิ่งเข้ามาที่ ไฟล์ที่จัดเก็บเป็นแคชไว้แทน ที่จะวิ่งไปที่เราเรียกหาไฟล์เช่น ฐานข้อมูล

ruby caching จะช่วยลดภาระการทำงานของ server ลงได้มาก เช่น แทนที่จะต้องร้องขอข้อมูลจาก ฐานข้อมูล ก็เปลี่ยนไปเป็นการเรียกข้อมูลจาก cache file แทน ช่วยในการ แสดงผลที่รวดเร็ว เป็นต้น

การใช้งาน ruby caching ก็มีหลากหลายรูปแบบที่ ruby มีให้ใช้ เช่น

  1. ActiveSupport::Cache::Store
  2. ActiveSupport::Cache::MemoryStore
  3. ActiveSupport::Cache::FileStore
  4. ActiveSupport::Cache::MemCacheStore
  5. ActiveSupport::Cache::EhcacheStore
  6. 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 แล้ว