Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เก็บแคชในตัวของ Rails:ภาพรวม

เมื่อสร้างแอป Rails ใหม่ การแคชได้รับการตั้งค่าไว้แล้ว ทำให้การเริ่มต้นใช้งานได้รวดเร็วพอๆ กับการห่อส่วนย่อยของมุมมองโดยใช้ cache ผู้ช่วยหรือใช้ Rails.cache.fetch เพื่อจัดเก็บผลลัพธ์ API ภายนอก ข้อมูลแคชถูกเก็บไว้ในที่เก็บแคชของ Rails ซึ่งสามารถเก็บข้อมูลไว้ในหน่วยความจำ, Memcached, Redis หรือแม้แต่เขียนลงดิสก์ได้โดยตรง

แต่แคชที่จัดเก็บต่างกันแบบใดดีที่สุดสำหรับสถานการณ์ใด ในภาพรวมนี้ เราจะพิจารณาแต่ละตัวเลือก

👋 และถ้าคุณชอบบทความนี้ ยังมีอีกมากที่เราเขียนเกี่ยวกับประสิทธิภาพของ Ruby (on Rails) ให้ดูที่รายการตรวจสอบการตรวจสอบประสิทธิภาพของ Ruby

ที่เก็บไฟล์

:file_store ถูกใช้โดยค่าเริ่มต้นเมื่อไม่มีการกำหนดค่าที่เก็บแคชโดยเฉพาะ ตามความหมายของชื่อ มันจะเขียนรายการแคชไปยังระบบไฟล์ สิ่งเหล่านี้จบลงใน tmp/cache ไดเร็กทอรีในรูทของแอปพลิเคชันเว้นแต่คุณจะเลือกตำแหน่งอื่นโดยการตั้งค่า cache_store อย่างชัดเจน การกำหนดค่าเป็น :file_store และส่งเส้นทางไปยังไดเร็กทอรีที่คุณต้องการใช้

config.cache_store = :file_store , "/path/to/cache/directory"

ไฟล์แคชจะถูกบันทึกลงในดิสก์และจะไม่ถูกล้างโดยอัตโนมัติ ซึ่งหมายความว่าคุณจะต้องระมัดระวังในการถอดออกเพื่อให้แน่ใจว่าจะไม่ทำให้ดิสก์ของคุณเต็ม ตัวอย่างเช่น เรียกใช้ Rails.cache.cleanup เป็นระยะจะทำให้แคชของคุณปลอดจากรายการที่หมดอายุ

ที่เก็บไฟล์มีประโยชน์ในการพัฒนา เนื่องจากแต่ละรายการถูกจัดเก็บไว้ในไดเร็กทอรีแคช ช่วยให้คุณสามารถดรอปรายการจากแคชได้โดยการลบไฟล์ออก ซึ่งมีประโยชน์สำหรับการทดสอบการทำให้แคชใช้ไม่ได้ เช่น

ในการผลิต ที่เก็บไฟล์จะมีประโยชน์เมื่อแต่ละกระบวนการของเซิร์ฟเวอร์ทำงานบนระบบไฟล์เดียวกัน แม้ว่าจะช้ากว่าที่จัดเก็บแคชตามหน่วยความจำ แต่ที่จัดเก็บไฟล์ก็ทำได้ดีหากแคชมีขนาดใหญ่มาก

เมมโมรี่สโตร์

ตั้งแต่เวอร์ชัน 5.0 Rails จะตั้งค่า :memory_store . โดยอัตโนมัติ ในการกำหนดค่าการพัฒนาเมื่อสร้างแอปพลิเคชันใหม่ เมื่อใช้ที่เก็บหน่วยความจำ ข้อมูลแคชจะถูกเก็บไว้ในหน่วยความจำในกระบวนการของเว็บเซิร์ฟเวอร์ Ruby

เนื่องจากข้อมูลถูกเก็บไว้ในหน่วยความจำในกระบวนการเดียวกับเว็บเซิร์ฟเวอร์ของคุณ ที่เก็บหน่วยความจำจึงเหมาะที่จะใช้ในการพัฒนา เนื่องจากจะถูกล้างโดยอัตโนมัติทุกครั้งที่คุณรีสตาร์ทเว็บเซิร์ฟเวอร์การพัฒนา

ตามค่าเริ่มต้น ที่จัดเก็บในหน่วยความจำจะใช้ 32 เมกะไบต์ แต่คุณสามารถแทนที่ได้โดยส่ง :size ตัวเลือกเมื่อกำหนดค่าที่เก็บแคช

config.cache_store = :memory_store, { size: 16.megabytes }

เมื่อแคชเต็ม รายการที่ใช้ล่าสุดจะถูกลบโดยอัตโนมัติจากแคชเพื่อให้มีที่ว่างสำหรับรายการใหม่

การใช้ที่จัดเก็บหน่วยความจำในการผลิตนั้นเป็นไปได้ (และเป็นวิธีแก้ปัญหาที่เร็วที่สุดที่คุณสามารถหาได้) แต่ไม่แนะนำสำหรับระบบที่รันกระบวนการของเซิร์ฟเวอร์หลายตัว เนื่องจากโปรเซสเข้าถึงแคชของกันและกันไม่ได้ แต่ละโปรเซสจะต้องรักษาสำเนาแคชของตัวเองไว้

ร้าน Memcache

