จุดของฐานข้อมูล Redis หลายรายการคืออะไร


159

ดังนั้นฉันมาถึงสถานที่ที่ฉันต้องการแบ่งส่วนข้อมูลที่ฉันเก็บไว้ใน redis เป็นฐานข้อมูลแยกกันเพราะบางครั้งฉันจำเป็นต้องใช้คำสั่ง keys กับข้อมูลชนิดหนึ่งและต้องการแยกให้เร็วขึ้น .

ถ้าฉันแบ่งส่วนเป็นหลายฐานข้อมูลทุกอย่างยังคงเป็นเธรดเดียวและฉันยังคงใช้แกนเดียวเท่านั้น ถ้าฉันเพิ่งเปิดตัว Redis อีกอันในกล่องเดียวกันฉันจะใช้แกนพิเศษ ยิ่งไปกว่านั้นฉันไม่สามารถตั้งชื่อฐานข้อมูล Redis หรือให้ตัวระบุเชิงตรรกะเพิ่มเติมใด ๆ กับพวกเขา ดังนั้นทั้งหมดที่กล่าวว่าทำไม / เมื่อใดที่ฉันจะต้องการใช้หลายฐานข้อมูล Redis แทนที่จะเพียงแค่หมุนตัวอย่างเพิ่มเติมของ Redis สำหรับแต่ละฐานข้อมูลเพิ่มเติมที่ฉันต้องการ และที่เกี่ยวข้องทำไม Redis จึงไม่พยายามใช้ core พิเศษสำหรับฐานข้อมูลพิเศษแต่ละอันที่ฉันเพิ่มเข้าไป ข้อดีของการเป็นเธรดเดี่ยวข้ามฐานข้อมูลคืออะไร


ในแอป Node.js ของคุณให้ทำดังนี้ ---> module.exports = {"1": "ชื่อของคุณสำหรับ redis db one", "2": "ชื่อของคุณสำหรับ redis db สอง", "3": "ของคุณ ชื่อสำหรับ redis db สาม "} ฯลฯ หรือเปลี่ยนปุ่มและค่าสิ่งที่คุณต้องการ
Alexander Mills

1
ใน Redis 2.8.0 ขึ้นไปขอแนะนำให้คุณใช้ SCAN แทน KEYS เนื่องจากจะวนซ้ำองค์ประกอบจำนวนน้อยในแต่ละครั้ง (ดังนั้นจึงไม่บล็อกเซิร์ฟเวอร์เป็นเวลานาน)
TryHarder

คำตอบ:


85

ในหลักการฐานข้อมูล Redis บนอินสแตนซ์เดียวกันจะไม่ต่างจากสกีมาในอินสแตนซ์ฐานข้อมูล RDBMS

ดังนั้นทั้งหมดที่กล่าวว่าทำไม / เมื่อใดที่ฉันจะต้องการใช้หลายฐานข้อมูล Redis แทนที่จะเพียงแค่หมุนตัวอย่างเพิ่มเติมของ Redis สำหรับแต่ละฐานข้อมูลเพิ่มเติมที่ฉันต้องการ

มีข้อดีอย่างหนึ่งที่ชัดเจนของการใช้ฐานข้อมูล Redis ในอินสแตนซ์ Redis เดียวกันและนั่นคือการจัดการ หากคุณแยกอินสแตนซ์ที่แยกต่างหากสำหรับแต่ละแอปพลิเคชันและสมมติว่าคุณมี 3 แอพนั่นคืออินสแตนซ์ Redis แยก 3 ตัวซึ่งแต่ละอันจะต้องใช้ทาสสำหรับ HA ในการผลิตดังนั้นนั่นคืออินสแตนซ์ทั้งหมด 6 รายการ จากมุมมองของการจัดการสิ่งนี้จะทำให้เกิดความยุ่งเหยิงอย่างรวดเร็วเพราะคุณจำเป็นต้องตรวจสอบทั้งหมดของพวกเขาทำการอัพเกรด / แพทช์ ฯลฯ หากคุณไม่ได้วางแผนที่จะโหลด redis ด้วย I / O ที่มีค่าสูง จัดการได้ง่ายกว่าหากเป็นไปตาม SLA ของคุณ


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

3
นี่ไม่ได้กล่าวถึงคะแนน OPs: (1) ทำไม Redis ไม่ลองใช้ core พิเศษสำหรับแต่ละฐานข้อมูลเพิ่มเติม? (2) ข้อดีของการเป็นเธรดเดี่ยวข้ามฐานข้อมูลคืออะไร
อีฟส์

