Tôi sẽ cố gắng trả lời câu hỏi của bạn, nhưng tôi sẽ bắt đầu với điều gì đó thoạt nghe có vẻ lạ:nếu bạn không quan tâm đến nội bộ của Redis, bạn không nên quan tâm về cách các loại dữ liệu được triển khai nội bộ. Điều này là vì một lý do đơn giản:đối với mỗi hoạt động của Redis, bạn sẽ tìm thấy độ phức tạp về thời gian trong tài liệu và, nếu bạn có tập hợp các hoạt động và độ phức tạp về thời gian, điều duy nhất 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 nhỏ trong thế giới thực).
Nhưng vì bạn đã hỏi, đây là cách triển khai cơ bản của mọi kiểu dữ liệu Redis.
- Chuỗi được triển khai bằng cách sử dụng thư viện chuỗi động C để chúng tôi không phải trả tiền (nói một cách tiệm cận) cho các phân bổ trong hoạt động nối thêm. Bằng cách này, chẳng hạn, chúng ta có các phần phụ O (N) thay vì có hành vi bậc hai.
- Danh sách được triển khai với các danh sách được liên kết.
- Bộ và Hàm băm được triển khai bằng bảng băm.
- Nhóm được sắp xếp được triển khai với danh sách bỏ qua (một loại cây cân đối đặc biệt).
Nhưng khi danh sách, tập hợp và tập hợp đã sắp xếp có số lượng mục nhỏ và kích thước của các giá trị lớn nhất, thì một kiểu mã hóa khác, nhỏ gọn hơn nhiều sẽ được sử dụng. Mã hóa này khác nhau đối với các loại khác nhau, nhưng có đặc điểm là nó là một khối dữ liệu nhỏ gọn thường buộc phải 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 đốm màu O (N) nhỏ là bộ nhớ cache bị lãng quên vì vậy thực tế mà 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 liên kết, băm, v.v.).
Nhưng câu hỏi của bạn không thực sự chỉ về nội bộ, quan điểm của bạn là Sử dụng loại nào để hoàn thành công việc? .
Chuỗi
Đây là loại cơ sở của tất cả các loại. Đây là một trong bốn kiểu nhưng cũng là kiểu cơ sở của các kiểu phức tạp, vì Danh sách là danh sách các chuỗi, Tập hợp là một tập hợp các chuỗi, v.v.
Chuỗi Redis là một ý tưởng hay trong tất cả các trường hợp hiển nhiên mà bạn muốn lưu trữ một trang HTML, nhưng cũng như 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 phía máy chủ đối tượng này bằng cách sử dụng các tập lệnh Lua.
Một cách sử dụng thú vị khác của chuỗi 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 ngẫu nhiên của byte hoặc thậm chí là các bit đơn. Ví dụ, hãy kiểm tra bài đăng blog hay này:Số liệu thời gian thực Nhanh chóng Dễ dàng sử dụng Redis.
Danh sách
Danh sách tốt khi bạn có khả năng chỉ chạm vào các điểm cực đoan của danh sách:gần đuôi hoặc gần đầu. Danh sách không tốt lắm để phân trang nội dung, vì truy cập ngẫu nhiên chậm, O (N). Vì vậy, cách sử dụng tốt của danh sách là hàng đợi và ngăn xếp thuần túy hoặc xử lý các mục trong một vòng lặp bằng cách sử dụng RPOPLPUSH có cùng nguồn và đích để "xoay" một vòng trong tổng số các mục.
Danh sách cũng tốt khi chúng tôi chỉ muốn tạo một bộ sưu tập có giới hạn gồm N mục ở đó thường chúng tôi chỉ truy cập các mục trên cùng hoặc dưới cùng hoặc khi N nhỏ.
Bộ
Tập hợp là một tập hợ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 tập hợp các mục 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 tập hợp một cách rất nhanh chóng. Một điều thú vị khác về tập hợp là hỗ trợ nhìn trộm hoặc hiển thị các phần tử ngẫu nhiên (lệnh SRANDMEMBER và SPOP).
Các tập hợp cũng tốt để thể hiện các mối quan hệ, ví dụ:"Bạn 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 nội dung này là các tập hợp được sắp xếp như chúng ta sẽ thấy.
Các tập hợp hỗ trợ các hoạt động phức tạp như giao lộ, liên kết, v.v., vì vậy đây là một 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 các phép biến đổi trên dữ liệu đó để thu được một số đầu ra.
Các tập hợp nhỏ được mã hóa theo cách rất hiệu quả.
Hàm băm
Hàm băm là cấu trúc dữ liệu hoàn hảo để đại diện cho 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 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ục khác , hàm băm có thể là cách tốt nhất 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 hàm 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 nguyên tử GET, SET hoặc tăng từng trường một cách rất nhanh.
Hàm 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ụ:hãy kiểm tra việc triển khai các nhận xét của lamernews.com.
Bộ được sắp xếp
Tập hợp đã sắp xếp là chỉ cấu trúc dữ liệu khác, ngoài danh sách, để duy trì các phần tử có thứ tự . Bạn có thể làm một số điều thú vị với các bộ được sắp xếp. Ví dụ:bạn có thể có tất cả các loại Nội dung hàng đầu danh sách trong ứng dụng web của bạn. 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ứ thứ gì hàng đầu, nhưng một phiên bản Redis duy nhất sẽ hỗ trợ rất nhiều thao tác chèn và tải phần tử mỗi giây.
Các tập hợp đã sắp xếp, giống như các tập hợp thông thường, có thể được sử dụng để mô tả 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ự. Ví dụ:nếu tôi nhớ bạn bè của người dùng X với một nhóm đượ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.
Các tập hợp được sắp xếp phù hợp với các hàng đợi ưu tiên.
Các tập hợp đã sắp xếp giống như những danh sách mạnh mẽ hơn, trong đó việc chèn, xóa hoặc lấy các phạm vi từ giữa danh sách luôn diễn ra nhanh chóng. 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)).
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 hoạt động của nó. Nhiều cấu trúc dữ liệu từ Redis được sử dụng bên trong Lamer News và có nhiều manh mối về cách 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, ở đây là nửa đêm và quá mệt để xem lại bài đăng;)