2011-10-31 46 views
5

Tôi muốn để lưu trữ một số thông tin như sau (lưu ý, tôi sẽ không gắn bó với cấu trúc dữ liệu này ở tất cả, nhưng điều này cho bạn thấy bên dưới thông tin Tôi muốn để lưu trữ):Tìm kiếm đơn giản theo giá trị?

{ user_id: 12345, page_id: 2, country: 'DE' } 

Trong những hồ sơ, user_id là một trường duy nhất, nhưng page_id thì không.

Tôi muốn dịch này thành một cấu trúc dữ liệu Redis, và tôi muốn để có thể chạy các tìm kiếm hiệu quả như sau:

  • Đối với user_id 12345, tìm quốc gia có liên quan.
  • Đối với page_id 2, hãy tìm tất cả user_ids có liên quan và quốc gia của họ.

Thực sự có thể thực hiện việc này trong Redis không? Nếu vậy, tôi nên sử dụng cấu trúc dữ liệu nào và làm cách nào để tránh khả năng sao chép các bản ghi khi chèn chúng?

Trả lời

4

Có vẻ như bạn cần hai loại khóa: một phím HASH để lưu trữ dữ liệu của người dùng và LIST cho mỗi trang chứa danh sách người dùng có liên quan. Dưới đây là ví dụ về cách thức hoạt động của tính năng này.

Load dữ liệu:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

Kéo dữ liệu:

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

Remove User Từ Trang:

> LREM page:2:users 0 12345 

Lặp lại GET trong Sắp xếp để lấy giá trị bổ sung cho người dùng.

Tôi hy vọng điều này sẽ giúp, cho tôi biết nếu có bất kỳ điều gì bạn muốn được làm rõ hoặc nếu bạn cần trợ giúp thêm. Tôi cũng khuyên bạn nên đọc danh sách lệnh và tài liệu có sẵn tại redis web site, đặc biệt là liên quan đến hoạt động SORT.

+0

Cảm ơn - thực sự tôi đã kết thúc bằng cách sử dụng HASH và SET, chứ không phải là DANH SÁCH - nhưng câu trả lời hay! – Richard

1

Vì user_id là duy nhất và vì vậy, hãy giữ chúng trong một cặp khóa-giá trị đơn giản. Quering cho một người dùng là O (1) trong trường hợp như vậy ... Sau đó, giữ một số Redis sets, với key page_id và các thành viên tất cả các user_id ..

+0

Cảm ơn. Mối quan tâm của tôi về điều này là: nếu bạn chèn người dùng mới vào khóa-giá trị, thì * trước * bạn có thể thêm mục nhập đã đặt, cơ sở dữ liệu sẽ bị hỏng? Khi nó trở lại, bạn sẽ bị bỏ lại một chút thông tin khó nhập. – Richard

+1

Trong trường hợp này, bạn có hai lựa chọn: hoặc giữ một kiểu trạng thái nào đó trong mã khách hàng của bạn, nói cách khác, kiểm tra kết quả mà redis trả về sau mỗi thao tác và hành xử tương ứng trong trường hợp lỗi hoặc sử dụng http: // redis. io/lệnh # giao dịch; – hymloth

+1

Tôi nghĩ rằng [Pipelining] (http://redis.io/topics/pipelining) là lựa chọn tốt –

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