:mem_cache_store ใช้ Dalli gem และ Memcached เพื่อจัดเก็บรายการในแคชแบบรวมศูนย์ในหน่วยความจำ

ข้อมูลจะถูกเก็บไว้ในกระบวนการแยกต่างหากแทนกระบวนการเซิร์ฟเวอร์ Ruby ด้วยเหตุนี้ แคชจะไม่หลุดเมื่อแอปของคุณรีสตาร์ท แต่จะอยู่ในหน่วยความจำตราบเท่าที่เซิร์ฟเวอร์ Memcached ยังคงทำงานอยู่ เมื่อรีสตาร์ท คุณจะเริ่มด้วยแคชใหม่

ร้าน Memcache จะถือว่าแคชเซิร์ฟเวอร์ทำงานบน localhost โดยค่าเริ่มต้น แต่คุณสามารถส่งที่อยู่หนึ่งหรือหลายที่อยู่เพื่อใช้เซิร์ฟเวอร์ระยะไกลได้

config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com"

Memcached ได้รับการกำหนดค่าให้ใช้ขนาดแคชสูงสุด 64 MB โดยค่าเริ่มต้น แต่กำหนดค่าได้โดยใช้ตัวเลือกบรรทัดคำสั่งหรือใน memcached.conf ไฟล์. เช่นเดียวกับที่เก็บหน่วยความจำ มันจะเริ่มลบรายการที่ใช้ล่าสุดเมื่อแคชถึงขนาดสูงสุด

:mem_cache_store เป็นที่เก็บแคชสำหรับสภาพแวดล้อมการผลิต ด้วยการใช้เซิร์ฟเวอร์ memcached กลาง แคชสามารถใช้ร่วมกันระหว่างเว็บเซิร์ฟเวอร์หลายตัวและแม้กระทั่งบนโฮสต์หลายตัวเมื่อใช้เซิร์ฟเวอร์ memcached ระยะไกล

ที่เก็บแคช Redis

Rails 5.2 เปิดตัว :redis_cache_store store ซึ่งให้คุณจัดเก็บรายการแคชใน Redis ได้เหมือนกับที่คุณใช้ร้าน Memcache

หากต้องการใช้ Redis เป็นที่เก็บแคชของ Rails ให้ใช้แคช Redis เฉพาะที่ตั้งค่าเป็น LRU แคช (ล่าสุดที่ใช้ล่าสุด) แทนที่จะชี้ร้านไปที่เซิร์ฟเวอร์ Redis ที่มีอยู่ของคุณ เพื่อให้แน่ใจว่ารายการจะถูกลบออกจากสโตร์เมื่อถึงขนาดสูงสุด

ร้านค้า Redis ทำงานร่วมกับ Redis gem (รวมถึง Redis::Distributed) และผู้ว่าจ้าง ตลอดจนให้การสนับสนุนตัวเลือกการกำหนดค่าต่างๆ เช่น การตั้งค่าเซิร์ฟเวอร์ระยะไกลหนึ่งเครื่องหรือหลายเครื่อง

cache_servers = %w[redis://cache-01:6379/0 redis://cache-02:6379/0]
config.cache_store = :redis_cache_store, { url: cache_servers }

Redis จะเขียนชุดข้อมูลลงดิสก์เป็นระยะ ดังนั้นข้อมูลแคชส่วนใหญ่ของคุณจะยังคงอยู่เมื่อเซิร์ฟเวอร์แคชรีสตาร์ท ในการพัฒนา รายการแคชสามารถลบออกจากคอนโซลได้โดยใช้ Rails.cache.delete .

ในการผลิต Redis เป็นคู่แข่งกับ Memcached ในการจัดหาที่เก็บแคชแบบรวมศูนย์ แม้ว่าการใช้งานในแอป Rails จะไม่แพร่หลายเท่า Memcached แต่ร้าน Redis จะกลายเป็นร้านแคช Rails ยอดนิยมในอนาคต

ควรใช้ที่จัดเก็บแคชใด

โดยทั่วไป ที่เก็บไฟล์และหน่วยความจำของ Rails นั้นยอดเยี่ยมสำหรับการพัฒนา แต่สามารถใช้ในการผลิตสำหรับแอพพลิเคชั่นขนาดเล็กเมื่อรู้และเข้าใจคำเตือน ร้านค้า Memcached และ Redis ระดับที่ใช้งานจริงมักจะเป็นตัวเลือกที่ดีกว่าสำหรับแอปที่ใช้งานจริงที่ใหญ่กว่า โดยเฉพาะอย่างยิ่งเมื่อใช้งานเว็บเซิร์ฟเวอร์หลายตัวบนหลายโฮสต์

สรุปภาพรวมของการจัดเก็บแคชใน Rails อย่าลืมตรวจสอบส่วนร้านค้าแคชในคู่มือ Rails เพื่อดูข้อมูลเพิ่มเติมและตัวเลือกการกำหนดค่าสำหรับแต่ละร้าน

คุณชอบบทความนี้และบทความก่อนหน้าในซีรีส์ AppSignal Academy อย่างไร เรามีบทความเพิ่มเติมเกี่ยวกับการแคชใน Rails เรียงกัน แต่โปรดอย่าลังเลที่จะแจ้งให้เราทราบว่าคุณต้องการให้เราเขียนเกี่ยวกับอะไร (เกี่ยวกับการแคชหรืออย่างอื่น) ต่อไป!