Các cấu trúc dữ liệu cơ bản được sử dụng cho Redis là gì?


305

Tôi đang cố gắng trả lời hai câu hỏi trong một danh sách dứt khoát:

  1. Các cấu trúc dữ liệu cơ bản được sử dụng cho Redis là gì?
  2. Và những ưu điểm / nhược điểm chính / trường hợp sử dụng cho từng loại là gì?

Vì vậy, tôi đã đọc các danh sách Redis thực sự được thực hiện với các danh sách được liên kết. Nhưng đối với các loại khác, tôi không thể khai thác bất kỳ thông tin nào. Ngoài ra, nếu ai đó vấp phải câu hỏi này và không có bản tóm tắt cấp cao về ưu và nhược điểm của việc sửa đổi hoặc truy cập các cấu trúc dữ liệu khác nhau, họ cũng sẽ có một danh sách đầy đủ về thời điểm sử dụng các loại cụ thể tốt nhất để tham khảo.

Cụ thể, tôi đang tìm cách phác thảo tất cả các loại: chuỗi, danh sách, bộ, zset và hàm băm.

Ồ, tôi đã xem những bài báo này, trong số những người khác, cho đến nay:


7
Làm thế nào để sử dụng một máy chủ là chuyện vặt? Làm cách nào để xác định khi nào nên sử dụng một cấu trúc lập trình so với cấu trúc khác? Điều này được áp dụng trực tiếp cho lập trình, vì tôi sử dụng các loại khác nhau cho các mục đích sử dụng khác nhau.
Homer6

2
Cách sử dụng máy chủ không nhất thiết phải là chuyện vặt, nhưng đó là ngoài chủ đề - và đó không phải là điều bạn yêu cầu. Cấu trúc dữ liệu nào được sử dụng cho các mục đích cụ thể sẽ là chủ đề, nhưng đó không phải là những gì bạn đã hỏi. Những gì tình cờ được sử dụng trong Redis chuyện nhỏ, không có lý do bổ sung về lý do tại sao họ sử dụng một cấu trúc cụ thể trong một tình huống cụ thể - tại thời điểm đó, chúng tôi trở lại với những gì tôi đã nói sẽ là chủ đề, và những gì Redis xảy ra là không liên quan.
Jerry Coffin

5
Chủ đề nêu rõ: "Cấu trúc dữ liệu là gì và khi nào bạn nên sử dụng các loại khác nhau?" Làm thế nào là lạc đề? Bạn đang nói rằng học về danh sách liên kết, băm và mảng là không liên quan đến lập trình? Bởi vì, tôi sẽ lập luận rằng chúng có liên quan trực tiếp - đặc biệt là trong một máy chủ được thiết kế chủ yếu để thực hiện. Ngoài ra, chúng có liên quan vì lựa chọn sai có thể có nghĩa là hiệu năng thấp hơn đáng kể từ ứng dụng này sang ứng dụng tiếp theo.
Homer6

19
Câu trả lời của antirez đổi lại câu hỏi này. gần với sự bất lợi của các lập trình viên và người dùng redis ở khắp mọi nơi.
John Sheehan

75
@JerryCoffin với tất cả sự tôn trọng, redis là một công cụ phát triển phần mềm và đặt câu hỏi về các công cụ phát triển phần mềm là chủ đề chắc chắn. Thực tế là "bạn có thể nhận được câu trả lời từ nguồn" không phải là một lý do gần gũi ... sẽ mất nhiều giờ để có câu trả lời từ nguồn. Và redis được sử dụng rất rộng rãi nên câu hỏi này không quá cục bộ. Stack Overflow là tất cả về việc học về lập trình và hỏi cấu trúc dữ liệu nào được sử dụng bởi một công cụ lập trình cực kỳ phổ biến góp phần vào mục tiêu đó. Tóm lại tôi không tìm thấy bất kỳ lý do để đóng câu hỏi này.
Joel Spolsky

Câu trả lời:


612

Tôi sẽ cố gắng trả lời câu hỏi của bạn, nhưng ban đầu tôi sẽ bắt đầu bằng một thứ có vẻ lạ: nếu bạn không quan tâm đến nội bộ Redis, bạn không nên quan tâm đến cách thức các loại dữ liệu được triển khai trong nội bộ. Điều này là vì một lý do đơn giản: đối với mọi thao tác Redis, bạn sẽ tìm thấy độ phức tạp thời gian trong tài liệu và, nếu bạn có tập hợp các thao tác và độ phức tạp thời gian, điều duy nhất khác bạn cần là một số manh mối về việc sử dụng bộ nhớ (và bởi vì chúng tôi thực hiện nhiều tối ưu hóa có thể khác nhau tùy thuộc vào dữ liệu, cách tốt nhất để có được những số liệu sau này là thực hiện một vài thử nghiệm trong thế giới thực tầm thường).

