2012-03-22 31 views
22

Tôi chỉ bắt đầu với Redis with Rails vì vậy đây có thể là một câu hỏi ngớ ngẩn.Lưu HASH vào Redis trên ứng dụng đường ray

Tôi đang cố lưu một băm vào máy chủ redis nhưng khi tôi truy xuất nó chỉ là một chuỗi IE.

hash = {"field" => "value", "field2" => "value2"} 
$redis.set('data', hash) 

#So collecting the data 
@data = $redis.get('data') 

Điều này rõ ràng là sai khi trở về dưới dạng chuỗi.

Tôi cũng đã thử lặp một số kết quả và sử dụng hàm hset.

@data.each do |d| 
    $redis.hset('data', d.field, d.value) 
end 

# errror 
# ERR Operation against a key holding the wrong kind of value 

Không biết phải đi đâu. Tôi đã xóa khóa $ redis.del ('dữ liệu') để đảm bảo rằng đó không phải là vấn đề.

Hy vọng bạn có thể tư vấn, Lee

+0

Áp phích dường như muốn một dict ruby ​​được lưu trữ dưới dạng chuỗi được xê-ri hóa, nhưng tôi gặp lỗi tương tự khi thực hiện hset mặc dù khóa là băm. Bất cứ ai có thể đoán tại sao có thể? – arkanciscan

+0

Đã tìm ra! Nó không phải là tôi đang làm một HSET trên một chuỗi, đó là sau đó tôi đã làm một GET trên một băm khi tôi nên đã được sử dụng HGETALL. – arkanciscan

Trả lời

48

Tôi nên đọc tài liệu redis kỹ lưỡng hơn.

Trả lời:

IN 
$redis.set 'data', hash.to_json 

OUT 
data = JSON.parse($redis.get("data")) 
+4

Điều đó tốt nếu bạn muốn làm là lưu trữ một băm được tuần tự hóa, nhưng tôi thực sự muốn có một băm redis, và tôi cũng nhận được lỗi này. – arkanciscan

+0

Cảm ơn bạn đã chỉ ra giải pháp. Tôi cũng không đọc kỹ tài liệu redis. Giải pháp này có thể được sử dụng cho tất cả các loại đối tượng ruby. [redis doc] (https://github.com/redis/redis-rb/blob/master/README.md#storing-objects) –

1

Khi bạn sử dụng $redis.set('data', hash) bạn thực sự tiết kiệm một chuỗi Redis thường xuyên, ngay cả khi bạn sử dụng một biến băm (nó có thể được tuần tự để Json chuỗi, nhưng tôi thực sự không chắc chắn về nó).

Hãy thử sử dụng $redis.hset('data', hash) (không phải bằng cách lặp qua các trường như bạn đã làm).

Một điểm khác: Bạn có chắc chắn đã xóa hoàn toàn khóa trước đó không? Bạn đã cố gắng để hset một chìa khóa hoàn toàn khác nhau để loại bỏ các tùy chọn phím chuỗi trước đó vẫn còn "ra khỏi đó"?

+3

$ redis.hset ('dữ liệu', băm), cho tôi lỗi: sai số đối số (2 cho 3). hset đặt chúng riêng lẻ. Tôi cũng đã thử $ redis.hmset ('dữ liệu', băm) và có lỗi: ERR sai số đối số cho lệnh 'hmset' – Lee

+0

'hset' có tham số bổ sung' field' Xem: http://redis.io/commands/hset – theUtherSide

39

Các đá quý redis sẽ remap băm của bạn như thế này:

$redis.mapped_hmset "test", { foo: "bar" } 
$redis.hgetall "test" => {"foo"=>"bar"} 
+3

Chỉ cần cẩn thận, băm bên trong được trả về dưới dạng chuỗi. Lưu trữ '{: a => 1,: b => {: c => 2}}' được trả về dưới dạng '{" a "=>" 1 "," b "=>" {: c => 2 } "}' Ngoài ra, bạn mất các phím tượng trưng. – lardcanoe

+2

Một chút muộn cho bữa tiệc, nhưng bằng cách sử dụng 'transform_keys' hoặc' deep_symbolize_keys' bạn có thể biến những biểu tượng de-symbolized trở lại thành biểu tượng. – rtfminc

8

Để tiết kiệm một hash trong redis. Bạn phải chuyển khóa làm tham số đầu tiên và sau đó tham số tiếp theo phải là khóa và giá trị trên phương thức hmset.

$redis.hmset('user:007', :name, 'Antonio', :busy, 'maybe', :ping, 'pong') 

Mã hóa hạnh phúc.

+0

Cảm ơn bạn, chúc hạnh phúc mã hóa cho bạn từ Đức Chúa Trời. – EGurelli

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