Phiên bản Redis 7.0 đang được phát hành và chúng tôi vừa xuất bản ứng cử viên phát hành thứ hai của nó. Ứng cử viên phát hành này là một mốc quan trọng đã được lên kế hoạch nhằm hoàn thiện các tính năng của phiên bản, nhưng đây cũng là cơ hội để chúng tôi trình bày nội dung bổ sung trong phiên bản mới. Ví dụ:Redis Functions đã phát triển từ sự hỗ trợ hiện có cho các tập lệnh mà Redis đã có kể từ phiên bản 2.6. Tương tự, nhiều tính năng của Redis đã được phát triển.
Trong tự nhiên, quá trình tiến hóa xảy ra dường như ngẫu nhiên và chọn lọc tự nhiên quan tâm đến việc sắp xếp các kết quả của nó. Nói chung, trong phần mềm nói chung và cụ thể là với Redis, quá trình này diễn ra ngược lại:chúng tôi chọn đường dẫn mong muốn và phát triển dự án để đi theo nó cho phù hợp. Thay vì để sự ngẫu nhiên quyết định tương lai, việc lập kế hoạch và thực hiện lộ trình của chúng tôi chủ yếu được hướng dẫn bởi phản hồi của người dùng và các trường hợp sử dụng mới mà Redis phù hợp.
Trong Redis 7.0, Danh sách kiểm soát truy cập (ACL) cũng đã tăng bậc thang tiến hóa. Được giới thiệu trong Redis 6.0, ACL đã đảo ngược quan điểm lâu nay về việc bảo mật nằm ngoài phạm vi của dự án bằng cách thêm các cơ chế để quản lý người dùng và quyền của họ. Tuy nhiên, cộng đồng của chúng tôi đã nhanh chóng thông báo cho chúng tôi rằng mặc dù đây là một bước đi đúng hướng, nhưng tính năng này vẫn thiếu các tính năng cần thiết.
Một trong những lỗ hổng trong ACL đã được Redis 6.2 giải quyết, đó là việc kiểm soát các mẫu tên kênh Pub / Sub được phép. Nhưng đó chỉ là khoảng cách dừng một phần và chúng tôi mất nhiều thời gian hơn để tìm ra một cách tiếp cận đơn giản và hiệu quả để giải quyết những vấn đề còn lại.
Thiết kế ban đầu của ACL chỉ được cung cấp cho các trường hợp sử dụng kiểm soát quyền cơ bản. Nó cho phép chỉ cấp hoặc từ chối quyền truy cập vào một nhóm lệnh, khóa và mẫu tên kênh cho mỗi người dùng. Chẳng hạn, không thể hạn chế lệnh `SET` trong một tập con khóa, đồng thời cho phép` GET` với một tập con khóa khác cho một người dùng nhất định. Về mặt hiệu quả, ACL không phải là một cơ chế hiệu quả để thực hiện các chính sách bảo mật.
Redis 7.0’s Access Control List, gọi tắt là ACLv2, tương thích với bản gốc nhưng bổ sung thêm hai cải tiến quan trọng. Thứ nhất, ACLv2 là tất cả về bộ chọn. Thứ hai, ACLv2 cho phép thiết lập quyền loại truy cập cho các khóa cụ thể. Khả năng này giúp cho người dùng có thể giới hạn độc quyền các hoạt động chỉ đọc, chỉ ghi hoặc đọc ghi đối với một tập hợp con của các khóa.
Thiết kế ACL ban đầu chỉ cung cấp một bộ chọn cho mỗi người dùng - bộ chọn mặc định. Bộ chọn mô tả các phím và kênh mà người dùng có thể truy cập, các danh mục và lệnh. ACLv2 cho phép thêm bất kỳ số bộ chọn nào trên đầu trang mặc định được áp dụng theo thứ tự. Cách tiếp cận này đáp ứng các yêu cầu của các chính sách bảo mật khắt khe hơn và đưa ACL đến gần mức hoàn thiện hơn.
Khả năng nội tâm của máy chủ là một khía cạnh khác của Redis đã được nâng cao đáng kể trong phiên bản 7.0. Redis hiển thị một API, từ điển lệnh của nó, qua đó nó tương tác. Khi dự án phát triển, số lượng các lệnh khác nhau (và các lệnh phụ của chúng) đã tăng lên, đạt mức vượt quá 380 trong phiên bản 7.0. Bởi vì mọi lệnh Redis đều chuyên biệt cho các nhiệm vụ nhất định, việc ghi lại các đối số và hành vi gọi của mỗi lệnh là nguyên tắc cốt lõi của dự án. Tài liệu này là hợp đồng duy nhất giữa máy chủ và máy khách của nó.
Về mặt lịch sử, các lệnh được ghi lại bên ngoài cho chính dự án trong một kho lưu trữ mã riêng biệt. Chúng tôi giữ tất cả tài liệu ở định dạng (hầu hết) con người có thể đọc được vì nó được thiết kế để mọi người đọc. Điều này đặt ra một thách thức đối với máy móc (hay nói đúng hơn là những người lập trình máy móc) vì việc dịch văn xuôi sang mã rất lộn xộn và dễ hỏng. Cụ thể, các tác giả của khách hàng cho Redis chỉ có thể hy vọng giữ cho dự án của họ được cập nhật bằng cách theo dõi các thay đổi đối với tài liệu và đọc các ghi chú phát hành.
Vì vậy, đến phiên bản 2.8, chúng tôi nhận ra rằng chúng tôi cũng cần một cách lập trình cho phép máy chủ báo cáo các lệnh của nó. Lệnh được đặt tên khéo léo (nhưng cũng có thể nói là lí nhí) `COMMAND` liệt kê trong thời gian chạy các lệnh mà máy chủ hỗ trợ. Hơn nữa, lệnh con `COMMAND GETKEYS` cho phép khách hàng gửi một lệnh nguyên văn và các đối số của nó để yêu cầu máy chủ trích xuất bất kỳ tên khóa nào từ nó. Trích xuất các tên khóa từ một lệnh là bắt buộc để khách hàng có thể chỉ đạo hoạt động một cách chính xác trong một triển khai theo nhóm.
Một phần được thúc đẩy bởi các nỗ lực liên quan đến ACLv2 nhưng cũng để làm cho danh sách lệnh thời gian chạy hữu ích hơn cho các máy khách, phiên bản 7.0 đã sửa chữa nhiều cơ chế nội bộ của quản lý lệnh của máy chủ. Ngoài ra, chúng tôi đã làm phong phú thêm siêu dữ liệu mà máy chủ lưu giữ về mỗi lệnh, giúp bạn có thể xây dựng các ứng dụng khách tinh vi mà (hầu như) không có kiến thức trước về khả năng của máy chủ. Cuối cùng, bảng lệnh được tân trang lại được xây dựng theo cách mà các mô-đun Redis có thể mở rộng nó bằng các lệnh tương ứng của chúng, để cung cấp mức độ xem xét tương tự như các lệnh cốt lõi.
Các thông số kỹ thuật của khóa lệnh mới cho phép khách hàng trích xuất cục bộ các khóa từ các lệnh nguyên văn mà không liên quan đến máy chủ của cụm, do đó cải thiện độ trễ và giảm băng thông mạng. Siêu dữ liệu về các đối số lệnh cho phép khách hàng khám phá và thích ứng với những thay đổi về cú pháp lệnh giữa các phiên bản máy chủ. Khách hàng có thể có thêm thông tin về việc thực thi các lệnh trong các trường hợp đặc biệt và các kiểu triển khai khác nhau từ các mẹo lệnh.
Nỗ lực này cũng bao gồm việc quảng bá các lệnh con cho các công dân hạng nhất trong bảng lệnh của máy chủ. Ban đầu, các lệnh con được giới thiệu cho Redis để chống lại tính chất ngày càng tăng của API. Lý do là thay vì thêm một lệnh mới cho mọi tác vụ, các tác vụ liên quan được gọi bằng cách chỉ gọi một lệnh “cha”. Lệnh “cha” chấp nhận làm đối số đầu tiên của nó là tên của lệnh con, lệnh này sẽ ra lệnh cho hành động được thực hiện. Từ quan điểm kỹ thuật, các lệnh con kế thừa tất cả các đặc điểm của lệnh mẹ của chúng (ví dụ:danh mục ACL, cờ đọc / ghi, đặc điểm kỹ thuật chính, v.v.), nên không thể có được sự phân biệt chi tiết giữa các hành vi khác nhau của chúng.
Ví dụ:lệnh `CLIENT` là một giỏ tổng hợp cho các tác vụ quản lý kết nối tự hào có không ít hơn 15 lệnh con khác nhau. Một số lệnh con của nó, chẳng hạn như `CLIENT SETNAME`, thường được gọi bởi các kết nối máy khách bình thường, trong khi những lệnh khác như` CLIENT KILL` có khả năng bị sử dụng sai và do đó chỉ nên được giới hạn cho quản trị viên sử dụng. Các phiên bản trước của Redis thiếu các cơ chế nội bộ hỗ trợ việc phân biệt như vậy, do đó hướng các nhà phát triển đến tài liệu và tạo ra sự nhầm lẫn. Tuy nhiên, trong Redis 7.0, mọi lệnh con đều có tập hợp các đặc điểm riêng của nó, bất kể cha mẹ hoặc anh chị em của nó, cho phép mô tả chính xác của nó.
Bài đăng này hóa ra là một bức tường văn bản có lẽ đi vào quá nhiều chi tiết kỹ thuật về cuối bài (nếu thậm chí có thứ như quá nhiều chi tiết kỹ thuật). Tuy nhiên, chúng tôi hy vọng rằng tất cả không nhàm chán và chúng tôi đã làm sáng tỏ phiên bản mới và sự phù hợp của nó trong dự án. Chúng tôi đang làm việc trên (các) ứng cử viên phát hành cuối cùng để hướng tới tính khả dụng chung của phiên bản, nhưng hãy chú ý theo dõi các bài đăng tiếp theo của chúng tôi trong loạt bài sẽ tiếp tục chuyến tham quan của phiên bản mới.