Nhưng vì bạn đã hỏi, đây là cách triển khai cơ bản của mọi loại dữ liệu Redis.

  • Các chuỗi được triển khai bằng thư viện chuỗi động C để chúng tôi không trả tiền (nói một cách không có triệu chứng) để phân bổ trong các hoạt động chắp thêm. Ví dụ, bằng cách này, chúng ta có các phần bổ sung O (N) thay vì có hành vi bậc hai.
  • Danh sách được thực hiện với danh sách liên kết.
  • Bộ và giá trị băm được thực hiện với các bảng băm.
  • Các bộ sắp xếp được thực hiện với danh sách bỏ qua (một loại cây cân bằng đặc biệt).

Nhưng khi danh sách, bộ và bộ được sắp xếp nhỏ về số lượng vật phẩm và kích thước của các giá trị lớn nhất, một mã hóa nhỏ gọn hơn, nhỏ gọn hơn được sử dụng. Mã hóa này khác nhau cho các loại khác nhau, nhưng có một tính năng là nó là một cụm dữ liệu nhỏ gọn thường buộc quét O (N) cho mọi hoạt động. Vì chúng tôi chỉ sử dụng định dạng này cho các đối tượng nhỏ nên đây không phải là vấn đề; quét một blob O (N) nhỏ là bộ nhớ cache bị lãng quên nên thực tế nói nó rất nhanh và khi có quá nhiều phần tử, mã hóa sẽ tự động được chuyển sang mã hóa gốc (danh sách được liên kết, hàm băm, v.v.).

Nhưng câu hỏi của bạn không thực sự chỉ là về nội bộ, quan điểm của bạn là Loại nào để sử dụng để thực hiện điều gì? .

Dây

Đây là loại cơ sở của tất cả các loại. Đây là một trong bốn loại nhưng cũng là loại cơ sở của các loại phức tạp, vì Danh sách là danh sách các chuỗi, Tập hợp là một chuỗi các chuỗi, v.v.

Chuỗi Redis là một ý tưởng tốt trong tất cả các tình huống rõ ràng nơi bạn muốn lưu trữ trang HTML, nhưng cả khi bạn muốn tránh chuyển đổi dữ liệu đã được mã hóa của mình. Vì vậy, ví dụ, nếu bạn có JSON hoặc MessagePack, bạn có thể chỉ lưu trữ các đối tượng dưới dạng chuỗi. Trong Redis 2.6, bạn thậm chí có thể thao tác loại máy chủ đối tượng này bằng các tập lệnh Lua.

Một cách sử dụng chuỗi thú vị khác là bitmap và nói chung là các mảng truy cập ngẫu nhiên của byte, vì Redis xuất các lệnh để truy cập các phạm vi byte ngẫu nhiên hoặc thậm chí là các bit đơn lẻ. Ví dụ, kiểm tra bài đăng blog tốt này: Số liệu thời gian thực nhanh dễ dàng bằng Redis .

Danh sách

Danh sách là tốt khi bạn có khả năng chỉ chạm vào các thái cực của danh sách: gần đuôi, hoặc gần đầu. Danh sách không tốt để phân trang, vì truy cập ngẫu nhiên chậm, O (N). Vì vậy, việc sử dụng tốt các danh sách là hàng đợi và ngăn xếp đơn giản hoặc xử lý các mục trong một vòng lặp bằng cách sử dụng RPOPLPUSH với cùng một nguồn và đích để "xoay" một vòng các mục.

Danh sách cũng tốt khi chúng ta chỉ muốn tạo một bộ sưu tập giới hạn N mục mà chúng ta thường truy cập chỉ các mục trên cùng hoặc dưới cùng hoặc khi N nhỏ.

Bộ

Các bộ là một bộ sưu tập dữ liệu không có thứ tự, vì vậy chúng rất tốt mỗi khi bạn có một bộ sưu tập các vật phẩm và điều rất quan trọng là kiểm tra sự tồn tại hoặc kích thước của bộ sưu tập một cách rất nhanh. Một điều thú vị khác về các bộ là hỗ trợ cho các phần tử ngẫu nhiên nhìn trộm hoặc popping (các lệnh SRANDMEMBER và SPOP).

