2011-08-06 52 views
153

Quy ước đặt tên thông thường cho các khóa là gì? Tôi đã thấy các giá trị được phân cách bởi : nhưng tôi không chắc chắn về quy ước bình thường là gì hoặc tại sao.Quy ước đặt tên khóa Redis?

Đối với một người dùng mà bạn sẽ làm điều gì đó giống như ...

user:00

nếu id của người dùng được 00

Bạn có thể truy vấn cho chỉ là khởi đầu của chìa khóa để trả lại tất cả người dùng ?

Tôi chủ yếu chỉ hy vọng để tránh bất kỳ vấn đề nào trong tương lai bằng cách nghiên cứu các cách làm việc cho mọi người và tại sao họ chọn chúng.

Trả lời

125

Quy ước đặt tên thông thường cho các khóa có nghĩa là gì? Tôi đã thấy các giá trị được phân cách bởi: nhưng tôi không chắc chắn về quy ước thông thường là, hoặc lý do.

Có, dấu hai chấm : là quy ước khi đặt tên khóa. Trong this hướng dẫn trên trang web redis được nêu: Cố gắng gắn bó với một lược đồ. Ví dụ: "object-type: id: field" có thể là một ý tưởng hay, như trong "user: 1000: password". Tôi thích sử dụng các dấu chấm cho các trường có nhiều từ như , như trong "comment: 1234: reply.to".

Bạn có thể truy vấn chỉ để bắt đầu khóa để trả lại tất cả người dùng không?

Nếu bạn có ý nghĩa giống như truy vấn trực tiếp cho tất cả các khóa bắt đầu bằng user: thì có lệnh keys cho điều đó. Tuy nhiên, lệnh này chỉ được sử dụng cho mục đích gỡ lỗi vì nó là O(N) vì nó tìm kiếm qua tất cả các khóa được lưu trữ trong cơ sở dữ liệu.

Giải pháp thích hợp hơn cho vấn đề này là tạo khóa chuyên dụng, hãy đặt tên là users, sẽ lưu trữ tất cả khóa người dùng, ví dụ: trong cấu trúc dữ liệu list hoặc set.

+0

Nó không phải là một quy ước, tuy nhiên nó tương tự như định dạng URI mà làm cho nó phổ biến ở khắp mọi nơi khác. – Gustav

+0

@Gustav liếc nhìn trang wiki định dạng URI, tôi không thể hiểu được tiêu chuẩn thực tế này là gì giống như định dạng URI. Bạn có thể giải thích? – CivFan

+0

Tôi đang nói về 'urn: example: animal: ferret: nose' trên trang wiki đó. – Gustav

5

Tôi không biết có thực sự là "thực tiễn tốt nhất" phổ biến cho đặt tên khóa Redis hay không.

Tôi đã thử nghiệm bằng cách sử dụng ký tự ASCII NUL làm dấu phân cách của tôi (vì Redis và Python đều sạch 8 bit). Có vẻ hơi xấu xí nếu bạn đang xem các khóa thô, nhưng ý tưởng là ẩn nó sau một lớp trừu tượng. Biểu tượng dấu hai chấm và đường ống là các lựa chọn thay thế rõ ràng miễn là các thành phần của không gian tên của bạn được đảm bảo không sử dụng chúng hoặc bạn sẵn sàng mã hóa từng thành phần khi cần thiết. Tuy nhiên, nếu bạn muốn mã hóa chúng thì bạn sẽ muốn phát triển lớp trừu tượng và tránh xem các khóa thô ... mà đã đưa tôi trở lại chỉ bằng cách sử dụng \ 0 trong lý do của tôi.

Tôi sẽ rất thú vị khi xem liệu có ý kiến ​​nào khác được nêu rõ về điều này hay không.

18

Chúng tôi sử dụng dấu hai chấm (:) làm dấu tách không gian tên và băm (#) cho id-phần của khóa, ví dụ::

logistics:building#23 
+0

Quy ước tên tốt nhất là gì nếu bạn có nhiều khóa như ngôn ngữ, danh mục, v.v ...? {resource}: {key} # {value}, {key} # {value} => văn bản: locale # en, danh mụC# 15? Hoặc bạn có một số gợi ý khác? – fsasvari

+1

Trong ví dụ của tôi, "xây dựng" chỉ là tên của "bộ sưu tập" và 23 là "id" tùy chỉnh. Nếu bạn có id tổng hợp với locale = en và category = 15, thì id thực tế có thể là {en, 15}, vì vậy không gian tên: văn bản # {en, 15} hoặc để có nhiều chi tiết hơn: không gian tên: văn bản # {locale = vi, danh mục = 15}. Nhưng đây chỉ là một ý tưởng, tôi chưa bao giờ sử dụng nó như thế này. Hãy cẩn thận không thay đổi thứ tự của các thành phần id, bởi vì khóa sẽ không được tìm thấy tất nhiên. Trên thực tế, thay vì mã hóa sự phức tạp như vậy trong tên khóa của bạn, hãy cân nhắc sử dụng cấu trúc dữ liệu redis thay thế. Hãy xem https://redis.io/topics/indexes –

10

Một quy ước có vẻ là dấu hai chấm (:) nhưng Tôi là một nhà phát triển web để cá nhân tôi thích dấu gạch chéo (/) để tách. Dấu gạch chéo là dấu phân cách rất quan trọng trong các URL có nghĩa là phải là Uniform Resource Locators vì vậy loại khóa cho tài nguyên. Tại sao lại có cách tiếp cận khác với dấu hai chấm (:)? Nó có giúp gì không?

Hãy xem xét ví dụ sau:

Chúng tôi có một API RESTful cho các đối tượng đồ chơi. Có một:

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

Nơi chúng tôi lưu trữ? Chúng tôi sử dụng Redis và slashes để chìa khóa hiển nhiên:

toy/234 

Đây là chìa khóa duy nhất cho đồ chơi. Khóa hiện có thể được sử dụng ở phía máy khách:

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

Người dùng yêu cầu đối tượng có khóa toy/666. Làm thế nào để lấy nó từ Redis? Ví dụ liên quan đến Node.js:

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

Không cần phải chuyển đổi dấu gạch chéo thành dấu hai chấm và ngược lại. Thuận tiện, bạn không nghĩ sao?

+19

… tiện lợi và gần như * kinh tởm * không an toàn. Bạn đang cầu xin để có được 'curl http://example.com/api/user/1/password''d, hoặc tương tự. (Chỉ cần nói). – ELLIOTTCABLE

+2

Dấu hai chấm, dấu gạch chéo và dấu gạch chéo có thể được sử dụng để chỉ định các cấp độ lồng nhau khác nhau, ví dụ: 'Người dùng # 23: tải lên: my/path/to/file.ext' – incarnate

+20

Xin vui lòng, không bao giờ lấy đầu vào của người dùng như là một chìa khóa vào cơ sở dữ liệu. – Lyle

Các vấn đề liên quan