ข้อกำหนดในการตั้งชื่อคีย์อีกครั้งหรือไม่


226

การตั้งชื่อตามปกติสำหรับกุญแจใน Redis คืออะไร? ฉันเห็นค่าคั่นด้วย:แต่ฉันไม่แน่ใจว่าการประชุมปกติคืออะไรหรือเพราะอะไร

สำหรับผู้ใช้คุณจะทำอะไรเช่น ...

user:00

ถ้า ID ของผู้ใช้คือ 00

คุณสามารถค้นหาเฉพาะจุดเริ่มต้นของคีย์เพื่อส่งคืนผู้ใช้ทั้งหมดหรือไม่

ฉันแค่หวังว่าจะหลีกเลี่ยงปัญหาในอนาคตโดยการค้นคว้าหาวิธีที่เหมาะกับผู้คนและทำไมพวกเขาถึงเลือกพวกเขา

คำตอบ:


205

การตั้งชื่อตามปกติสำหรับกุญแจใน Redis คืออะไร? ฉันเห็นค่าคั่นด้วย: แต่ฉันไม่แน่ใจว่าการประชุมปกติคืออะไรหรือเพราะอะไร

ใช่เครื่องหมายลำไส้ใหญ่:เป็นแบบแผนเมื่อตั้งชื่อคีย์ ในบทช่วยสอนนี้เกี่ยวกับเว็บไซต์ redis มีการระบุ: พยายามติดกับสคีมา ตัวอย่างเช่น "object-type: id: field" อาจเป็นแนวคิดที่ดีเช่นใน "ผู้ใช้: 1000: รหัสผ่าน" ฉันชอบใช้จุดสำหรับฟิลด์หลายคำเช่นใน "ความคิดเห็น: 1234: reply.to"

คุณสามารถค้นหาเฉพาะจุดเริ่มต้นของคีย์เพื่อส่งคืนผู้ใช้ทั้งหมดหรือไม่

หากคุณ someting หมายถึงชอบโดยตรงสอบถามสำหรับคีย์ทั้งหมดซึ่งเริ่มต้นด้วยการuser:มีปุ่มคำสั่งที่ อย่างไรก็ตามคำสั่งนี้ควรใช้เพื่อจุดประสงค์ในการดีบั๊กเท่านั้นเนื่องจากเป็นO (N)เนื่องจากมันค้นหาผ่านคีย์ทั้งหมดที่เก็บในฐานข้อมูล

ทางออกที่เหมาะสมกว่าสำหรับปัญหานี้คือการสร้างคีย์เฉพาะลองใช้ชื่อusersซึ่งจะเก็บคีย์ผู้ใช้ทั้งหมดตัวอย่างเช่นในรายการหรือตั้งค่าโครงสร้างข้อมูล


1
scanไม่ใช่ตัวเลือก @EranH มันเป็นวิธีที่ดีที่สุดในการทำซ้ำคีย์ scanถูกใช้เพื่อเพิ่มการวนซ้ำในชุดขององค์ประกอบต่างๆ
Kishor Pawar

2
@ yojimbo87 ดังนั้นจะมีสองคำสั่งให้บอกก่อนคือการสร้างคีย์เช่น - ผู้ใช้: 808021: รหัสผ่าน = XYZ และที่สองคือการใส่คีย์ในรีจิสทรีหรือดัชนี (ชุด) แต่สิ่งที่จะเกิดขึ้นเมื่อคำสั่งดำเนินการประสบความสำเร็จและ อื่น ๆ ที่ได้รับความล้มเหลวหมายถึงกุญแจได้สร้างขึ้น แต่ไม่ได้รับรายการในรีจิสทรี
LoveToCode

1
@LoveToCode คุณสามารถใช้ธุรกรรมที่ควรรับประกันว่าการดำเนินการทั้งหมดหรือทั้งหมดจะไม่ถูกดำเนินการ
yojimbo87

2
ฉันยังสังเกตเห็นว่า Redis Desktop Manager (เครื่องมือไคลเอนต์ Redis) ยังถือว่าเครื่องหมาย ':' เป็นตัวคั่นและแสดงคีย์หลาย ๆ กลุ่มรวมกัน
Adam Rotaru

1
ฉันเห็นว่าคุณค่าที่ไม่ซ้ำใครจะคงอยู่ตลอดไป ทำให้ง่ายต่อการทำสิ่งต่าง ๆ เช่น:$redis->delete($redis->keys('user:password:*'));
ดินสอสี

26