Các bộ cũng tốt để thể hiện các mối quan hệ, ví dụ: "Bạn bè của người dùng X là gì?" và kể từ đó trở đi. Nhưng các cấu trúc dữ liệu tốt khác cho loại công cụ này được sắp xếp theo bộ như chúng ta sẽ thấy.

Đặt hỗ trợ các hoạt động phức tạp như giao lộ, hiệp hội, v.v., vì vậy đây là cấu trúc dữ liệu tốt để sử dụng Redis theo cách "tính toán", khi bạn có dữ liệu và bạn muốn thực hiện chuyển đổi trên dữ liệu đó để có được đầu ra.

Các bộ nhỏ được mã hóa một cách rất hiệu quả.

Băm

Băm là cấu trúc dữ liệu hoàn hảo để biểu diễn các đối tượng, bao gồm các trường và giá trị. Các trường băm cũng có thể được tăng lên một cách nguyên tử bằng cách sử dụng HINCRBY. Khi bạn có các đối tượng như người dùng, bài đăng trên blog hoặc một số loại mặt hàng khác , băm có thể là cách để đi nếu bạn không muốn sử dụng mã hóa của riêng mình như JSON hoặc tương tự.

Tuy nhiên, hãy nhớ rằng các giá trị băm nhỏ được Redis mã hóa rất hiệu quả và bạn có thể yêu cầu Redis thực hiện GET, SET hoặc tăng các trường riêng lẻ theo cách rất nhanh.

Băm cũng có thể được sử dụng để biểu diễn các cấu trúc dữ liệu được liên kết, sử dụng các tham chiếu. Ví dụ, kiểm tra việc thực hiện lamernews.com của các bình luận.

Bộ sắp xếp

Các tập hợp được sắp xếp là các cấu trúc dữ liệu khác, ngoài các danh sách, để duy trì các phần tử theo thứ tự . Bạn có thể làm một số thứ tuyệt vời với các bộ được sắp xếp. Chẳng hạn, bạn có thể có tất cả các loại danh sách Top Something trong ứng dụng web của mình. Người dùng hàng đầu theo điểm số, bài đăng hàng đầu theo số lần xem trang, bất cứ điều gì hàng đầu, nhưng một trường hợp Redis duy nhất sẽ hỗ trợ hàng tấn thao tác chèn và các yếu tố hàng đầu mỗi giây.

Các bộ được sắp xếp, giống như các bộ thông thường, có thể được sử dụng để mô tả các mối quan hệ, nhưng chúng cũng cho phép bạn phân trang danh sách các mục và ghi nhớ thứ tự. Chẳng hạn, nếu tôi nhớ bạn bè của người dùng X với một bộ được sắp xếp, tôi có thể dễ dàng nhớ họ theo thứ tự tình bạn được chấp nhận.

Bộ sắp xếp là tốt cho hàng đợi ưu tiên.

Các bộ được sắp xếp giống như các danh sách mạnh hơn trong đó việc chèn, xóa hoặc nhận phạm vi từ giữa danh sách luôn nhanh. Nhưng chúng sử dụng nhiều bộ nhớ hơn và là cấu trúc dữ liệu O (log (N)).

Phần kết luận

Tôi hy vọng rằng tôi đã cung cấp một số thông tin trong bài đăng này, nhưng tốt hơn hết là tải xuống mã nguồn của lamernews từ http://github.com/antirez/lamernews và hiểu cách thức hoạt động của nó. Nhiều cấu trúc dữ liệu từ Redis được sử dụng trong Lamer News và có nhiều manh mối về những gì sẽ sử dụng để giải quyết một nhiệm vụ nhất định.

Xin lỗi vì lỗi chính tả ngữ pháp, đã nửa đêm ở đây và quá mệt mỏi để xem lại bài đăng;)


45
Đây là tác giả duy nhất của Redis. Tôi gửi email cho anh ấy và yêu cầu anh ấy trả lời. Cảm ơn bạn rất, rất, rất nhiều Salvatore. Đây là thông tin tuyệt vời.
Homer6

58
Cảm ơn, nhưng tôi không phải là người đóng góp lớn duy nhất, Pieter Noordhuis đã cung cấp những phần rất lớn của việc triển khai hiện tại :)
antirez

