2011-10-28 5 views
5

Tôi được yêu cầu sử dụng Redis cho người dùng đã xác thực cửa hàng trong ứng dụng của tôi trên Heroku, vì vậy tôi quyết định nhảy vào ngày hôm nay. Những gì tôi muốn làm là lưu trữ băm của người dùng trong cửa hàng Redis như thế này:Tìm kiếm theo nhiều giá trị trong khóa/giá trị redis

{ 
    id:4532143215432, 
    username:'davejlong', 
    email:'[email protected]' 
} 

Và sau đó tôi muốn có thể tìm kiếm theo tên người dùng hoặc id. Điều này có thể xảy ra với Redis không?

Tôi đang sử dụng các mô-đun redis Node.js mà hỗ trợ bất kỳ redis lệnh https://github.com/mranney/node_redis

Trả lời

2

Có vài vấn đề trong @orangeoctopus usecae.

redis 127.0.0.1:6379> id HMSET: 4532143215432 Tên truy nhập davejlong ​​[email protected] OK redis 127.0.0.1:6379> user HMSET: id davejlong ​​4532143215432 email [email protected] OK

Điều này sẽ tạo bản sao, suy nghĩ về việc thêm các giá trị mới và xóa & cập nhật.

Vì vậy, tôi thích điều này

SET user:davejlong 1 
HMSET user:1 username davejlong email [email protected] 

1) Trong trường hợp của tên người dùng

redis.get('user:davejlong',function(err,id){ 
    console.log('User Id of @davejlong: ' + id); 
    redis.hgetall('user:'+id,function(err,user){ 
     console.log('User Data: ' + user); 
    }) 
    }) 

2) Trong trường hợp Id

redis.hgetall('user:1',function(err,user){ 
     console.log('User Data: ' + user); 
    }) 
+0

Tôi đã bỏ qua điều này với "Cách nhỏ gọn hơn để làm việc này ..." nhưng đã quá lười biếng để loại bỏ nó. +1 –

+0

@philpirozhkov cái nào ... –

+0

Rất tiếc, tôi đã bỏ lỡ điểm vì bạn không thêm khả năng tìm kiếm bằng thư. 'SET người dùng: [email protected] 1' và bạn có thể tìm thấy bằng thư –

3

Nó đơn giản như lưu trữ mỗi người dùng hai lần. Một lần với khóa của id và một lần với khóa của tên người dùng.

Cách nhỏ gọn hơn để thực hiện việc này về bộ nhớ là phải có tên người dùng chính cho id, do đó truy vấn tên người dùng của bạn sẽ giống như: truy vấn theo tên người dùng, nhận id; đặt vào id, nhận thông tin.

Thật không may, không có cách nào tốt để có cùng dữ liệu thực tế được khóa bằng hai khóa khác nhau.


Ví dụ, khi bạn sẽ chèn một người dùng mới và sau đó truy vấn cho nó:

redis 127.0.0.1:6379> HMSET id:4532143215432 username davejlong email [email protected] 
OK 
redis 127.0.0.1:6379> HMSET user:davejlong id 4532143215432 email [email protected] 
OK 
redis 127.0.0.1:6379> HGET id:4532143215432 username 
"davejlong" 
redis 127.0.0.1:6379> HGET user:davejlong id 
"4532143215432" 
redis 127.0.0.1:6379> HMGET user:davejlong email id 
1) "[email protected]" 
2) "4532143215432" 
redis 127.0.0.1:6379> DEL user:davejlong 
(integer) 1 
redis 127.0.0.1:6379> DEL id:4532143215432 
(integer) 1 

Chú ý rằng khi tôi đang tạo ra cho người sử dụng, tôi sử dụng HMSET hai lần. Bây giờ, tôi có thể truy vấn với tên người dùng hoặc id. Tôi cũng phải xóa cả hai khóa ngay bây giờ.

+0

bạn có thể chỉ cho tôi làm thế nào tôi sẽ làm điều đó trong CLI? Tôi là thương hiệu mới cho tất cả các công cụ này redis, vì vậy tôi không chắc chắn để sử dụng một băm, danh sách, vv –

+0

Câu trả lời của tôi đã được cập nhật với một ví dụ. –

+0

Bạn đang tạo dữ liệu trùng lặp tại đây. Xem xét các chỉ mục sử dụng. –