93

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

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

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

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

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

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


57
เลิกใช้ฐานข้อมูลหลาย ๆ คุณสามารถให้การอ้างอิงสำหรับคำสั่งนั้นได้ไหม ฉันทราบว่าหลายฐานข้อมูลไม่ได้รับการสนับสนุนใน Redis Cluster แต่ไม่มีคำสั่งหลายคีย์ที่ซับซ้อนและไม่ได้คัดค้าน
ostergaard

27
หลักฐานบางอย่าง (ที่รัดกุม)จาก 'เจ้าของ' ของ Redis (ตามรหัสของ Google) ว่า "... ฐานข้อมูลจะไม่ถูกคัดค้านแม้ว่าฉันในอดีตจะระบุว่าพวกเขาจะเป็นเช่นนั้น"
Kenny Evitt

3
คุณจะไม่สามารถใช้ redis db มากกว่าหนึ่งตัวบน redis-cluster นอกเหนือจากนั้นหลายฐานข้อมูลจะยังคงเป็นสิ่ง
coredump

26
-1 สำหรับคำสั่งที่เลิกใช้แล้ว ฐานข้อมูลจำนวนมากอาจไม่ได้รับการสนับสนุนและไม่ได้รับการสนับสนุนใน redis-cluster แต่ไม่ได้คัดค้าน
AgDude

1
@ the-real-bill คุณจะ "สร้างดัชนีคีย์" ได้อย่างไร?
Kees de Kooter

57

แม้แต่ Salvatore Sanfilippo (ผู้สร้าง Redis) ก็คิดว่ามันเป็นความคิดที่ดีที่จะใช้ DBs หลาย ๆ ตัวใน Redis ดูความคิดเห็นของเขาที่นี่:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

ฉันเข้าใจว่าสิ่งนี้มีประโยชน์ แต่น่าเสียดายที่ฉันพิจารณาข้อผิดพลาดของฐานข้อมูลหลายตัวของ Redis การตัดสินใจที่แย่ที่สุดของฉันในการออกแบบ Redis เลย ... โดยไม่ได้รับผลประโยชน์ใด ๆ เลยมันทำให้ internals มีความซับซ้อนมากขึ้น ความจริงก็คือฐานข้อมูลไม่ได้ปรับขนาดด้วยเหตุผลหลายประการเช่นการหมดอายุของคีย์และ VM หากการเลือก DB สามารถดำเนินการได้ด้วยสตริงฉันสามารถเห็นคุณลักษณะนี้ถูกใช้เป็นเลเยอร์พจนานุกรม O (1) ที่ปรับขนาดได้ซึ่งไม่ใช่การแทนที่

ด้วยตัวเลขฐานมีค่าเริ่มต้นของฐานข้อมูลไม่กี่เราจะสื่อสารที่ดีกว่าสิ่งที่คุณสมบัตินี้คืออะไรและฉันสามารถใช้งานได้อย่างไร ฉันหวังว่าในบางครั้งเราสามารถทิ้งการสนับสนุนฐานข้อมูลหลาย ๆ ตัวได้ทั้งหมด แต่ฉันคิดว่ามันอาจจะสายเกินไปเนื่องจากมีผู้คนจำนวนมากที่ใช้คุณสมบัตินี้สำหรับงานของพวกเขา


4
พักไว้ดังนั้นการเลือกฐานข้อมูลจึงมีประสิทธิภาพน้อยกว่าการใช้คำนำหน้าใช่ไหม นี่คือความหมายของประโยคนี้หรือไม่ "หากการเลือกฐานข้อมูลสามารถทำได้ด้วยสตริงฉันสามารถเห็นคุณสมบัตินี้ถูกใช้เป็นเลเยอร์พจนานุกรม O (1) ที่ปรับขนาดได้
dvtan

8
  1. ฉันไม่ทราบถึงประโยชน์ใด ๆ ของการมีฐานข้อมูลหลายตัวในอินสแตนซ์เดียว ฉันเดาว่ามีประโยชน์ถ้าบริการหลายอย่างใช้เซิร์ฟเวอร์ฐานข้อมูลเดียวกันดังนั้นคุณสามารถหลีกเลี่ยงการชนกันของข้อมูลที่สำคัญได้

  2. ฉันจะไม่แนะนำการสร้างสิ่งรอบตัวโดยใช้KEYSคำสั่งเนื่องจากมันเป็น O (n) และมันไม่ได้ปรับขนาดได้ดี คุณใช้อะไรเพื่อให้คุณประสบความสำเร็จในอีกทางหนึ่ง? บางที Redis อาจจะไม่ใช่สิ่งที่ดีที่สุดสำหรับคุณหากฟังก์ชั่นเช่นKEYSนั้นสำคัญ

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


