การพัฒนาแอปพลิเคชันด้วย Redis เป็นเรื่องที่สนุกมาก แต่เช่นเดียวกับเทคโนโลยีอื่นๆ มีบางจุดที่คุณควรคำนึงถึงขณะออกแบบแอปพลิเคชันเนมสเปซที่ใช้ Redis หรือ Redis คุณอาจคุ้นเคยกับการพัฒนาฐานข้อมูลเชิงสัมพันธ์อยู่แล้ว แต่ในขณะที่มีแนวทางปฏิบัติที่เหมือนกันหลายประการ โปรดจำไว้ว่า Redis เป็นฐานข้อมูลในหน่วยความจำและเป็น (ส่วนใหญ่) แบบเธรดเดียว อ่านต่อไปเพื่อสำรวจแนวทางปฏิบัติที่ดีที่สุดของคีย์ Redis
ดังนั้นจึงมีลักษณะเฉพาะหลายประการที่คุณควรใส่ใจเมื่อใช้ Redis:
1. ติดตามคีย์ของคุณด้วยเนมสเปซ Redis
ฐานข้อมูลจัดเก็บข้อมูล แต่นักพัฒนาซอฟต์แวร์ทุกคนอาจสูญเสียการติดตามข้อมูลบางส่วนที่คุณใส่ลงใน Redis นี่เป็นเรื่องธรรมดาเท่านั้น เนื่องจากข้อกำหนดของแอปพลิเคชันของคุณเปลี่ยนไปหรือคุณเปลี่ยนวิธีการจัดเก็บข้อมูล บางทีคุณอาจละเลยที่จะหมดอายุคีย์บางส่วน หรือโมดูลของแอปพลิเคชันอาจถูกยกเลิก
ไม่ว่าในกรณีใด ข้อมูลบางส่วนในฐานข้อมูล Redis ของคุณจะไม่ได้ใช้อีกต่อไปและใช้พื้นที่ว่างโดยไม่ได้ตั้งใจ ลักษณะที่ไม่มีสคีมาของ Redis ทำให้ยากต่อความเข้าใจเนื้อหาของชุดข้อมูลของคุณ เว้นแต่คุณจะใช้ระบบการตั้งชื่อที่ชัดเจนสำหรับคีย์ของคุณ การใช้วิธีการตั้งชื่อที่เหมาะสมกับเนมสเปซ Redis สำหรับคีย์ของคุณจะทำให้การดูแลฐานข้อมูลของคุณง่ายขึ้นมาก เมื่อคุณเนมสเปซคีย์ของคุณตามแอปพลิเคชันหรือบริการ หลักการคือการใช้อักขระทวิภาค (':') เพื่อคั่นส่วนต่างๆ ของชื่อคีย์ - แนวทางปฏิบัติที่ดีที่สุดสำหรับเนมสเปซ Redis ด้วยวิธีนี้ คุณจะสามารถระบุได้อย่างง่ายดายระหว่างการย้ายข้อมูล การแปลง การลบ หรือการย้ายข้อมูล เนมสเปซ Redis และคีย์เนมสเปซ Redis ช่วยในการระบุนี้
นอกเหนือจากเนมสเปซ Redis แล้ว กรณีการใช้งานทั่วไปอีกกรณีหนึ่งสำหรับ Redis ก็คือที่เก็บข้อมูลสำรองสำหรับรายการข้อมูล "ร้อนแรง" ในขณะที่ข้อมูลส่วนใหญ่จะถูกเก็บไว้ในฐานข้อมูลอื่น (เช่น PostgreSQL, MongoDB) ในกรณีเช่นนี้ นักพัฒนามักจะลืมลบข้อมูลออกจาก Redis เมื่อถูกย้ายจากที่เก็บข้อมูลหลัก การพึ่งพา cross-datastore ประเภทนี้ต้องการการลบแบบเรียงซ้อน ซึ่งสามารถนำไปใช้ได้โดยการเก็บตัวระบุทั้งหมดสำหรับรายการข้อมูลที่กำหนดในชุด Redis เพื่อให้แน่ใจว่าขั้นตอนการล้างข้อมูลที่ถูกเรียกใช้หลังจากลบออกจากที่จัดเก็บข้อมูลหลักจะต้องทำซ้ำผ่านเนื้อหาของชุดนั้นเพื่อลบสำเนาที่เกี่ยวข้องและเกร็ดเล็กเกร็ดน้อยที่เกี่ยวข้องทั้งหมด (รวมถึงชุดเองเมื่อเสร็จสิ้น)
2. ติดตามความยาวของชื่อคีย์ของคุณ
สิ่งนี้อาจดูขัดแย้งกับเนมสเปซ Redis ด้านบน แต่เนื่องจากชื่อคีย์ใช้หน่วยความจำเช่นกัน คุณจึงควรพยายามทำให้สั้นที่สุด เห็นได้ชัดว่าสิ่งนี้กลายเป็นปัญหากับชุดข้อมูลที่ประกอบด้วยคีย์นับล้านหรือพันล้าน แต่ความจริงก็คือคีย์แบบยาวมีราคาพร้อมแฮชเทเบิลใด ๆ
ตัวอย่างเช่น ให้พิจารณาว่าการจัดเก็บ 1,000,000 คีย์ด้วยเนมสเปซ Redis ซึ่งแต่ละชุดมีค่า 32 อักขระ จะใช้ประมาณ 96MB เมื่อใช้ชื่อคีย์ 6 อักขระ และ 111MB ที่มีชื่อ 12 อักขระ (บนเซิร์ฟเวอร์ Redis แบบ 32 บิต) ค่าใช้จ่ายที่มากกว่า 15% นี้ค่อนข้างสำคัญเมื่อจำนวนคีย์ของคุณเพิ่มขึ้น ด้วย Redis การลบคีย์พร้อมคำนำหน้าก็เป็นไปได้เช่นกัน
3. ใช้โครงสร้างข้อมูลที่ถูกต้อง
อาจเป็นเพราะการใช้หน่วยความจำหรือประสิทธิภาพ บางครั้งโครงสร้างข้อมูลแบบหนึ่งก็เหมาะกับชุดข้อมูลของคุณมากกว่าแบบอื่น แนวทางปฏิบัติที่ดีที่สุดบางประการที่ควรคำนึงถึงมีดังนี้
-
แทนที่จะจัดเก็บข้อมูลของคุณในค่าสตริงอิสระนับพัน (หรือหลายล้าน) ให้พิจารณาจัดกลุ่มข้อมูลที่เกี่ยวข้องด้วยโครงสร้างข้อมูลแฮช แฮชนั้นมีประสิทธิภาพมากและสามารถลดการใช้หน่วยความจำของคุณ (แถมยังให้คุณค่าเพิ่มเติมในการสรุปรายละเอียดบางส่วนและทำให้โค้ดของคุณอ่านง่ายขึ้น) สำหรับข้อมูลเพิ่มเติม โปรดดูบทความนี้
-
หากมี ให้ใช้รายการแทนชุด หากคุณไม่ต้องการคุณสมบัติของชุดเพื่อให้แน่ใจว่าไม่ซ้ำกันหรือตรวจสอบความเป็นสมาชิก รายการจะใช้หน่วยความจำน้อยลงและทำการแทรกได้เร็วขึ้น
-
ชุดที่จัดเรียงเป็นโครงสร้างข้อมูลที่แพงที่สุด ทั้งในแง่ของการใช้หน่วยความจำและความซับซ้อนของการดำเนินงานขั้นพื้นฐาน (เช่น ZADDing สมาชิกใหม่) หากคุณต้องการเพียงวิธีค้นหาคะแนนและลำดับไม่สำคัญ ให้ลองใช้แฮชแทน
-
คุณลักษณะที่มักถูกมองข้ามใน Redis คือบิตแมปหรือบิตเซ็ต (มีตั้งแต่เวอร์ชัน 2.2) ชุดบิตช่วยให้คุณดำเนินการระดับบิตได้หลายระดับกับค่า Redis ซึ่งอาจหมายถึงการจัดเก็บข้อมูลจำนวนมากอย่างมีประสิทธิภาพ สามารถใช้ตัวอย่างเช่นสำหรับการวิเคราะห์ที่มีน้ำหนักเบา
4. ใช้ SCAN ห้ามใช้ KEYS
คำสั่ง SCAN พร้อมใช้งานโดยเริ่มด้วย Redis v2.8 และช่วยให้คุณสามารถดึงคีย์ในคีย์สเปซโดยใช้เคอร์เซอร์ ลักษณะการทำงานนี้ไม่เหมือนกับคำสั่ง (hiss) KEYS ซึ่งส่งคืนองค์ประกอบที่ตรงกันทั้งหมดในครั้งเดียว แต่ถือว่ามีความเสี่ยงในการผลิต เนื่องจากอาจบล็อกเซิร์ฟเวอร์ Redis ของคุณ และอาจใช้ทรัพยากร RAM หมด ในทางกลับกัน SCAN ทำให้สามารถตรวจสอบข้อมูลได้โดยไม่ต้องเสี่ยงกับการบล็อกเซิร์ฟเวอร์ของคุณหรือต้องพึ่งพาทาส
โปรดทราบว่า SCAN ต้องการให้คุณอ่านค่าเคอร์เซอร์ที่ส่งไปยังการเรียก SCAN ครั้งต่อไป SCAN ยังยอมรับรูปแบบชื่อคีย์และอาร์กิวเมนต์การนับที่เป็นตัวเลือก ความแตกต่างอีกประการระหว่าง SCAN และ KEYS คือ เป็นไปได้ที่จะได้รับชื่อคีย์เดียวกันมากกว่าหนึ่งครั้งด้วย SCAN
SCAN มาพร้อมกับ SSCAN, HSCAN และ ZSCAN ซึ่งช่วยให้คุณทำซ้ำเนื้อหาของชุด แฮช และชุดที่จัดเรียง (ตามลำดับ)
5. ใช้สคริปต์ Lua ฝั่งเซิร์ฟเวอร์
ในฐานะนักพัฒนา คุณจะสำรวจพื้นที่ที่คุ้นเคยเมื่อคุณยอมรับความสามารถของ Redis ในการเรียกใช้สคริปต์ Lua หนึ่งในภาษาที่ง่ายที่สุดในการรับ Lua มอบความสามารถในการแสดงความคิดสร้างสรรค์ของคุณด้วยโค้ดที่ทำงานภายในเซิร์ฟเวอร์ Redis เมื่อใช้อย่างถูกต้อง สคริปต์ Lua สามารถสร้างโลกที่แตกต่างในแง่ของประสิทธิภาพและการใช้ทรัพยากร แทนที่จะนำข้อมูลไปยัง CPU (ของแอปพลิเคชัน) สคริปต์จะอนุญาตให้คุณใช้ตรรกะใกล้กับข้อมูล ซึ่งจะช่วยลดเวลาแฝงของเครือข่ายและการส่งข้อมูลซ้ำซ้อน
ตัวอย่างคลาสสิกของผลกระทบอันน่าทึ่งของ Lua เกิดขึ้นเมื่อคุณดึงข้อมูลจำนวนมากจาก Redis เท่านั้นเพื่อกรองหรือรวมข้อมูลในแอปพลิเคชันของคุณ เมื่อสรุปเวิร์กโฟลว์การประมวลผลในสคริปต์ คุณจะต้องเรียกใช้มันเพื่อให้ได้คำตอบที่มีขนาดเล็กลงอย่างมากในเวลาเพียงเสี้ยวเดียวและทรัพยากร
เคล็ดลับสำหรับมือโปร: Lua นั้นยอดเยี่ยม แต่เมื่อคุณย้ายเวิร์กโฟลว์ไปที่มัน คุณอาจพบว่าการรายงานและการจัดการข้อผิดพลาดนั้นยากขึ้น (คุณกำลังทำงานอยู่ภายในเซิร์ฟเวอร์ Redis) วิธีหนึ่งที่ชาญฉลาดในการใช้ Pub/Sub ของ Redis และให้สคริปต์ของคุณเผยแพร่ข้อความ "บันทึก" ไปยังช่องเฉพาะ จากนั้น ตั้งค่ากระบวนการสมัครสมาชิกเพื่อรับข้อความเหล่านี้และจัดการตามนั้น
อาจมีเคล็ดลับสำคัญอื่นๆ อีกมากมายที่คุณจะได้รับในระหว่างการหลบหนีจาก Redis แต่รายการนี้จะช่วยคุณในการเริ่มต้นกับสิ่งที่สำคัญที่สุด หากคุณมีข้อเสนอแนะอื่น ๆ ที่คุณต้องการแบ่งปัน ข้อเสนอแนะหรือคำถาม - โปรดตะโกนใส่ฉัน ฉันพร้อมเสมอ 🙂