Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Chuỗi Redis so với hàm băm Redis đại diện cho JSON:hiệu quả?

Bài viết này có thể cung cấp nhiều thông tin chi tiết tại đây:http://redis.io/topics/memory-optimization

Có nhiều cách để lưu trữ một mảng Đối tượng trong Redis ( spoiler :Tôi thích tùy chọn 1 cho hầu hết các trường hợp sử dụng):

  1. Lưu trữ toàn bộ đối tượng dưới dạng chuỗi được mã hóa JSON trong một khóa duy nhất và theo dõi tất cả các Đối tượng bằng cách sử dụng một tập hợp (hoặc danh sách, nếu thích hợp hơn). Ví dụ:

    INCR id:users
    SET user:{id} '{"name":"Fred","age":25}'
    SADD users {id}
    

    Nói chung, đây có lẽ là phương pháp tốt nhất trong hầu hết các trường hợp. Nếu có nhiều trường trong Đối tượng, các Đối tượng của bạn không được lồng với các Đối tượng khác và bạn có xu hướng chỉ truy cập vào một tập hợp con nhỏ của các trường tại một thời điểm, tốt hơn là nên chọn tùy chọn 2.

    Ưu điểm :được coi là một "thực hành tốt." Mỗi Đối tượng là một chìa khóa Redis toàn diện. Phân tích cú pháp JSON rất nhanh, đặc biệt khi bạn cần truy cập nhiều trường cho Đối tượng này cùng một lúc. Nhược điểm :chậm hơn khi bạn chỉ cần truy cập vào một trường duy nhất.

  2. Lưu trữ các thuộc tính của mỗi Đối tượng trong một hàm băm Redis.

    INCR id:users
    HMSET user:{id} name "Fred" age 25
    SADD users {id}
    

    Ưu điểm :được coi là một "thực hành tốt." Mỗi Đối tượng là một chìa khóa Redis toàn diện. Không cần phải phân tích cú pháp chuỗi JSON. Nhược điểm :có thể chậm hơn khi bạn cần truy cập tất cả / hầu hết các trường trong một Đối tượng. Ngoài ra, không thể dễ dàng lưu trữ các Đối tượng lồng nhau (Đối tượng trong Đối tượng).

  3. Lưu trữ từng Đối tượng dưới dạng chuỗi JSON trong hàm băm Redis.

    INCR id:users
    HMSET users {id} '{"name":"Fred","age":25}'
    

    Điều này cho phép bạn hợp nhất một chút và chỉ sử dụng hai phím thay vì nhiều phím. Điểm bất lợi rõ ràng là bạn không thể đặt TTL (và các nội dung khác) trên mỗi Đối tượng người dùng, vì nó chỉ là một trường trong hàm băm Redis chứ không phải một khóa Redis đầy đủ.

    Ưu điểm :Phân tích cú pháp JSON rất nhanh, đặc biệt khi bạn cần truy cập nhiều trường cho Đối tượng này cùng một lúc. Ít gây "ô nhiễm" không gian tên chính. Nhược điểm :Về mức sử dụng bộ nhớ tương tự như # 1 khi bạn có nhiều Đối tượng. Chậm hơn # 2 khi bạn chỉ cần truy cập vào một trường duy nhất. Có lẽ không được coi là một "phương pháp hay".

  4. Lưu trữ từng thuộc tính của từng Đối tượng trong một khóa chuyên dụng.

    INCR id:users
    SET user:{id}:name "Fred"
    SET user:{id}:age 25
    SADD users {id}
    

    Theo bài viết trên, tùy chọn này hầu như không bao giờ được ưu tiên (trừ khi thuộc tính của Đối tượng cần phải có TTL cụ thể hoặc thứ gì đó).

    Ưu điểm :Thuộc tính đối tượng là các khóa Redis đầy đủ, có thể không quá mức cần thiết cho ứng dụng của bạn. Nhược điểm :chậm, sử dụng nhiều bộ nhớ hơn và không được coi là "phương pháp hay nhất". Gây ô nhiễm nhiều vùng tên chính.

Tóm tắt chung

Tùy chọn 4 thường không được ưa thích. Tùy chọn 1 và 2 rất giống nhau và cả hai đều khá phổ biến. Tôi thích tùy chọn 1 hơn (nói chung) vì nó cho phép bạn lưu trữ các Đối tượng phức tạp hơn (với nhiều lớp lồng nhau, v.v.) Tùy chọn 3 được sử dụng khi bạn thực sự quan tâm về việc không làm ô nhiễm không gian tên khóa chính (nghĩa là bạn không muốn có nhiều khóa trong cơ sở dữ liệu của mình và bạn không quan tâm đến những thứ như TTL, key sharding hoặc bất cứ điều gì).

Nếu tôi có điều gì sai ở đây, vui lòng xem xét để lại nhận xét và cho phép tôi sửa đổi câu trả lời trước khi phản đối. Thanks! :)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis TimeSeries có phải là công cụ phù hợp để nắm bắt các cây nến trong giá cổ phiếu không

  2. Tôi nên sử dụng cái gì? Phòng Socket.io hay Redis pub-sub?

  3. Làm cách nào để lưu trữ mảng kết hợp? Đặt hoặc băm hoặc danh sách?

  4. Tự động hoàn thành Redis

  5. Hiredis đang chờ tin nhắn