ในการตอบสนองต่อ 2: ฉันใช้คำสั่ง keys เฉพาะเมื่อฉันต้องการคีย์ทั้งหมด ฉันใช้มันในลักษณะเดียวกับที่จะใช้ hgetall ทั้งสองเป็น O (n) คีย์ไม่ดีถ้าคุณต้องการค้นหาชุดคีย์ขนาดใหญ่สำหรับ regex บางส่วน แต่ก็ใช้ได้ดีถ้าคุณต้องการดำเนินการกับคีย์ทั้งหมดใน db บางตัว ในการตอบสนองต่อ 3: ฉันเข้าใจถึงประโยชน์ของการทำเธรดเดี่ยวในฐานข้อมูลเดียว ฉันไม่เข้าใจในฐานข้อมูลจำนวนมากเนื่องจากการกระทำในฐานข้อมูลหนึ่งไม่จำเป็นต้องปิดกั้นการดำเนินการในฐานข้อมูลอื่น AFAIK
อีไล

3

ฉันกำลังใช้ redis ในการนำบัญชีดำของที่อยู่อีเมลไปใช้และฉันมีค่า TTL ที่ต่างกันสำหรับการขึ้นบัญชีดำในระดับต่างๆดังนั้นการมีฐานข้อมูลที่แตกต่างกันในอินสแตนซ์เดียวกันช่วยฉันได้มาก


1
ขณะนี้เรากำลังเผชิญปัญหาเดียวกัน - เราต้องการกำหนดนโยบาย LRU ที่แตกต่างกันสำหรับส่วนต่างๆของข้อมูลของเรา คุณกรุณาแบ่งปันวิธีที่คุณใช้งานนี้ได้อย่างไร
2717436

@ user2717436 ฉันไม่แน่ใจว่าสิ่งที่ฉันทำเกี่ยวข้องกับคุณหรือไม่ แต่ฉันใช้ฐานข้อมูลที่แตกต่างกันเป็นชุดที่แตกต่างกันให้ตั้งค่า TTL ของปุ่มทุกครั้งที่ฉันใส่มัน เช่นมีบัญชีดำ A บน redis.get (1) และเมื่อใดก็ตามที่ฉันตั้งค่าคีย์ที่นั่นฉันตั้งค่าหมดอายุเป็น 5,000 และมีบัญชีดำ B ใน redis.get (2) และเมื่อใดก็ตามที่ฉันตั้งค่ากุญแจที่นั่นฉันตั้งหมดอายุ 10,000
kommradHomer

2

ฐานข้อมูล Redis สามารถใช้ในกรณีที่ไม่ค่อยเกิดขึ้นในการปรับใช้แอปพลิเคชันเวอร์ชันใหม่ซึ่งเวอร์ชันใหม่ต้องใช้งานกับเอนทิตีที่แตกต่างกัน


1

การใช้หลายฐานข้อมูลในอินสแตนซ์เดียวอาจมีประโยชน์ในสถานการณ์ต่อไปนี้:

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


1

ฉันรู้ว่าคำถามนี้มีอายุหลายปี แต่มีสาเหตุอีกหลายฐานข้อมูลที่อาจเป็นประโยชน์

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

การใช้ฐานข้อมูลคุณสามารถใช้ Redis cloud อินสแตนซ์เดียวกันเพื่อให้บริการสำหรับ (พูด) dev, UAT และการผลิตหรือหลายอินสแตนซ์ของแอปพลิเคชันของคุณหรืออะไรก็ตาม - ดังนั้นใช้หน่วยความจำที่จัดสรรมากขึ้น มีประสิทธิภาพ

กรณีใช้งานที่ฉันกำลังดูมีแอพพลิเคชั่นหลายตัวที่ใช้ 200-300K ในแต่ละครั้ง แต่การจัดสรรขั้นต่ำสำหรับผู้ให้บริการคลาวด์ของฉันคือ 1M เราสามารถรวม 10 อินสแตนซ์ไว้ใน Redis เดียวโดยไม่ต้องสร้างปัญหาใด ๆ และช่วยประหยัดค่าใช้จ่ายโฮสติ้ง Redis ประมาณ 90% ฉันขอขอบคุณที่มีข้อ จำกัด และปัญหาเกี่ยวกับวิธีการนี้ แต่คิดว่ามันควรค่าแก่การกล่าวขวัญ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.