2012-01-10 77 views
49

Cho phép nói rằng tôi có hàm băm băm, ví dụ:Cấu trúc dữ liệu phức tạp Redis

$data = { 
    'harry' : { 
     'age' : 25, 
     'weight' : 75, 
    }, 
    'sally' : { 
     'age' : 25, 
     'weight' : 75, 
    } 
} 
  1. gì sẽ cách 'thông thường' để lưu trữ một cấu trúc dữ liệu đó
  2. Bạn có thể trực tiếp nhận được một giá trị (ví dụ như có được harry (hoặc sẽ bạn không?): Tuổi
  3. khi lưu trữ, bạn có thể trực tiếp thay đổi giá trị của một chìa khóa phụ (ví dụ sally: weight = 100)
+1

Ngoài ra, làm cách nào để chúng tôi có thể sắp xếp dữ liệu đó trong Redis ?. Giống như tôi muốn top 10 có được những cái tên có trọng lượng cao nhất. – Bharat

Trả lời

20

gì sẽ cách 'thông thường' để lưu trữ một cấu trúc dữ liệu đó (hoặc sẽ bạn không?)

Ví dụ: harry và sally sẽ được lưu trữ trong từng trường riêng biệt hashes trong đó các trường đại diện cho thuộc tính của chúng như độ tuổi và cân nặng. Sau đó, cấu trúc set sẽ giữ tất cả các thành viên (harry, sally, ...) mà bạn đã lưu trữ trong redis.

Bạn có thể trực tiếp nhận được một giá trị (ví dụ lấy harry: tuổi)

Vâng, thấy HGET hoặc HMGET hoặc HGETALL.

Khi lưu trữ, bạn có thể trực tiếp thay đổi giá trị của một chìa khóa phụ (ví dụ sally: weight = 100)

Vâng, thấy HSET.

+1

Cảm ơn - vì vậy nó sẽ phải được lưu trữ trong nhiều hoạt động? ví dụ. Tôi không thể lưu trữ cấu trúc dữ liệu trong một lần? Rõ ràng đây chỉ là một ví dụ khá tầm thường muốn lưu trữ các 'đối tượng' phức tạp hơn và có lẽ không hiểu liệu đây có phải là cách đi đúng không? – Xrender

+0

Toàn bộ redis được dựa trên các hoạt động đơn giản trong số đó là cấu trúc dữ liệu nâng cao. Bạn có thể thử xem [ohm] (http://ohm.keyvalue.org/) có thể tóm tắt một số điều cho bạn. – yojimbo87

+0

Bạn cũng có thể viết các kịch bản của riêng bạn trong [Lua] (http://redis.io/commands/eval); một ứng dụng có thể gửi một kịch bản Lua như thể nó là một truy vấn EVAL và nó sẽ thực hiện trên máy chủ Redis, cho phép kịch bản Lua của bạn chạy nhiều lệnh Redis mà không có nhiều chuyến đi vòng qua mạng. – ekillaby

2

phụ thuộc vào những gì bạn muốn làm, nhưng nếu datastructure của bạn không sâu lồng nhau và bạn cần truy cập vào từng lĩnh vực , Tôi khuyên bạn nên sử dụng băm: http://redis.io/commands#hash

Dưới đây là một tổng quan tốt hơn các kiểu dữ liệu redis, mỗi pro và Contra: http://redis.io/topics/data-types

15

Cho phép lấy dữ liệu phức tạp mà chúng ta phải lưu trữ trong redis, ví dụ này:

$data = { 
      "user:1" : { 
         name : "sally", 
         password : "123" 
         logs : "25th october" "30th october" "12 sept", 
         friends : "34" , "24", "10" 
        } 
      "user:2" :{ 
         name : "" 
         password : "4567" 
         logs : 
         friends: "" 
        } 
      } 

Vấn đề mà chúng ta phải đối mặt là những người bạn & bản ghi là danh sách. Vì vậy, những gì chúng tôi có thể làm để đại diện cho dữ liệu này trong redis là sử dụng băm và liệt kê một cái gì đó như thế này:

Tùy chọn 1.Một bản đồ băm với các phím như người sử dụng: 1 và sử dụng: 2

 hmset user:1 name "sally" password "12344" 
     hmset user:2 name "pally" password "232342" 
     create separate list of logs as 
       logs:1 { here 1 is the user id } 
       lpush logs:1 "" "" "" 
       lpush logs:2 "" "" "" 
     and similarly for friends. 

Lựa chọn 2: Một bản đồ băm với dữ liệu json đổ như chuỗi mã hóa

 hmset user:1 name "sally" password "12344" logs "String_dumped_data" friends "string of dumped data" 

Lựa chọn 3: Đây là một đại diện của # 1

 something like user:1:friends -> as a list 
     and   user:2:friends -> as a list 

Xin vui lòng, sửa tôi nếu sai.

+0

Yea là Người khởi xướng trong Redis đó là những giải pháp mà tôi có thể nghĩ đến. Nhưng xem xét một bước xa hơn là truy vấn. Giả sử bạn cần nhận tất cả nhật ký của tất cả người dùng có "24" là "Bạn bè". Trong trường hợp 1 bạn phải đọc tất cả danh sách bạn bè và thu thập id người dùng và sau đó nhận tất cả nhật ký. (= Chuyến đi khứ hồi bắt buộc) Trong trường hợp 2 tôi không có ý tưởng nếu redis có khả năng truy vấn bên trong dữ liệu json bị bán phá giá. Và hiệu suất sẽ là gì. Và để thêm trường hợp thứ 3 cho phép nói "Bạn bè" là loại dữ liệu liên tục hơn như "Quyền" Cấu trúc như thế này có tạo ra sự sence không? người dùng: 21: bạn bè: 23-43-12 -> dưới dạng Danh sách –

+0

Trong trường hợp này, chúng tôi có thể sử dụng lệnh EVAL để xử lý nội bộ lua –

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