Phiên bản mới là bước tiến hóa của một số tính năng Redis, bổ sung các tính năng mới, và cung cấp sức mạnh thô lớn hơn với việc sử dụng tài nguyên tốt hơn.
Hôm nay, chúng tôi tự hào thông báo sự có sẵn của ứng cử viên phát hành đầu tiên (RC1) của Redis v7.0. Phiên bản 7.0 là một cột mốc quan trọng cho dự án đã được phát triển trong phần lớn năm qua. Bản phát hành chính này là cơ hội để thực hiện những thay đổi căn bản hơn về mặt chức năng và nội bộ. Chúng tôi dự kiến tuân theo chu kỳ phát hành thông thường, vì vậy hai ứng cử viên phát hành tiếp theo, mỗi ứng cử viên cách nhau khoảng ba tuần, được lên kế hoạch trước khi Redis 7.0 đạt sẵn sàng tổng quát (GA).
Redis 7.0 bổ sung nhiều tính năng mới, như Functions (Hàm), ACL v2, Pub/Sub phân mảnh (sharded Pub/Sub) và nhiều hơn nữa. Chúng tôi sẽ đề cập đến các tính năng này trong bài này và một loạt bài tiếp theo. Ngoài ra, rất nhiều công sức cho phiên bản này tập trung vào việc cải thiện và tối ưu hóa những phần của Redis ít hiển thị hơn với hầu hết người dùng. Nỗ lực này trải rộng gần như mọi hệ con của Redis, chạm đến sự bền bền (persistence), sao chép (replication), mạng, bộ nhớ và sử dụng tính toán. Kết quả là một Redis nhanh hơn, ổn định hơn và tiết kiệm hơn bao giờ hết.
Phiên bản Redis mới không 선 báo các cấu trúc dữ liệu mới hay đẩy các khía cạnh vận hành vào những lĩnh vực mới. Thay vào đó, nó tập trung vào việc nhìn lại nội bộ dự án, thách thức một số giả thiết thiết kế hiện có, thực hiện những bước tiến táo bạo hơn để cải thiện cơ sở hạ tầng, và nội hóa nhu cầu cũng như trường hợp sử dụng của cộng đồng.
Redis Functions là ví dụ điển hình cho điều trên. Functions thuộc chủ đề rộng hơn là Khả năng lập trình Redis (Redis Programmability), nghĩa là khả năng lập trình Redis. "Lập trình Redis" có nghĩa là让 máy chủ thực thi logic của người dùng, chủ yếu để đạt được tính cục bộ của dữ liệu (data locality). Khả năng lập trình đã là một phần của Redis kể từ khi giới thiệu kịch bản Lua trong phiên bản 2.6 (tham khảo Giới thiệu về Kịch bản Eval để biết thêm chi tiết).
Việc áp dụng kịch bản Lua bởi người dùng Redis đã tăng lên từ đó. Kịch bản cung cấp một cách hiệu quả và đơn giản để 구성 các quy trình làm việc phía máy chủ từ các hoạt động lõi của Redis và cấu trúc điều khiển. Chúng có thể đóng vai trò như một lớp trừu tượng của các cấu trúc dữ liệu cơ bản từ mã gốc của ứng dụng. Tập hợp kịch bản Lua của một ứng dụng triển khai các hoạt động logic của nó (ví dụ: kịch bản "thêm người dùng" hoặc "đặt hàng").
Vì kịch bản là một tính năng phổ biến của Redis đã tồn tại lâu nay, chúng tôi đã thu thập rất nhiều phản hồi về nó. Chúng tôi phát hiện hầu hết các yêu cầu rơi vào ba nhóm:
- Độc lập (Independence): Kịch bản là một phần của ứng dụng. Chúng phản ánh nội bộ của ứng dụng, do đó chúng bị kết nối chặt chẽ với việc triển khai. Ứng dụng cần nhúng mã nguồn kịch bản và tải chúng tại thời điểm chạy. Sự rối rắm này làm tăng độ phức tạp ở mọi giai đoạn của vòng đời ứng dụng, từ phát triển, qua thử nghiệm, đến triển khai.
- Động cơ thực thi (Execution Engine): Chỉ có một ngôn ngữ để viết kịch bản trong Redis: Lua. Hơn nữa, do vô số lý do kỹ thuật, Redis đã sử dụng cùng một Lua 5.1 suốt todo thời gian. Nhiều người muốn một phiên bản mới hơn. Hầu hết muốn một ngôn ngữ hoàn toàn khác.
- Sự mạnh mẽ/kiên cố (Robustness): Thiết kế và triển khai kịch bản Lua trong Redis, như bất kỳ phần mềm nào khác, đưa ra các giả định và có giới hạn. Trong một số trường hợp, điều này khiến việc mở rộng cơ chế trở nên cực kỳ phức tạp, thậm chí không thể. Thiếu các khối nền tảng cản trở việc thêm các tính năng có giá trị tiềm năng (như xử lý sự kiện và kịch bản cụm, ví dụ).
Điều đó đưa chúng ta quay lại Redis Functions. Trong Redis 7.0, functions hoàn toàn độc lập với ứng dụng. Kết quả là, functions là các phần mềm thực thi là công dân hạng nhất của cơ sở dữ liệu. Máy chủ Redis quản lý functions giống như dữ liệu người dùng, do đó chúng được lưu trữ bền bền và sao chép để đảm bảo sẵn sàng. Việc tải functions vào cơ sở dữ liệu không còn là trách nhiệm của ứng dụng trong lúc chạy và trở thành một nhiệm vụ bảo trì quản trị có thể lên lịch và quản lý.
Việc functions nằm trong ngữ cảnh của máy chủ giải phóng ứng dụng khỏi việc triển khai functions. Thay vào đó, ứng dụng dựa vào chữ ký functions (function signatures) làm API cho logic nhúng và hoàn toàn không biết về các lệnh và kiểu Redis đang được sử dụng. Nó cho phép các ứng dụng khác nhau chia sẻ functions. Nó cũng cho phép phát triển, thử nghiệm và bảo trì functions mà không cần phụ thuộc bắt buộc vào ứng dụng.
Thiết kế của Redis Functions không phụ thuộc vào động cơ (engine-agnostic). Mặc dù Redis 7.0 chỉ hỗ trợ functions viết bằng Lua 5.1, việc triển khai nội bộ gần như sẵn sàng để kết nối với các động cơ thực thi khác. Chúng tôi dự định thêm hỗ trợ cho nhiều loại động cơ thực thi hơn trong tương lai.
Một sự chuyển đổi mô hình khác mà functions mang lại là việc sử dụng thư viện (libraries). Thư viện có thể bao gồm một hoặc nhiều functions đã đăng ký và bất kỳ functions nội bộ bổ sung nào. Các functions đã đăng ký là các điểm vào của thư viện và API hợp đồng của ứng dụng. Mặt khác, các functions nội bộ có thể được gọi gốc bên trong thư viện để tái sử dụng mã.
Chúng tôi kỳ vọng việc giới thiệu functions trong Redis 7.0 là một bước lớn trong hướng đưa khả năng lập trình của Redis lên giai đoạn tiếp theo. Nếu bạn đã sử dụng kịch bản Lua trong ứng dụng của mình, việc di chuyển sang sử dụng functions là tùy chọn và đơn giản (xem Redis Functions để biết thêm). Còn tốt hơn là, khi tiến về phía trước, functions cung cấp một nền tảng tốt hơn để cải tiến và đổi mới với khả năng lập trình Redis.