WordPress Object Caching: Redis, Memcached และ API ดั้งเดิม

เผยแพร่แล้ว: 2017-11-04

ไซต์ WordPress ระดับองค์กรที่สามารถปรับขนาดได้ตามต้องการ ต้องการกลไกการแคชแบบถาวรนอกเหนือจากหน้าและรูปภาพ ซึ่งเป็นกลไกที่สามารถแคชวัตถุ PHP จริงได้ แม้ว่า WordPress จะมีกลไกการแคชอ็อบเจ็กต์ผ่าน WordPress Object Cache แต่ก็มีโซลูชันอื่นๆ ที่ให้เลเวอเรจและพลังที่ยอดเยี่ยม ก่อน ที่เราจะพูดถึงทั้งหมดนั้น อันดับแรก เราต้องดูว่าการแคชวัตถุคืออะไรและทำงานอย่างไรใน PHP

การแคชวัตถุคืออะไร?

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

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

คุณสามารถใช้ฟังก์ชัน serialise() ของ PHP เพื่อแปลงอ็อบเจ็กต์หรือ primitive เป็นการแสดงตัวเลข (byte blob) ที่สามารถเก็บไว้ในหน่วยความจำหรือดิสก์สำหรับการเข้าถึงในภายหลัง จากนั้นคุณคำนวณหมายเลขแฮชของ byte blob โดยใช้ hash() และจัดเก็บทั้งคู่ แฮชเป็นคีย์ และ blob ไบต์เป็นค่า ในการดึงข้อมูล คุณใช้หมายเลขแฮชที่คำนวณได้ของ byte blob ซึ่งเดิมถูกเก็บไว้เป็นคีย์ คุณสามารถเปลี่ยนอะไรก็ได้ (String, Integer, Object, Boolean, Array เป็นต้น) ให้กลายเป็นการแสดงค่าที่จัดเก็บได้ด้วยวิธีนี้

ตัวอย่าง:

$serialized = serialize( array ( 'test' ));

ดำเนินการย้อนกลับด้วย unserialize():

$original = unserialize ( $serialized );

โดยทั่วไป มีสามวิธีในการแคชอ็อบเจ็กต์: การใช้ WordPress Object Cache, Transients API หรือที่เก็บคีย์-ค่าภายนอก เช่น Redis หรือ Memcached

WordPress Object caching

WordPress มี API การแคชวัตถุสองแบบ: WordPress Object Cache ดั้งเดิมและ API ชั่วคราว พวกเขาเหมือนกันและในขณะนี้อาจทำให้เกิดความสับสน แต่ก็มีเหตุผลที่อยู่เบื้องหลัง

WordPress Object Cache ดั้งเดิมสามารถจัดเก็บอ็อบเจ็กต์และ primitives ไว้ในแคชได้ แต่จะเก็บในลักษณะถาวรไม่ได้ตามค่าเริ่มต้น ซึ่งหมายความว่าการแคชเกิดขึ้นในหน่วยความจำ และอ็อบเจ็กต์ที่แคชจะไม่อยู่นอกเหนือวงจรชีวิตของคำขอ ดังนั้นคุณจึงไม่สามารถแชร์ออบเจ็กต์ที่แคชไว้ในการโหลดหน้าเว็บต่างๆ คุณต้องจัดหาการใช้งานร้านค้าของคุณเองด้วยการใช้ Drop-In ซึ่งเป็นปลั๊กอิน "ขั้นสูง" ที่สามารถขยายฟังก์ชันการทำงานของ WordPress ได้ คุณสามารถดูได้บนแดชบอร์ด WordPress ในรายการปลั๊กอิน:

WordPress Drop-Ins

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

WordPress ตรวจพบว่าคุณได้ใช้แคชอ็อบเจ็กต์แบบถาวรหรือไม่ และเมื่อพบว่าเป็นกรณีนี้ การเรียกใช้ Transients API จะถูกข้ามและกำหนดเส้นทางไปยัง WordPress Object Cache (และด้วยเหตุนี้จึงเหมือนกัน)

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

Redis และ Memcached

ที่เก็บคีย์-ค่าไม่ใช้ตารางและชนิดข้อมูลที่กำหนดไว้ล่วงหน้าเพื่อเก็บข้อมูลในระเบียน เช่น ใน RDBMS ออกแบบมาเพื่อจัดเก็บและเรียกคู่คีย์/ค่า เช่นเดียวกับโครงสร้างข้อมูลพจนานุกรมที่คุณพบในภาษาการเขียนโปรแกรม

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

Redis

