2012-07-01 106 views
5

Redis là khái niệm khác với cơ sở dữ liệu SQL truyền thống mà tôi sử dụng và tôi đang cố gắng tìm hiểu xem nó có phù hợp với dự án của tôi không ... một câu trả lời cho câu hỏi của tôi.Redis và giá trị truy vấn

Tôi có một nhóm Người dùng mà tôi cần lưu trữ, mỗi người dùng có một ID duy nhất và một vài giá trị (chẳng hạn như tên của họ) được liên kết với nó. Nó có vẻ như tôi chỉ đơn giản có thể lưu trữ những người như một hash:

user:fef982dcfe1a7bcba4849b4c281bba95 
"username" "andrewm" "name" "Andrew" 

Tôi cũng có một loạt các thông điệp tôi muốn để lưu trữ, từng có một vài thuộc tính như người gửi và người nhận:

message:1a7bcba4849b4c281bfef98a952dcfeb 
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!" 

Câu hỏi của tôi là, làm thế nào tôi sẽ đi về lấy tất cả các tin nhắn được gửi bởi một người dùng cụ thể (được chỉ định bởi một hash của họ). Tôi có nên sử dụng một cơ sở dữ liệu quan hệ truyền thống thay thế, hoặc thậm chí một cơ sở dữ liệu NoSQL như MongoDB (mà tôi đã sử dụng trước đây)? Nếu vậy, có ai có bất cứ đề nghị nào cho các cửa hàng hiệu suất cao không? Tôi sẽ không thực hiện bất kỳ tìm kiếm thực sự nào (ví dụ: các truy vấn MySQL LIKE) - thực sự chỉ là tra cứu giá trị chính.

Trả lời

7

Chắc chắn có thể mô hình dữ liệu này với Redis, nhưng bạn cần phải suy nghĩ về cấu trúc dữ liệu VÀ đường dẫn truy cập. Với Redis, các đường dẫn truy cập không được quản lý hoàn toàn (giống như với các chỉ mục trong RDBMS/MongoDB).

Đối với ví dụ được cung cấp, bạn có thể có:

user:<user hash> -> hash of user properties 
user:<user hash:sent -> set of <msg hash> 
user:<user hash>:received -> set of <msg hash> 
message:<msg hash> -> hash of message properties 

Thêm/xóa một thông điệp có nghĩa là duy trì *: gửi và *: nhận bộ tương ứng với người gửi và người nhận, trên đầu trang của việc thêm/xóa chính đối tượng tin nhắn.

Lấy tin nhắn được gửi cho một người dùng nhất định là chỉ là một lệnh SMEMBERS, hoặc một Sắp nếu bạn muốn lấy cũng là đặc tính của thông điệp cùng một lúc:

# Get a list of message hash codes only in one roundtrip 
smembers user:<user hash>:received 

# Get a list of message contents in one roundtrip 
sort user:<user hash>:received by nosort get message:*->sender get message:*->message 

Đối với cơ sở lý luận về việc sử dụng sắp xếp, xem:

Lưu ý 1: với Redis tốt hơn là sử dụng số nguyên làm khóa thay vì UUID hoặc mã băm (đặc biệt là trong bộ), vì chúng được lưu trữ theo cách hiệu quả hơn.

Lưu ý 2: nếu bạn cần đặt hàng tin nhắn, khi đó danh sách phải được sử dụng thay vì đặt. Hậu quả là chỉ có các tin nhắn cũ nhất có thể được gỡ bỏ, và chỉ có thể thêm các tin nhắn mới vào một cách hiệu quả. Bạn có lẽ cũng sẽ thêm một danh sách toàn cầu cho tất cả các tin nhắn.

+0

Cảm ơn bạn rất nhiều vì lời giải thích đó-- nó rất hữu ích. Tôi sẽ xem xét kỹ hơn :) –

+0

Xin chào, cảm ơn, rất hữu ích. Nếu "Thêm/xóa một tin nhắn có nghĩa là duy trì các tập tin *: đã gửi và *: đã nhận", liệu nó có cần nhiều không gian hơn để lưu trữ dữ liệu và do đó chiếm nhiều không gian hơn trong bộ nhớ? Nó có thể là một vấn đề cho hiệu suất nếu loại "đa cửa hàng" được thực hiện thường xuyên? Cảm ơn sự giúp đỡ của bạn – Loic

+0

Có, nó đại diện cho nhiều dữ liệu hơn để lưu trữ. Về hiệu suất, bạn có nghĩa vụ phải sử dụng pipelining để khấu hao tác động của việc thực hiện một số lệnh cho một hoạt động nhất định. Xem http://redis.io/topics/pipelining –

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