1
Nếu một chuỗi giống hệt nhau trong nhiều bộ khác nhau, sẽ chỉ có một bản sao của chuỗi được lưu trữ?
sbrian

Làm thế nào zscore trong O (1) chỉ sử dụng một danh sách bỏ qua?
Tối đa

1
Mặc dù skiplist không phải là một cây cân bằng thích hợp, bạn có thể thấy một skiplist là một cây ngẫu nhiên "đảo ngược". Chúng cơ bản là tương đương ngay cả khi việc thực hiện và bố trí khác nhau.
antirez

80

Hầu hết thời gian, bạn không cần phải hiểu cấu trúc dữ liệu cơ bản được sử dụng bởi Redis. Nhưng một chút kiến ​​thức giúp bạn thực hiện đánh đổi bộ nhớ CPU v / s. Nó cũng giúp bạn mô hình hóa dữ liệu của bạn một cách hiệu quả.

Trong nội bộ, Redis sử dụng các cấu trúc dữ liệu sau:

  1. Chuỗi
  2. Từ điển
  3. Danh sách liên kết đôi
  4. Bỏ qua danh sách
  5. Danh sách Zip
  6. Bộ Int
  7. Bản đồ Zip (không dùng cho danh sách zip kể từ Redis 2.6)

Để tìm mã hóa được sử dụng bởi một khóa cụ thể, hãy sử dụng lệnh object encoding <key>.

1. Chuỗi

Trong Redis, Chuỗi được gọi là Chuỗi động đơn giản hoặc SDS . Đó là một trình bao bọc nhỏ trên một char *cho phép bạn lưu trữ độ dài của chuỗi và số byte miễn phí làm tiền tố.

Vì độ dài của chuỗi được lưu trữ, strlen là thao tác O (1). Ngoài ra, vì độ dài đã biết, chuỗi Redis là an toàn nhị phân. Việc một chuỗi chứa ký tự null là hoàn toàn hợp pháp .

Chuỗi là cấu trúc dữ liệu linh hoạt nhất có sẵn trong Redis. Một chuỗi là tất cả những điều sau đây:

  1. Một chuỗi các ký tự có thể lưu trữ văn bản. Xem các lệnh SETGET .
  2. Một mảng byte có thể lưu trữ dữ liệu nhị phân.
  3. Một longcó thể lưu trữ số. Xem các lệnh INCR , DECR , INCRBYDECRBY .
  4. Một Array (của chars, ints, longshoặc bất kỳ loại dữ liệu khác) có thể cho phép truy cập ngẫu nhiên hiệu quả. Xem các lệnh SETRANGEGETRANGE .
  5. Một mảng bit cho phép bạn thiết lập hoặc nhận các bit riêng lẻ. Xem SETBITGETBIT lệnh.
  6. Một khối bộ nhớ mà bạn có thể sử dụng để xây dựng các cấu trúc dữ liệu khác. Điều này được sử dụng trong nội bộ để xây dựng ziplists và intsets, là các cấu trúc dữ liệu nhỏ gọn, hiệu quả bộ nhớ cho số lượng nhỏ các phần tử. Thêm về điều này dưới đây.

2. Từ điển

Redis sử dụng một từ điển cho sau đây:

  1. Để ánh xạ khóa tới giá trị được liên kết của nó, trong đó giá trị có thể là một chuỗi, hàm băm, bộ, bộ được sắp xếp hoặc danh sách.
  2. Để ánh xạ một khóa đến dấu thời gian hết hạn của nó.
  3. Để thực hiện các kiểu dữ liệu Hash, Set và Sắp xếp.
  4. Để ánh xạ các lệnh Redis tới các hàm xử lý các lệnh đó.
  5. Để ánh xạ khóa Redis vào danh sách khách hàng bị chặn trên khóa đó. Xem BLPOP .