Redis ไม่ได้เป็นเพียงที่เก็บคีย์-ค่าหรือแคชเท่านั้น รองรับการจำลองข้อมูล การเขียนสคริปต์ ความพร้อมใช้งานสูงในการกำหนดค่าคลัสเตอร์ คุณยังสามารถปรับระดับความคงอยู่ของดิสก์ที่คุณต้องการได้อย่างละเอียด ข้อดีของ Redis คือ หากคุณรีสตาร์ท แคชส่วนใหญ่จะยังอยู่บนดิสก์ โดยข้อมูลที่สูญหายจะมีเพียงเศษเสี้ยวเล็กๆ ประเด็นก็คือเมื่อรีสตาร์ท เซิร์ฟเวอร์จะต้องสร้างแคชใหม่ และโดยส่วนใหญ่แล้วจะเป็นการเพิ่มภาระงาน ด้วย Redis สิ่งนี้จะไม่เกิดขึ้น นอกจากนี้ วัตถุที่หมดอายุจะถูกลบออกจากฐานข้อมูลทันที ไม่มีค่าโสหุ้ยในการจัดการที่นั่นด้วย

Redis Labs มีหน้าที่ยอดเยี่ยมที่แสดงกรณีการใช้งาน Redis ในองค์กร: มีตั้งแต่ชุดข้อมูลขนาดใหญ่มาก ไปจนถึงการค้นหาข้อความแบบเต็ม ซีรี่ส์แบบเรียลไทม์ การรวม Spark และอื่นๆ

แม้ว่าคุณลักษณะทั้งหมดเหล่านี้จะมีค่าใช้จ่ายที่ซับซ้อนและอาจต้องใช้ความเร็วในบางกรณี การเพิ่มประสิทธิภาพโค้ด Redis Drop-In ของคุณอาจได้รับผลกำไรค่อนข้างน้อย อย่าลืมว่า Redis ทำการ แคชวัตถุแบบถาวร ซึ่งเป็นสิ่งที่ Memcached ไม่ทำ แม้ว่าจะใช้งานได้ง่ายกว่ามาก

Memcached

Memcached เป็นระบบแคชอ็อบเจ็กต์ประสิทธิภาพสูงในหน่วยความจำ ซึ่งเป็นไปตามเว็บไซต์ทางการ ออกแบบมาโดยเฉพาะเพื่อเพิ่มความเร็วเว็บแอปพลิเคชันไดนามิกและบรรเทาการโหลดฐานข้อมูล นอกจากนี้ยังใช้ง่ายกว่าและตรงไปตรงมากว่า Redis มาก

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

เนื่องจาก Memcached ใช้ฐานข้อมูลในหน่วยความจำเพื่อเก็บแคช จึงมีประสิทธิภาพมากในการแคชแบบสอบถาม SQL เอาต์พุตการเรียกใช้ฟังก์ชัน และอื่นๆ

ปลั๊กอิน WordPress

  • WP Redis ปลั๊กอิน Redis WordPress อย่างเป็นทางการ รองรับ WP-CLI การทำคลัสเตอร์และการจำลองแบบ
  • Redis Object Cache ปลั๊กอิน Redis แบ็คเอนด์อีกตัวสำหรับ WordPress
  • Memcached Object Cache แบ็กเอนด์สำหรับ Memcached
  • ลบ Expired Transients ปลั๊กอินนี้จะลบวัตถุชั่วคราวที่หมดอายุออกจากฐานข้อมูล รองรับหลายไซต์ด้วย!

วิธีเรียกใช้การวัดประสิทธิภาพ

ประเด็นของบทความของเราคือทำให้คุณรู้สึกตื่นเต้นเกี่ยวกับการแคชวัตถุและเริ่มปรับแต่งด้วยตัวเอง คุณสามารถลองใช้แคชแบบถาวรต่างๆ และดูว่าแอปพลิเคชันของคุณทำงานได้ดีเพียงใด คุณสามารถใช้ฟังก์ชัน microsecond() ของ PHP เพื่อวัดประสิทธิภาพการเรียก ตัวอย่างเช่น: โทร microsecond() ก่อนและหลังการเรียก wp_cache_get() ให้ลบค่าและเก็บผลลัพธ์ ทำเช่นนี้สำหรับการใช้แคชต่างๆ และดูว่าคุณสังเกตเห็นว่าประสิทธิภาพเพิ่มขึ้นในกรณีใดบ้าง

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

บทสรุป

สมมติว่าในการแสดงหน้าเว็บ แอปพลิเคชันจำเป็นต้องอ่านวัตถุชั่วคราว 2,000 รายการ นั่นหมายถึง 2,000 อ่านบนฐานข้อมูล ด้วยการใช้ระบบแคชอ็อบเจ็กต์แบบถาวร การอ่าน 2,000 รายการเหล่านี้จะถูกออฟโหลดไปยังที่เก็บคีย์-ค่า หากคุณใช้ memcached คุณอาจเสี่ยงที่จะสูญเสียแคชทั้งหมดในการรีสตาร์ทกะทันหัน โดยทั่วไป Redis อาจไม่เร็วเท่า Memcached แต่ฟีเจอร์ Enterprise และความคงอยู่จะเป็นประโยชน์กับคุณในระยะยาว

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