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

Tăng gấp 10 lần mức sử dụng bộ nhớ so với dữ liệu

Điều này được mong đợi về bất kỳ lưu trữ dữ liệu hiệu quả nào:các từ phải được lập chỉ mục trong bộ nhớ trong cấu trúc dữ liệu động của các ô được liên kết bởi con trỏ. Kích thước của siêu dữ liệu cấu trúc, con trỏ và sự phân mảnh nội bộ của trình cấp phát bộ nhớ là lý do tại sao dữ liệu chiếm nhiều bộ nhớ hơn một tệp phẳng tương ứng.

Tập hợp Redis được triển khai dưới dạng bảng băm. Điều này bao gồm:

  • một mảng các con trỏ phát triển về mặt hình học (lũy thừa của hai)
  • một mảng thứ hai có thể được yêu cầu khi quá trình băm lại gia tăng đang hoạt động
  • các ô danh sách được liên kết đơn đại diện cho các mục nhập trong bảng băm (3 con trỏ, 24 byte cho mỗi mục nhập)
  • Redis trình bao bọc đối tượng (một cho mỗi giá trị) (16 byte cho mỗi mục nhập)
  • bản thân dữ liệu thực tế (mỗi dữ liệu trong số chúng có tiền tố là 8 byte cho kích thước và dung lượng)

Tất cả các kích thước trên được cung cấp cho việc triển khai 64 bit. Tính toán chi phí của trình cấp phát bộ nhớ, nó dẫn đến Redis chiếm ít nhất 64 byte cho mỗi mục tập hợp (trên đầu dữ liệu) cho phiên bản Redis gần đây bằng cách sử dụng trình cấp phát jemalloc (> =2.4)

Redis cung cấp tối ưu hóa bộ nhớ cho một số kiểu dữ liệu, nhưng chúng không bao gồm các tập hợp chuỗi. Tuy nhiên, nếu bạn thực sự cần tối ưu hóa mức tiêu thụ bộ nhớ của các bộ, bạn có thể sử dụng các thủ thuật. Tôi sẽ không làm điều này chỉ với 160 MB RAM, nhưng nếu bạn có dữ liệu lớn hơn, đây là những gì bạn có thể làm.

Nếu bạn không cần các khả năng hợp nhất, giao nhau, khác biệt của các tập hợp, thì bạn có thể lưu trữ các từ của mình trong các đối tượng băm. Lợi ích là các đối tượng băm có thể được Redis tối ưu hóa tự động bằng cách sử dụng zipmap nếu chúng đủ nhỏ. Cơ chế zipmap đã được thay thế bằng ziplist trong Redis> =2.6, nhưng ý tưởng vẫn giống nhau:sử dụng cấu trúc dữ liệu tuần tự hóa có thể vừa với bộ nhớ đệm của CPU để có được cả hiệu suất và dung lượng bộ nhớ nhỏ gọn.

Để đảm bảo các đối tượng băm đủ nhỏ, dữ liệu có thể được phân phối theo một số cơ chế băm. Giả sử bạn cần lưu trữ 1 triệu mục, việc thêm một từ có thể được triển khai theo cách sau:

  • băm nó theo mô-đun 10000 (được thực hiện ở phía máy khách)
  • Các từ HMSET:[hashnum] [word] 1

Thay vì lưu trữ:

words => set{ hi, hello, greetings, howdy, bonjour, salut, ... }

bạn có thể lưu trữ:

words:H1 => map{ hi:1, greetings:1, bonjour:1, ... }
words:H2 => map{ hello:1, howdy:1, salut:1, ... }
...

Để truy xuất hoặc kiểm tra sự tồn tại của một từ, nó giống nhau (băm nó và sử dụng HGET hoặc HEXISTS).

Với chiến lược này, việc tiết kiệm bộ nhớ đáng kể có thể được thực hiện với điều kiện modulo của hash ischosen theo cấu hình zipmap (hoặc ziplist cho Redis> =2.6):

# Hashes are encoded in a special way (much more memory efficient) when they
# have at max a given number of elements, and the biggest element does not
# exceed a given threshold. You can configure this limits with the following
# configuration directives.
hash-max-zipmap-entries 512
hash-max-zipmap-value 64

Lưu ý:tên của các tham số này đã thay đổi với Redis> =2.6.

Ở đây, modulo 10000 cho 1 triệu mục có nghĩa là 100 mục cho mỗi đối tượng băm, điều này sẽ đảm bảo rằng tất cả chúng được lưu trữ dưới dạng zipmaps / ziplists.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Để bắt đầu tải YCSB với tùy chọn kích hoạt cụm cho REDIS

  2. Quét Laravel và redis

  3. Tôi có triển khai tuần tự hóa và giải mã hóa NodesJS + Passport + RedisStore không?

  4. Cách thiết lập vùng chứa Docker redis với ssl

  5. Ý tưởng để mở rộng trò chuyện trong AWS?