Từ điển Redis được thực hiện bằng cách sử dụng Bảng Hash . Thay vì giải thích việc thực hiện, tôi sẽ chỉ giải thích những điều cụ thể của Redis:

  1. Từ điển sử dụng một cấu trúc được gọi dictTypeđể mở rộng hành vi của bảng băm. Cấu trúc này có các con trỏ hàm và do đó các hoạt động sau có thể mở rộng: a) hàm băm, b) so sánh khóa, c) hàm hủy khóa và d) hàm hủy giá trị.
  2. Từ điển sử dụng murmurhash2 . (Trước đây họ đã sử dụng hàm băm djb2 , với seed = 5381, nhưng sau đó hàm băm được chuyển sang murmur2 . Xem câu hỏi này để được giải thích về thuật toán băm djb2 .)
  3. Redis sử dụng Băm tăng dần, còn được gọi là Thay đổi kích thước tăng dần . Từ điển có hai bảng băm. Mỗi khi từ điển được chạm vào , một nhóm được di chuyển từ bảng băm đầu tiên (nhỏ hơn) sang bảng thứ hai. Bằng cách này, Redis ngăn chặn một hoạt động thay đổi kích thước đắt tiền.

Các Setcấu trúc dữ liệu sử dụng một từ điển để đảm bảo không có bản sao. Các Sorted Setsử dụng một từ điển để ánh xạ phần tử đến điểm của nó, đó là lý do ZSCORE là O (1) hoạt động.

3. Danh sách liên kết đôi

Kiểu listdữ liệu được triển khai bằng Danh sách liên kết đôi . Việc triển khai của Redis là trực tiếp từ thuật toán-sách giáo khoa. Thay đổi duy nhất là Redis lưu trữ độ dài trong cấu trúc dữ liệu danh sách. Điều này đảm bảo rằng LLEN có độ phức tạp O (1).

4. Bỏ qua danh sách

Redis sử dụng Skip Lists làm cấu trúc dữ liệu cơ bản cho các bộ được sắp xếp. Wikipedia có một giới thiệu tốt. Danh sách bỏ qua của William Pugh : Một giải pháp thay thế cho cây cân bằng có nhiều chi tiết hơn.

Các bộ được sắp xếp sử dụng cả Danh sách bỏ qua và Từ điển. Từ điển lưu trữ số điểm của từng yếu tố.

Việc thực hiện Danh sách bỏ qua của Redis khác với triển khai tiêu chuẩn theo các cách sau:

  1. Redis cho phép nhân đôi điểm số. Nếu hai nút có cùng số điểm, chúng được sắp xếp theo thứ tự từ điển .
  2. Mỗi nút có một con trỏ trở lại ở mức 0. Điều này cho phép bạn đi qua các phần tử theo thứ tự ngược lại của điểm số.

5. Danh sách Zip

Danh sách Zip giống như một danh sách được liên kết đôi, ngoại trừ nó không sử dụng con trỏ và lưu trữ dữ liệu nội tuyến.

Mỗi nút trong danh sách liên kết đôi có 3 con trỏ - một con trỏ tiến, một con trỏ lùi và một con trỏ để tham chiếu dữ liệu được lưu trữ tại nút đó. Con trỏ yêu cầu bộ nhớ (8 byte trên hệ thống 64 bit) và vì vậy đối với các danh sách nhỏ, danh sách liên kết đôi rất không hiệu quả.

Danh sách Zip lưu trữ các phần tử tuần tự trong Chuỗi Redis. Mỗi phần tử có một tiêu đề nhỏ lưu trữ độ dài và kiểu dữ liệu của phần tử, phần bù cho phần tử tiếp theo và phần bù cho phần tử trước. Những điểm bù này thay thế cho con trỏ tiến và lùi. Vì dữ liệu được lưu trữ nội tuyến, chúng tôi không cần một con trỏ dữ liệu.

Danh sách Zip được sử dụng để lưu trữ danh sách nhỏ, bộ sắp xếp và giá trị băm. Các bộ được sắp xếp được làm phẳng thành một danh sách thích [element1, score1, element2, score2, element3, score3]và được lưu trong Danh sách Zip. Băm được làm phẳng thành một danh sách như [key1, value1, key2, value2]vv

Với Danh sách Zip, bạn có khả năng đánh đổi giữa CPU và Bộ nhớ. Danh sách Zip có hiệu quả bộ nhớ, nhưng chúng sử dụng nhiều CPU hơn danh sách được liên kết (hoặc bảng Hash / Danh sách bỏ qua). Tìm một phần tử trong danh sách zip là O (n). Chèn một phần tử mới đòi hỏi phải phân bổ lại bộ nhớ. Do đó, Redis chỉ sử dụng mã hóa này cho các danh sách nhỏ, giá trị băm và các bộ được sắp xếp. Bạn có thể điều chỉnh hành vi này bằng cách thay đổi các giá trị của <datatype>-max-ziplist-entries<datatype>-max-ziplist-value>trong redis.conf. Xem Redis Memory Optimization, phần "Mã hóa đặc biệt các loại dữ liệu tổng hợp nhỏ" để biết thêm thông tin.

