2010-09-27 89 views
8

Gần đây tôi đang học redis và thành thật rất ấn tượng và sắp chết để sử dụng nó. Một trong những điều khiến tôi bận tâm là "làm cách nào để truy vấn redis". Để cụ thể tôi đang cố gắng để giải quyết sauTruy vấn bằng redis

Nói rằng tôi có một triệu băm lưu trữ như sau

usage:1 = {created: 20100521, quantity:9, resource:1033, user:1842, ...} 
usage:2 = {created: 20100812, quantity:3, resource:7233, user:1842, ...} 
usage:3 = {created: 20100927, quantity:4, resource:1031, user:76, ...} 

Xin lưu ý rằng có rất nhiều phím trong băm Tôi đã chỉ hiển thị 4. Bây giờ tôi muốn để tìm các bản ghi trong phạm vi ngày cụ thể, theo người dùng, theo tài nguyên hoặc cho người dùng trong khoảng thời gian đã định.

Tôi nghi ngờ rằng có các mẫu cụ thể redis để truy xuất dữ liệu đó. Tôi là một lập trình viên python. Tôi đã nhìn vào redisco (cổng ohm) mà hỗ trợ một số quering nhưng tôi không chắc chắn nếu nó không nhận được tất cả các dữ liệu và sau đó các bộ lọc trong python.

Trả lời

10

Đối với Redis, tốt nhất bạn nên hiểu loại mẫu truy vấn nào bạn muốn trên dữ liệu của mình trước khi quyết định cách bạn sẽ lưu trữ nó. Ví dụ: nếu bạn muốn thực hiện truy vấn phạm vi ngày trên một tập hợp dữ liệu, bạn có thể lưu trữ dữ liệu đó dưới dạng tập hợp được sắp xếp trong đó các khóa là các mục dữ liệu bạn muốn truy vấn và điểm số là một unix dấu thời gian.

Trong ví dụ của bạn ở trên, tôi có thể lưu trữ dụ băm của bạn như:

user_to_resource:i = user:j     # key -> value forward map 
resources => (resource:i, created_timestamp) # sorted set 
count_resource:i = quantity     # key -> value quantity map 

Đó là, tôi muốn có nhiều về phía trước và ngược lại bản đồ tùy thuộc vào mô hình truy vấn tôi muốn hỗ trợ.

+1

Nghĩ rằng sẽ hữu ích khi chia sẻ http://pythonik.blogspot.com/2010/11/redis-patterns-search.html Tuyên bố từ chối trách nhiệm: Con trỏ tới blog của riêng tôi – Shekhar

7

truy vấn bạn đề cập phụ thuộc nhiều vào thời gian. Trong trường hợp này, bạn sẽ khôn ngoan để sử dụng một tập hợp được sắp xếp. Bạn có thể sử dụng tem datetime làm điểm cho mỗi mục.

Ví dụ, bạn có thể làm như sau:

hmset usage:1 created 20100521 quantity 9 resource 1033 user 1842 
hmset usage:2 created 20100812 quantity 3 resource 7233 user 1842 
hmset usage:3 created 20100927 quantity 4 resource 1031 user 76 

zadd usage 20200521 1 
zadd usage 20100812 2 
zadd usage 20100927 3 

Để lấy tất cả mọi thứ:

sort usage get 
# get usage:*->created get usage:*->quantity get usage:*->resource get usage:*->user 

hoặc

lrange usage 0 -1 

Để có được các chỉ số của một loạt:

zrangebyscore usage 20100800 20100900 

Đối với các truy vấn dựa trên giá trị khóa băm, có một bổ sung hữu ích cho redis cho phép sử dụng các tập lệnh được viết bằng lua. Bạn có thể dễ dàng viết một kịch bản lệnh lua đơn giản trong một heredoc python và sử dụng phương thức redis.eval để truyền kịch bản lệnh tới redis. Tập lệnh có thể là một vòng lặp dựa trên giá trị bạn đang tìm kiếm.

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