แนวคิดของ caching เป็นเรื่องสำคัญในวิทยาการคอมพิวเตอร์และเกี่ยวข้องโดยตรงกับการสร้างเว็บแอป ในระดับสูง caching ใช้ประโยชน์จากข้อเท็จจริงที่ว่า memory lookups เร็วกว่าและน้อยกว่า compute-intensive มากกว่า database queries ถ้าคุณมี database query ที่อาจทำซ้ำๆ การ cache ผลลัพธ์ใน cache จะเร่งการทำงาน Rails applications ไม่ใช่ข้อยกเว้น เพราะมักใช้ memory-based caches อย่าง Redis เพื่อ cache data และปรับปรุงประสิทธิภาพแอปพลิเคชัน

ไอเดียการใช้ database cache อาจดู counterproductive แต่การใช้ slower database-backed cache อย่าง Solid Cache ใน Rails สามารถเร่งแอปพลิเคชันได้ counterintuitively เพราะ cheaper storage ให้เรา cache สิ่งมากขึ้นและนานขึ้น ใน Rails 7.1 Solid Cache ถูกนำเสนอ ทำให้ database-backed application cache เป็นตัวเลือกที่สะดวกสำหรับ Rails application!
Rails Cache ทำงานอย่างไร
Caching ใน Ruby on Rails เป็นส่วนสำคัญของการเพิ่มประสิทธิภาพแอปพลิเคชัน มี caching หลายประเภทที่นักพัฒนาสามารถใช้เพื่อเพิ่มประสิทธิภาพ: page caching, action caching, fragment caching, low-level caching, SQL caching และอื่นๆ ในบทความนี้ เราจะพูดถึง low-level caching หลัก เพราะมัน straightforward และ compatible กับ cache_store ที่ config ได้
ActiveSupport ชิ้นใหญ่ของ Rails framework ให้เรา interact และ configure cache ผ่าน cache_store ใน config/environments/ มีไฟล์แต่ละ environment name พร้อม configurations ต่างๆ รวมถึงการเลือก cache_store
การตั้งค่า cache_store value
Redis เป็น cache store ยอดนิยมมาก และได้รับการ採用ทั่วอุตสาหกรรม ถ้าแอปพลิเคชันใช้ Redis สำหรับ caching ใน production คุณจะเห็นบรรทัด Ruby นี้ใน config/environments/production.rb:
config.cache_store = :redis_cache_store
Redis ถูกใช้เพราะมันเป็น memory cache และหน่วยความจำมี read access times เร็วกว่าการเข้าถึงดิสก์หรือ database query มาก
การ Cache Database Query ใน Rails
คุณอาจใช้ low-level caching เพื่อเก็บผลลัพธ์ของ expensive database query ที่คืนค่าข้อมูลที่ไม่ค่อยเปลี่ยนแปลง อาจดูประมาณนี้:
Rails.cache.fetch("courses", expires_in: 12.hours) do Courses.all end
ถ้าคุณใช้ Redis เป็น cache store โค้ดนี้จะตรวจสอบก่อนว่า key "courses" มีค่าจาก 12 ชั่วโมงล่าสุดหรือไม่ ถ้ามี จะคืนค่านั้นทันทีโดยไม่ execute code block ถ้า cache ไม่มีค่านั้น เรียกว่า "cache miss" Cache miss จะทำให้ interpreter execute block เก็บผลลัพธ์ใน cache และคืนค่าผลลัพธ์
Rails Solid Cache คืออะไร
รูปแบบ caching ที่เราเดินผ่านมาข้างต้นให้ประโยชน์ด้านประสิทธิภาพเพราะ memory access เร็วกว่า API calls และ database queries อย่างไรก็ตาม memory ราคาแพง และจึงจำกัด ด้วยเหตุที่ memory จำกัด เราต้อง minimize สิ่งที่เก็บใน cache และระยะเวลา คุณไม่สามารถ cache ทุกอย่างเป็นเวลาอันยาวนาน เพราะจะหมด memory ใน cache เร็วๆ นี้ ประโยชน์ด้านประสิทธิภาพจาก caching 全部เกี่ยวกับ tradeoffs คุณ cache บางอย่างเป็นบางเวลา เพื่อไม่ต้องทำ time-intensive tasks ซ้ำ
Rails 7.1 release มาพร้อม Solid Cache ตัวเลือกสำหรับ ActiveRecord::Cache::Store ที่ใช้ SQL database สำหรับ cache store ทุกครั้งที่อ่านจาก cache จะช้ากว่า แต่ขอบคุณความก้าวหน้าทางเทคโนโลยีและ built-in memory caches ในหลาย databases ความต่างยังคงมีประโยชน์
การใช้ SQL database เป็น cache store ให้คุณ storage มากกว่าหลายเท่าที่ราคาถูกกว่ามาก ทำให้แอปพลิเคชัน cache ข้อมูลมากขึ้นได้สำหรับระยะเวลานานขึ้น ทีม Basecamp เขียนบทความเกี่ยวกับว่ามันเร่งแอปของพวกเขาได้ ซึ่งอาจดู counterintuitive
เมื่อไหร่ควรใช้ Solid Cache
แม้ memory caches อย่าง Redis จะมักเสนอ faster reads จาก cache Solid Cache นำเสนอ alternative ที่ดีในหลายสถานการณ์
ถ้าแอปพลิเคชันของคุณต้องการ cache ปริมาณข้อมูลมาก การเก็บใน memory อาจแพงเกินไป Solid Cache อนุญาตให้ cache size ใหญ่ขึ้นมากในสัดส่วนต้นทุนที่เพียงเศษส่วน
ถ้าแอปพลิเคชันของคุณไม่ sensitive ต่อ few milliseconds ของ added cache retrieval time Solid Cache ให้ balance ดีระหว่างประสิทธิภาพและต้นทุน ถ้าคุณทน latency เพิ่มขึ้นได้ Solid Cache เป็นโซลูชันที่ดี
แยกจากนั้น ใน setups ที่การ manage Redis instance แยกเป็น impractical Solid Cache ทำให้ deployment เรียบง่ายโดยอนุญาตให้ caching ถูกจัดการโดย existing database โดยไม่ต้อง support Redis
การติดตั้ง Solid Cache
Solid Cache Readme มีคำแนะนำที่ช่วยเหลือในการนำเข้าไปใน Rails application ก่อนอื่น เพิ่ม gem ใน Gemfile:
gem "solid_cache"
ต่อไป ติดตั้งด้วย Bundler:
bundle install
ต่อไป เพิ่ม migration ให้ database ทำงานกับ Solid Cache รันคำสั่ง:
bin/rails solid_cache:install:migrations
สุดท้าย รัน migration ที่สร้างขึ้น:
bin/rails db:migrate
การ Implement Solid Cache ใน Rails app
การสลับ Solid Cache แทน cache ที่มีอยู่ปกติจะ straightforward ใน environment config เช่น config/environments/production.rb เปลี่ยนการตั้งค่า cache_store เป็น:
config.cache_store = :solid_cache_store
นี่คือทั้งหมดที่ต้องการเพื่อเริ่มใช้ Solid Cache เป็น cache store! มัน support ทุก ActiveSupport::Cache::Store configuration options และ additional options เพื่อ support database sharding หรือความต้องการเฉพาะอื่นๆ
คุณควรทราบว่านี้เปลี่ยน cache store ใน production เท่านั้น ถ้าคุณจะ test ใน environments อื่น คุณจะต้องเปลี่ยนค่าที่นั่นด้วย
คุณจะเปลี่ยนมาใช้ Solid Cache ใน Rails ไหม?
การนำเสนอ Solid Cache ใน Rails 7.1 หมายถึงการพัฒนาที่สำคัญในโลกของ Rails caching strategies โซลูชันนี้เสนอมุมมองใหม่เกี่ยวกับการเพิ่มประสิทธิภาพแอปพลิเคชัน ท้าทายความชอบเดิมๆ สำหรับ memory-based caches อย่าง Redis
ด้วยการใช้ SQL database สำหรับ caching Solid Cache ช่วยให้แอปพลิเคชันเก็บปริมาณข้อมูลมากขึ้นสำหรับช่วงเวลายาวขึ้น ทำลายข้อจำกัดที่ถูกกำหนดโดยต้นทุนและความจุของ memory storage แนวทางนี้ไม่เพียงแต่ขยายปริมาณที่ cache ได้อย่างมีประสิทธิภาพ แต่ยังมีศักยภาพให้ประโยชน์ด้านประสิทธิภาพมากกว่านี้
ด้วย ذلك การตัดสินใจเปลี่ยนขึ้นอยู่กับความต้องการเฉพาะของแอปพลิเคชันของคุณ ถ้าแอปของคุณได้ประโยชน์มากจาก high-speed caching และคุณมี infrastructure รองรับ Redis คุณอาจไม่ต้องการ Solid Cache อย่างไรก็ตาม ถ้าคุณมองหาวิธี cost-effective ในการ cache ปริมาณข้อมูลมหาศาลโดยไม่เพิ่ม service อื่นใน stack Solid Cache อาจคุ้มค่าที่จะสำรวจ แม้คุณแค่อยากหลีกเลี่ยงการ support Redis Solid Cache อาจเพียงพอและดีกว่าสำหรับแอปของคุณ
ถ้าคุณชอบบทความนี้ สมัคร newsletter ของ Honeybadger เพื่อรับบทความ Ruby และ Rails เพิ่มเติมแบบนี้ในกล่องจดหมายของคุณ!