Các ý kiến ​​về ziplist.c là tuyệt vời và bạn có thể hiểu hoàn toàn cấu trúc dữ liệu này mà không cần phải đọc mã.

6. Bộ Int

Bộ Int là một tên ưa thích cho "Mảng số nguyên được sắp xếp".

Trong Redis, các bộ thường được thực hiện bằng bảng băm. Đối với các bộ nhỏ, một bảng băm là bộ nhớ không hiệu quả. Khi tập hợp chỉ bao gồm các số nguyên, một mảng thường hiệu quả hơn.

Một Int Set là một mảng các số nguyên được sắp xếp. Để tìm một phần tử, thuật toán tìm kiếm nhị phân được sử dụng. Điều này có độ phức tạp của O (log N). Việc thêm các số nguyên mới vào mảng này có thể yêu cầu phân bổ lại bộ nhớ, có thể trở nên đắt đỏ đối với các mảng số nguyên lớn.

Là một tối ưu hóa bộ nhớ hơn nữa, Int Set có 3 biến thể với các kích thước nguyên khác nhau: 16 bit, 32 bit và 64 bit. Redis đủ thông minh để sử dụng đúng biến thể tùy thuộc vào kích thước của các yếu tố. Khi một yếu tố mới được thêm vào và nó vượt quá kích thước hiện tại, Redis sẽ tự động di chuyển nó sang kích thước tiếp theo. Nếu một chuỗi được thêm vào, Redis sẽ tự động chuyển đổi Int Set thành một tập hợp dựa trên Bảng Hash thông thường.

Bộ Int là sự đánh đổi giữa CPU và Bộ nhớ. Bộ Int cực kỳ hiệu quả về bộ nhớ và đối với các bộ nhỏ thì chúng nhanh hơn bảng băm. Nhưng sau một số phần tử nhất định, thời gian truy xuất O (log N) và chi phí cho bộ nhớ phân bổ lại trở nên quá nhiều. Dựa trên các thử nghiệm, ngưỡng tối ưu để chuyển sang bảng băm thông thường được tìm thấy là 512. Tuy nhiên, bạn có thể tăng ngưỡng này (giảm nó không có ý nghĩa) dựa trên nhu cầu của ứng dụng của bạn. Xem set-max-intset-entriestrong redis.conf.

7. Bản đồ Zip

Bản đồ Zip là từ điển được làm phẳng và được lưu trữ trong một danh sách. Chúng rất giống với Danh sách Zip.

Bản đồ Zip đã không còn được sử dụng kể từ Redis 2.6 và các giá trị băm nhỏ được lưu trữ trong Danh sách Zip. Để tìm hiểu thêm về mã hóa này, hãy tham khảo các ý kiến ​​trong zipmap.c .


2

Redis lưu trữ các khóa trỏ đến các giá trị. Các khóa có thể là bất kỳ giá trị nhị phân nào có kích thước hợp lý (sử dụng các chuỗi ASCII ngắn được khuyến nghị cho mục đích đọc và gỡ lỗi). Giá trị là một trong năm loại dữ liệu Redis bản địa.

1.strings - một chuỗi các byte an toàn nhị phân lên tới 512 MB

2.hash - tập hợp các cặp giá trị chính

3.lists - bộ sưu tập các chuỗi theo thứ tự chèn

4. bộ - một bộ chuỗi độc đáo không có thứ tự

5. bộ tập hợp - một tập hợp các chuỗi duy nhất được sắp xếp theo cách tính điểm do người dùng xác định

Dây

Chuỗi Redis là một chuỗi các byte.

Các chuỗi trong Redis là an toàn nhị phân (có nghĩa là chúng có độ dài đã biết không được xác định bởi bất kỳ ký tự kết thúc đặc biệt nào), vì vậy bạn có thể lưu trữ mọi thứ lên tới 512 megabyte trong một chuỗi.

Chuỗi là khái niệm "kho giá trị chính". Bạn có một khóa trỏ đến một giá trị, trong đó cả khóa và giá trị là chuỗi văn bản hoặc chuỗi nhị phân.

Đối với tất cả các hoạt động có thể có trên chuỗi, hãy xem http://redis.io/commands/#opes

Băm

