Redis quy ước đặt tên chính?


226

Quy ước đặt tên bình thường cho các phím trong redis là gì? Tôi đã thấy các giá trị được phân tách bằng :nhưng tôi không chắc quy ước thông thường là gì hoặc tại sao.

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

user:00

nếu id của người dùng là 00

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

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

Câu trả lời:


205

Quy ước đặt tên bình thường cho các phím trong redis là gì? Tôi đã thấy các giá trị được phân tách bằng: nhưng tôi không chắc quy ước thông thường là gì hoặc tại sao.

Có, dấu hai chấm :là một quy ước khi đặt tên khóa. Trong hướng dẫn này 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 dấu chấm cho các trường nhiều từ, như trong "bình luận: 1234: reply.to".

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

Nếu bạn có nghĩa là someting như truy vấn trực tiếp cho tất cả các phím mà bắt đầu với user:có một phím lệnh 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 thông qua tất cả các khóa được lưu 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ả các khóa người dùng, ví dụ, trong danh sách hoặc đặt cấu trúc dữ liệu.


1
scankhông phải là tùy chọn @EranH., đó là cách tốt nhất để lặp lại các khóa. scanđược sử dụng để tăng dần qua một tập hợp các phần tử.
Kishor Pawar

2
@ yojimbo87 Vì vậy, sẽ có hai lệnh cho phép trước tiên là tạo khóa như - user: 808021: password = XYZ và thứ hai là đưa khóa vào registry hoặc index (set), nhưng điều gì sẽ xảy ra khi một lệnh được thực thi thành công và khác bị lỗi có nghĩa là khóa được tạo nhưng không được đăng ký.
LoveToCode

1
@LoveToCode Bạn có thể sử dụng giao dịch để đảm bảo rằng tất cả hoặc không có thao tác nào sẽ được thực hiện.
yojimbo87

2
Tôi cũng nhận thấy rằng Redis Desktop Manager (công cụ máy khách Redis) cũng coi dấu hai chấm ':' là dấu phân cách và hiển thị nhiều khóa được nhóm lại với nhau
Adam Rotaru

1
Tôi cho rằng giá trị duy nhất là cuối cùng. Làm cho nó dễ dàng để làm một cái gì đó như:$redis->delete($redis->keys('user:password:*'));
Crayons

26

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

logistics:building#23

Quy ước tên tốt nhất là gì nếu bạn có nhiều khóa như miền địa phương, danh mục vv? {resource}: {key} # {value}, {key} # {value} => text: locale # en, category # 15? Hoặc bạn có một số gợi ý khác?
fsasvari

1
Trong ví dụ của tôi, "tòa nhà" 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 hỗn 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: text # {en, 15} hoặc để dài hơn: không gian tên: text # {locale = en, loại = 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, vì khóa học sẽ không được tìm thấy. 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 xem xét sử dụng cấu trúc dữ liệu redis thay thế. Hãy xem redis.io/topics/indexes
The Nail

16

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

Xem xét ví dụ này:

Chúng tôi có 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 có nó được lưu trữ? Chúng tôi sử dụng Redis và dấu gạch chéo để chìa khóa rõ ràng:

toy/234

Đây là chìa khóa độc đáo cho đồ chơi. Khóa này 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;
    }
}

Một người dùng yêu cầu một đối tượng với khóa toy/666. Làm thế nào để có được nó từ Redis? Một 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?

Lưu ý: luôn đảm bảo rằng người dùng chỉ có thể truy cập những thứ bạn dự định. Cách tiếp cận URL-to-key thô ở trên cũng có thể tìm nạp user/1/password, như được lưu ý bởi các nhà bình luận. Đây không phải là vấn đề nếu bạn sử dụng Redis làm bộ đệm chỉ đọc công khai.


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

3
Dấu hai chấm, dấu gạch chéo băm và có thể được sử dụng để chỉ mức độ khác nhau của tổ, ví dụUser#23:uploads:my/path/to/file.ext
nhập thể

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

1
Tôi thích cách bạn nghĩ bạn thích gạch chéo vì bạn là nhà phát triển web.
Hector Ordonez

@ELLIOTTCABLE Cảm ơn, đã thêm ghi chú về sự không an toàn. Bạn có thấy bất kỳ vấn đề nào trong cách tiếp cận này nếu Redis được sử dụng làm bộ đệm chỉ đọc công khai không?
Akseli Palén

6

Tôi không biết có thực sự có "thực tiễn tốt nhất" rộng rãi cho việc đặt tên chính của Redis chưa.

Tôi đã thử nghiệm sử dụng các ký tự ASCII NUL làm dấu phân cách của mình (vì Redis và Python đều sạch 8 bit). Nó trông hơi xấu xí nếu bạn đang nhìn vào các phím thô, nhưng ý tưởng là để ẩn nó đằng sau một lớp trừu tượng. Biểu tượng dấu hai chấm và đường ống là những lựa chọn thay thế rõ ràng miễn là các thành phần trong 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 đang 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ô bằng mọi cách ... điều đó đưa tôi trở lại chỉ bằng cách sử dụng \ 0 theo lý luận của tôi.

Tôi sẽ thấy thú vị nếu có bất kỳ ý kiến ​​nào khác được nêu rõ về vấn đề này.


0

Đối với usecase của bạn, dường như đối với tôi, HSET / HGET sẽ phù hợp hơn. Ngoài ra còn có lệnh HKEYS .

Tất cả các lệnh đó có độ phức tạp tương tự như GET / SET / KEYS, vậy tại sao không sử dụng chúng?

Bạn có thể có cấu trúc này sau đó:

  • người dùng> 00> giá trị
  • người dùng> 01> giá trị

hoặc là:

  • người dùng: tên người dùng> 00> giá trị
  • người dùng: tên người dùng> 01> giá trị

Chỉ cần trích xuất ID người dùng và sử dụng nó làm khóa băm. Cá nhân tôi thích cách tiếp cận này vì nó cảm thấy đẹp hơn và bạn cũng có thể dễ dàng truy vấn ID người dùng hiện có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.