เราใช้โคลอน (:) เป็นตัวคั่นเนมสเปซและแฮช (#) สำหรับรหัสส่วนต่างๆของคีย์เช่น:

logistics:building#23

การประชุมชื่อที่ดีที่สุดคืออะไรหากคุณมีคีย์มากกว่าเช่นโลแคลหมวดหมู่ ฯลฯ {resource}: {key} # {value}, {key} # {value} => ข้อความ: locale # en, หมวดหมู่ # 15? หรือคุณมีข้อเสนอแนะอื่น ๆ ?
fsasvari

1
ในตัวอย่างของฉัน "อาคาร" เป็นเพียงชื่อของ "คอลเลกชัน" และ 23 คือ "id" ที่กำหนดเอง หากคุณมีคอมโพสิต id ที่มี locale = en และ category = 15 ดังนั้นรหัสจริงอาจเป็น {en, 15} ดังนั้นเนมสเปซ: ตำรา # {en, 15} หรือเพื่อให้ละเอียดมากขึ้น: เนมสเปซ: ตำรา # {locale = th ประเภท = 15} แต่นี่เป็นเพียงความคิดฉันไม่เคยใช้มันแบบนี้ ระวังอย่าเปลี่ยนลำดับขององค์ประกอบ id เพราะกุญแจจะไม่ถูกค้นพบแน่นอน จริงๆแล้วแทนที่จะเข้ารหัสความซับซ้อนดังกล่าวในชื่อคีย์ของคุณให้พิจารณาใช้โครงสร้างข้อมูล redis แทน ลองดูที่redis.io/topics/indexes
The Nail

16

การประชุมดูเหมือนจะเป็นเครื่องหมายทวิภาค (:) แต่ฉันเป็นนักพัฒนาเว็บดังนั้นฉันจึงชอบใช้เครื่องหมายทับ (/) สำหรับตัวคั่น Slash มีตัวคั่นที่สำคัญอยู่ภายใน URL ซึ่งมีความหมายว่าเป็นUniform Resource Locatorsดังนั้นจึงเป็นกุญแจสำหรับทรัพยากร ทำไมต้องใช้วิธีการที่แตกต่างกับโคลอน (:) มันช่วยอะไรได้บ้าง

ลองพิจารณาตัวอย่างนี้:

เรามีRESTful API สำหรับวัตถุของเล่น มีหนึ่ง:

http://example.com/api/toy/234 

เราเก็บไว้ที่ไหน? เราใช้ Redis และเครื่องหมายทับเพื่อให้คีย์ชัดเจน:

toy/234

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

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

toy/666ผู้ใช้ร้องขอวัตถุที่มีคีย์ วิธีรับจาก Redis ตัวอย่างที่เกี่ยวข้องกับ Node.js:

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

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

หมายเหตุ: ตรวจสอบให้แน่ใจเสมอว่าผู้ใช้สามารถเข้าถึงได้เฉพาะสิ่งที่คุณต้องการ วิธีการ URL-to-key ดิบด้านบนสามารถดึงข้อมูลได้user/1/passwordเช่นกันตามที่ระบุไว้โดยผู้แสดงความเห็น นี่ไม่ควรเป็นปัญหาหากคุณใช้ Redis เป็นแคชสาธารณะแบบอ่านอย่างเดียว


24
…สะดวกและไม่ปลอดภัยจนน่ารังเกียจ คุณขอร้องให้ทำcurl http://example.com/api/user/1/passwordเช่นนั้น (เพียงแค่พูดใน ')
ELLIOTTCABLE

3
สามารถใช้โคลอน, แฮชและสแลชเพื่อกำหนดระดับการทำรังที่แตกต่างกันเช่นUser#23:uploads:my/path/to/file.ext
จุติลงมา

31
กรุณาอย่านำข้อมูลของผู้ใช้เป็นกุญแจไปยังฐานข้อมูล
Lyle

1
ฉันชอบวิธีที่คุณคิดว่าคุณชอบทับเพราะคุณเป็นนักพัฒนาเว็บ
เฮ็กเตอร์ Ordonez

@ELLIOTTCABLE ขอขอบคุณเพิ่มหมายเหตุเกี่ยวกับความไม่ปลอดภัย คุณเห็นปัญหาใด ๆ ในวิธีการนี้หรือไม่หากใช้ Redis เป็นแคชสาธารณะแบบอ่านอย่างเดียว
Akseli Palén

6

ฉันยังไม่รู้ว่ามี "แนวปฏิบัติที่ดีที่สุด" สำหรับการตั้งชื่อคีย์ Redis หรือไม่

ฉันได้ทดลองใช้อักขระ ASCII NUL เป็นตัวคั่นของฉัน (เนื่องจาก Redis และ Python สะอาดทั้ง 8 บิต) มันดูน่าเกลียดนิดหน่อยถ้าคุณดูกุญแจดิบ ๆ แต่ความคิดคือการซ่อนมันไว้ข้างหลังเลเยอร์นามธรรม เครื่องหมายโคลอนและสัญลักษณ์ไพพ์เป็นทางเลือกที่ชัดเจนตราบใดที่ส่วนประกอบของพื้นที่ชื่อของคุณได้รับการรับรองว่าจะไม่ใช้หรือคุณต้องการเข้ารหัสแต่ละองค์ประกอบตามที่จำเป็น อย่างไรก็ตามหากคุณต้องการเข้ารหัสพวกเขาคุณจะต้องพัฒนาเลเยอร์สิ่งที่เป็นนามธรรมและหลีกเลี่ยงการดูคีย์ดิบต่อไป ... ซึ่งนำฉันกลับไปใช้ \ 0 ในการให้เหตุผลของฉัน

ฉันจะน่าสนใจในการดูว่ามีความคิดเห็นอื่นใดเกี่ยวกับเรื่องนี้หรือไม่


0

สำหรับคุณแล้วดูเหมือนว่าสำหรับฉันHSET / HGETน่าจะเหมาะกว่า นอกจากนี้ยังมีคำสั่งHKEYS

คำสั่งเหล่านั้นมีความซับซ้อนเช่นเดียวกับ GET / SET / KEYS ดังนั้นทำไมไม่ใช้มัน?

คุณสามารถมีโครงสร้างนี้แล้ว:

  • ผู้ใช้> 00> ค่า
  • ผู้ใช้> 01> ค่า

หรือ:

  • ผู้ใช้: ชื่อผู้ใช้> 00> ค่า
  • ผู้ใช้: ชื่อผู้ใช้> 01> ค่า

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

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