Băm Redis là một tập hợp các cặp giá trị chính.

Hàm băm Redis chứa nhiều cặp giá trị khóa, trong đó mỗi khóa và giá trị là một chuỗi. Redis băm không hỗ trợ trực tiếp các giá trị phức tạp (nghĩa là bạn không thể có trường băm có giá trị của danh sách hoặc tập hợp hoặc hàm băm khác), nhưng bạn có thể sử dụng các trường băm để trỏ đến các giá trị phức tạp cấp cao nhất khác. Hoạt động đặc biệt duy nhất bạn có thể thực hiện trên các giá trị trường băm là tăng / giảm nguyên tử của nội dung số.

Bạn có thể nghĩ về một Redis băm theo hai cách: như một đại diện đối tượng trực tiếp và như một cách để lưu trữ nhiều giá trị nhỏ gọn.

Đại diện đối tượng trực tiếp là đơn giản để hiểu. Các đối tượng có tên (khóa của hàm băm) và một tập hợp các khóa bên trong có giá trị. Xem ví dụ dưới đây cho, tốt, một ví dụ.

Lưu trữ nhiều giá trị nhỏ bằng cách sử dụng hàm băm là một kỹ thuật lưu trữ dữ liệu khổng lồ Redis thông minh. Khi hàm băm có số lượng trường nhỏ (~ 100), Redis tối ưu hóa hiệu quả lưu trữ và truy cập của toàn bộ hàm băm. Tối ưu hóa lưu trữ băm nhỏ của Redis làm tăng một hành vi thú vị: sẽ hiệu quả hơn khi có 100 băm với 100 khóa và giá trị bên trong thay vì có 10.000 khóa cấp cao nhất trỏ đến giá trị chuỗi. Sử dụng băm Redis để tối ưu hóa lưu trữ dữ liệu của bạn theo cách này đòi hỏi phải có thêm chi phí lập trình để theo dõi nơi dữ liệu kết thúc, nhưng nếu lưu trữ dữ liệu của bạn dựa trên chuỗi nguyên thủy, bạn có thể tiết kiệm rất nhiều chi phí bộ nhớ bằng một thủ thuật kỳ lạ này.

Đối với tất cả các hoạt động có thể có trên băm, hãy xem tài liệu băm

Danh sách

Danh sách Redis hoạt động như danh sách liên kết.

Bạn có thể chèn vào, xóa từ và duyệt qua danh sách từ đầu hoặc đuôi của danh sách.

Sử dụng danh sách khi bạn cần duy trì các giá trị theo thứ tự chúng được chèn. (Redis không cung cấp cho bạn tùy chọn để chèn vào bất kỳ vị trí danh sách tùy ý nào nếu bạn cần, nhưng hiệu suất chèn của bạn sẽ giảm nếu bạn chèn xa vị trí bắt đầu của bạn.)

Danh sách Redis thường được sử dụng như hàng đợi của nhà sản xuất / người tiêu dùng. Chèn các mục vào danh sách sau đó bật các mục từ danh sách. Điều gì xảy ra nếu người tiêu dùng của bạn cố gắng bật từ một danh sách không có yếu tố? Bạn có thể yêu cầu Redis đợi một phần tử xuất hiện và trả lại cho bạn ngay lập tức khi nó được thêm vào. Điều này biến Redis thành một hệ thống thông báo hàng đợi / sự kiện / công việc / nhiệm vụ / thông báo thời gian thực.

Về cơ bản, bạn có thể xóa các phần tử khỏi một trong danh sách, cho phép mọi danh sách được coi là ngăn xếp hoặc hàng đợi.

Bạn cũng có thể duy trì danh sách có độ dài cố định (bộ sưu tập được giới hạn) bằng cách cắt danh sách của bạn thành một kích thước cụ thể sau mỗi lần chèn.

Đối với tất cả các hoạt động có thể có trong danh sách, xem tài liệu danh sách

Bộ

Redis bộ là, tốt, bộ.

Một bộ Redis chứa các chuỗi Redis không có thứ tự duy nhất trong đó mỗi chuỗi chỉ tồn tại một lần trên mỗi bộ. Nếu bạn thêm cùng một yếu tố mười lần vào một bộ, nó sẽ chỉ hiển thị một lần. Các bộ rất tốt cho việc lười biếng đảm bảo một cái gì đó tồn tại ít nhất một lần mà không phải lo lắng về các yếu tố trùng lặp tích lũy và lãng phí không gian. Bạn có thể thêm cùng một chuỗi bao nhiêu lần tùy thích mà không cần kiểm tra xem nó có tồn tại không.

Các bộ rất nhanh để kiểm tra thành viên, chèn và xóa các thành viên trong bộ.

Bộ có hoạt động thiết lập hiệu quả, như bạn mong đợi. Bạn có thể lấy liên kết, giao nhau và sự khác biệt của nhiều bộ cùng một lúc. Kết quả có thể được trả về cho người gọi hoặc kết quả có thể được lưu trữ trong một bộ mới để sử dụng sau.

Các bộ có quyền truy cập thời gian liên tục để kiểm tra thành viên (không giống như danh sách) và Redis thậm chí có loại bỏ và trả lại thành viên ngẫu nhiên thuận tiện ("bật một yếu tố ngẫu nhiên từ bộ") hoặc trả lại thành viên ngẫu nhiên mà không thay thế ("cung cấp cho tôi 30 người dùng duy nhất ngẫu nhiên ") hoặc với sự thay thế (" đưa cho tôi 7 thẻ, nhưng sau mỗi lần chọn, hãy đặt lại thẻ để có thể lấy mẫu lại ").

Đối với tất cả các hoạt động có thể trên bộ, xem tài liệu bộ .

Bộ sắp xếp

Redis bộ sắp xếp là bộ có thứ tự do người dùng xác định.

Để đơn giản, bạn có thể nghĩ về một tập hợp được sắp xếp như một cây nhị phân với các phần tử duy nhất. (Redis bộ được sắp xếp thực sự là danh sách bỏ qua .) Thứ tự sắp xếp của các yếu tố được xác định bởi điểm số của từng yếu tố.

Bộ sắp xếp vẫn là bộ. Các yếu tố chỉ có thể xuất hiện một lần trong một bộ. Một phần tử, cho mục đích duy nhất, được xác định bởi nội dung chuỗi của nó. Chèn phần tử "apple" với điểm số sắp xếp 3, sau đó chèn phần tử "apple" với điểm số sắp xếp 500 kết quả trong một phần tử "apple" với điểm số sắp xếp 500 trong tập hợp được sắp xếp của bạn. Các bộ chỉ duy nhất dựa trên Dữ liệu, không dựa trên các cặp (Điểm, Dữ liệu).

Đảm bảo rằng mô hình dữ liệu của bạn phụ thuộc vào nội dung chuỗi chứ không phải điểm số của phần tử cho tính duy nhất. Điểm số được phép lặp lại (hoặc thậm chí bằng 0), nhưng, lần cuối cùng, các phần tử tập hợp chỉ có thể tồn tại một lần trên mỗi tập được sắp xếp. Ví dụ: nếu bạn cố lưu trữ lịch sử của mỗi lần đăng nhập của người dùng dưới dạng tập hợp được sắp xếp bằng cách đặt điểm số kỷ nguyên của thông tin đăng nhập và giá trị id người dùng, cuối cùng bạn sẽ chỉ lưu trữ kỷ nguyên đăng nhập cuối cùng cho tất cả người dùng của bạn. Tập hợp của bạn sẽ tăng theo kích thước của cơ sở người dùng của bạn chứ không phải kích thước đăng nhập * cơ sở người dùng mong muốn của bạn.

Các yếu tố được thêm vào thiết lập của bạn với điểm số. Bạn có thể cập nhật điểm của bất kỳ yếu tố nào bất cứ lúc nào, chỉ cần thêm lại yếu tố đó với điểm mới. Điểm số được biểu thị bằng cách nhân đôi dấu phẩy động, vì vậy bạn có thể chỉ định mức độ chi tiết của dấu thời gian có độ chính xác cao nếu cần. Nhiều yếu tố có thể có cùng số điểm.

Bạn có thể lấy các phần tử theo một vài cách khác nhau. Vì mọi thứ đã được sắp xếp, bạn có thể yêu cầu các yếu tố bắt đầu ở điểm thấp nhất. Bạn có thể yêu cầu các yếu tố bắt đầu từ điểm số cao nhất ("ngược lại"). Bạn có thể yêu cầu các yếu tố theo điểm số sắp xếp của chúng theo thứ tự tự nhiên hoặc ngược lại.

Đối với tất cả các hoạt động có thể có trên các tập đã sắp xếp, xem tài liệu tập đã sắp xếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.