- Redis lưu trữ dữ liệu trong bộ nhớ bằng các cấu trúc tiên tiến và hoạt động nguyên tử.
- Hỗ trợ tính bền bỉ (RDB/AOF), sao chép không đồng bộ và các công cụ như Pub/Sub và Lua.
- Lý tưởng cho việc lưu trữ đệm, phiên, nhắn tin và xếp hạng với độ trễ rất thấp.
Nếu bạn từng cần ứng dụng của mình chạy nhanh như tên lửa, có lẽ bạn đã nghe nói về Redis. Công nghệ này hoạt động như một hệ thống dữ liệu trong bộ nhớ, cung cấp độ trễ rất thấp và phản hồi gần như tức thời, lý tưởng khi tốc độ là ưu tiên hàng đầu.
Không chỉ đơn thuần là bộ nhớ đệm, Redis là một cơ sở dữ liệu NoSQL dựa trên cặp khóa-giá trị với nhiều cấu trúc dữ liệu và các công cụ tích hợp. Được ra mắt lần đầu vào năm 2009 và viết bằng ngôn ngữ C, tên gọi của nó xuất phát từ Remote Dictionary Server (Máy chủ từ điển từ xa). Ngày nay, nó sở hữu một hệ sinh thái rất năng động, các client cho hầu hết mọi ngôn ngữ lập trình, cùng khả năng lưu trữ và sao chép dữ liệu mạnh mẽ.
Redis là gì và nó được sử dụng để làm gì?
Redis là một công cụ lưu trữ trong bộ nhớ hoạt động với các cặp khóa-giá trị và các cấu trúc nâng cao. Bằng cách hoạt động trong RAM, nó giảm thiểu các điểm nghẽn thường gặp khi truy cập ổ đĩa , khiến nó trở nên hoàn hảo cho các trường hợp sử dụng cần tốc độ cực cao: bộ nhớ đệm cho các truy vấn nặng, phiên người dùng, nhắn tin thời gian thực, trò chơi trực tuyến, bảng điều khiển với dữ liệu truyền phát và hơn thế nữa.
Trong nhiều dự án, nó được sử dụng như một lớp bộ nhớ đệm phía trước các cơ sở dữ liệu truyền thống , lưu trữ các kết quả lặp lại để tránh việc tính toán lại hoặc truy vấn liên tục. Nó cũng được sử dụng như một cơ sở dữ liệu độc lập khi tính bền vững nghiêm ngặt không phải là yêu cầu bắt buộc hoặc khi tính bền vững của nó được cấu hình để đảm bảo dữ liệu được lưu trữ trên đĩa.
Kiến trúc máy chủ/máy khách, giao diện mạng và thiết kế gọn nhẹ giúp dễ dàng triển khai và kết nối từ nhiều máy chủ. Hơn nữa, nó cung cấp khả năng sao chép không đồng bộ từ máy chủ chính sang máy chủ sao chép (máy chủ chính tiếp tục hoạt động trong khi sao chép), giúp mở rộng quy mô đọc và cải thiện tính khả dụng.
Các tính năng chính
Ưu điểm lớn nhất của Redis là mọi thứ đều nằm trong bộ nhớ chính. Điều này loại bỏ việc truy cập đĩa trong luồng xử lý quan trọng và cung cấp các thao tác đọc/ghi cực nhanh . Hơn nữa, mỗi chuỗi có thể đạt tới 512 MB, hỗ trợ dữ liệu nhị phân và bao gồm các cấu trúc như danh sách, tập hợp, tập hợp được sắp xếp, hàm băm, HyperLogLog, bitmap và luồng dữ liệu.
Redis triển khai các thao tác nguyên tử cấp cao phía máy chủ trên các cấu trúc này. Điều này cho phép bạn thực hiện phép hợp, phép giao hoặc phép hiệu trên các tập hợp, sửa đổi chuỗi con, hoặc tăng và giảm số nguyên và số thực mà không gặp phải tình trạng tranh chấp.
Nó bao gồm các công cụ giúp tăng tốc quá trình phát triển và đơn giản hóa các mô hình phổ biến: Pub/Sub để xuất bản và đăng ký kênh (lý tưởng cho nhắn tin và thông báo thời gian thực), khóa có TTL để tự động hết hạn, bộ đếm nguyên tử cho số liệu và kiểm soát đồng thời, và hỗ trợ nhúng cho các tập lệnh Lua cho logic phía máy chủ từ phiên bản 2.6.
Một ưu điểm mạnh mẽ khác là khả năng tương thích với các module. Các module của Redis mở rộng các khả năng như tài liệu JSON , chuỗi thời gian và tìm kiếm , biến nó thành một hệ thống đa năng vượt xa việc chỉ đơn thuần ghép cặp khóa-giá trị.

Lịch sử, giấy phép và sự phát triển
Redis được Salvatore Sanfilippo tạo ra vào năm 2009 để cải thiện độ trễ của một sản phẩm có tên là LLOGG. Thành công đến ngay lập tức, và vào năm 2010, VMware đã thuê Sanfilippo để lãnh đạo dự án toàn thời gian ; Pieter Noordhuis gia nhập không lâu sau đó. Từ năm 2013 đến năm 2015, dự án được Pivotal tài trợ, và sau đó là Redis Labs.
Từ phiên bản 2.6, máy chủ đã tích hợp trình thông dịch Lua, cho phép thực thi các tập lệnh trực tiếp trong Redis với tính nguyên tử và giảm thiểu độ trễ khứ hồi giữa máy khách và máy chủ. Về vấn đề cấp phép, nó được phân phối theo mô hình kép RSALv2 và SSPLv1.
Mô hình dữ liệu và hoạt động
Redis sử dụng một từ điển toàn cục ánh xạ các khóa đến các giá trị. Không giống như các giải pháp khóa-giá trị đơn giản hơn, các giá trị có thể có nhiều kiểu dữ liệu khác nhau. Kiểu dữ liệu này xác định các lệnh khả dụng và các thao tác nguyên tử bạn có thể thực hiện trên dữ liệu đó.
Kiểu dữ liệu String trong Redis là "an toàn nhị phân": nó có thể chứa văn bản, số nguyên, số thực hoặc dữ liệu nhị phân thô như ảnh JPEG hoặc đối tượng được tuần tự hóa. Bạn có thể thao tác trên các phần của chuỗi, sửa đổi các bit cụ thể hoặc sử dụng nó như một bộ đếm với các phép tăng/giảm.
Danh sách cho phép bạn quản lý hàng đợi hoặc ngăn xếp, tập hợp và tập hợp có thứ tự được sử dụng cho việc quản lý thành viên và xếp hạng theo điểm số, còn bảng băm lưu trữ các ánh xạ trường-giá trị, rất hữu ích để nhóm các thuộc tính của một đối tượng . HyperLogLog được sử dụng cho bộ đếm số lượng gần đúng với rất ít bộ nhớ, và luồng tạo điều kiện thuận lợi cho luồng sự kiện với việc tiêu thụ theo nhóm.
Hơn nữa, Redis cung cấp các giao dịch (MULTI/EXEC), cho phép bạn nhóm nhiều thao tác để thực thi tuần tự và đồng bộ . Kết hợp với Lua, bạn có thể đóng gói logic phức tạp phía máy chủ một cách đáng tin cậy.
Tính bền bỉ: ảnh chụp nhanh và AOF
Redis có thể hoạt động hoàn toàn trong bộ nhớ, nhưng nó cũng hỗ trợ lưu trữ trên đĩa để cân bằng giữa hiệu suất và độ bền. Với tính năng chụp nhanh (RDB), nó chụp nhanh định kỳ tập dữ liệu và lưu chúng bất đồng bộ, giúp giảm thiểu tác động đến thời gian phản hồi.
Một lựa chọn khác là AOF (ghi nhật ký), ghi lại mọi thao tác ghi vào tệp. Chế độ này cung cấp độ bền tốt hơn và có thể cấu hình nhiều hơn: `appendfsync=always` buộc đồng bộ hóa trên mọi thay đổi (bảo mật tối đa, hiệu suất thấp hơn), và `appendfsync=everysec` đồng bộ hóa mỗi giây (cân bằng tốt).
Nếu cần, bạn cũng có thể kích hoạt thao tác LƯU thủ công để buộc tạo ảnh chụp nhanh ngay lập tức. Trong trường hợp máy chủ bị lỗi hoàn toàn, bạn thường sẽ chỉ mất một lượng dữ liệu nhỏ, tùy thuộc vào chính sách đồng bộ hóa đã chọn.
Trong các phiên bản cũ hơn, việc sử dụng "bộ nhớ ảo" được cho phép từ phiên bản 2.4 trở lên, nhưng phương pháp đó hiện đã lỗi thời. Ngày nay, người ta khuyến nghị nên lựa chọn giữa RDB, AOF, hoặc kết hợp cả hai , điều chỉnh cấu hình theo mức độ quan trọng của dữ liệu và hiệu năng mong muốn.
Sao chép và tính khả dụng cao
Redis triển khai cơ chế sao chép không đồng bộ giữa máy chủ chính và máy chủ sao chép. Điều này có nghĩa là các thao tác ghi được chấp nhận trên máy chủ chính và các máy chủ sao chép được đồng bộ hóa mà không làm tắc nghẽn máy chủ chính, giữ cho dịch vụ hoạt động trong suốt quá trình đồng bộ hóa . Một máy chủ chính có thể có nhiều máy chủ sao chép, và đến lượt một máy chủ sao chép có thể được liên kết làm máy chủ chính của một máy chủ sao chép khác, tạo thành cấu trúc cây.
Sao chép dữ liệu rất hữu ích để mở rộng quy mô các thao tác đọc và đảm bảo tính dự phòng. Một số cấu hình cho phép ghi vào các bản sao, mặc dù điều này có thể dẫn đến sự không nhất quán nếu không được kiểm soát đúng cách; theo mặc định, các bản sao thường được sử dụng ở chế độ chỉ đọc để duy trì tính nhất quán.
Việc đặt các bản sao gần người dùng giúp giảm độ trễ cảm nhận. Với các công cụ điều phối và giám sát/cụm máy chủ, tính khả dụng cao và khả năng tự động chuyển đổi dự phòng có thể đạt được để giảm thiểu thời gian ngừng hoạt động trong trường hợp máy chủ chính gặp sự cố.
Kiến trúc và hệ sinh thái máy khách/máy chủ
Máy chủ Redis cung cấp một giao thức đơn giản mà các máy khách thuộc nhiều ngôn ngữ khác nhau có thể kết nối. Bạn có thể tương tác với giao diện dòng lệnh chính thức của nó (redis-cli) để kiểm thử, quản trị hoặc viết kịch bản nhanh, hoặc tích hợp thư viện vào ứng dụng của mình.
Có các client dành cho ActionScript, C, C++, C#, Java, Go, Python, PHP, Ruby, Scala, JavaScript (bao gồm cả Node.js phía máy chủ), R, Erlang, Haskell, Lua, Objective-C, Perl, Common Lisp, Smalltalk, Tcl, Io, haXe, Pure Data, và nhiều hơn nữa. Sự hỗ trợ rộng rãi này giúp dễ dàng áp dụng trên hầu hết mọi nền tảng công nghệ.
Các trường hợp sử dụng thực tế và ví dụ thực tế
Một ví dụ rất phổ biến là các trang web môi giới bất động sản trực tuyến: thông tin về một bất động sản với giá cả, tiện nghi và số phòng hầu như không thay đổi. Nếu không có bộ nhớ đệm, mỗi lần truy cập đều yêu cầu thực hiện nhiều truy vấn và tính toán lặp đi lặp lại. Với Redis, sau lần tải đầu tiên, đối tượng được lưu lại với một khóa (ví dụ: property_4056 ) và thời gian tồn tại (TTL) là một tháng. Các lần truy cập sau đó sẽ đọc dữ liệu từ bộ nhớ và tránh phải truy cập vào cơ sở dữ liệu.
Ngoài ra, người ta cũng thường sử dụng nó để lưu trữ kết quả báo cáo dung lượng lớn , quản lý các phiên xác thực, xây dựng bảng xếp hạng trực tiếp với các tập dữ liệu được sắp xếp hoặc sử dụng Pub/Sub như một kênh nhắn tin nhẹ giữa các dịch vụ.
Trong một thử nghiệm sử dụng bảng lỗi 16.000 hàng, thời gian được đo cho: 1) truy vấn cơ sở dữ liệu, 2) lưu tập hợp dữ liệu vào Redis, và 3) đọc dữ liệu từ Redis. Kết quả rất ấn tượng: việc truy xuất từ Redis nhanh hơn 26 lần so với truy xuất từ cơ sở dữ liệu. Những so sánh này thường làm nổi bật tác động thực sự đến trải nghiệm người dùng và chi phí cơ sở hạ tầng.
Redis so với Memcached
Cả hai công nghệ đều được sử dụng cho bộ nhớ đệm trong bộ nhớ, nhưng có những điểm khác biệt đáng chú ý. Redis cung cấp nhiều kiểu dữ liệu (danh sách, tập hợp, băm, v.v.), tùy chọn lưu trữ trên đĩa , Pub/Sub, tập lệnh Lua, giao dịch và các mô-đun để mở rộng khả năng của nó. Mặt khác, Memcached tập trung vào mô hình cặp khóa-giá trị đơn giản trong bộ nhớ mà không có khả năng lưu trữ lâu dài.
Xét về hiệu năng thô, cả hai đều rất nhanh; Redis thường vượt trội trong các trường hợp có cấu trúc phức tạp và các thao tác phía máy chủ mang tính nguyên tử. Nếu bạn chỉ cần một bộ nhớ đệm rất đơn giản và siêu nhẹ, Memcached có thể đáp ứng được , nhưng khi bạn cần nhiều chức năng và tính linh hoạt hơn, Redis thường chiếm ưu thế.
Dịch vụ được quản lý so với dịch vụ tự quản lý (Redis và Valkey)
Bạn có thể tự triển khai Redis hoặc Valkey hoặc chọn dịch vụ đám mây được quản lý. Tự quản lý cho phép bạn kiểm soát hoàn toàn, nhưng khả năng mở rộng và bảo trì là trách nhiệm của bạn (thêm node, cập nhật, bảo mật, sao lưu, giám sát).
Dịch vụ quản lý giúp giảm bớt gánh nặng vận hành: dễ dàng mở rộng quy mô, tính khả dụng cao và cập nhật không gặp rắc rối. Điều này thường dẫn đến tổng chi phí sở hữu thấp hơn và cho phép nhóm tập trung hơn vào mô hình hóa dữ liệu và các chức năng kinh doanh, thay vì các tác vụ nền tảng.
Các công cụ tích hợp: Pub/Sub, TTL, bộ đếm và Lua
Với mô hình Pub/Sub, bạn có thể phát tin nhắn trong các kênh và nhiều người đăng ký sẽ nhận được chúng ngay lập tức, điều này rất phù hợp cho các cuộc trò chuyện, thông báo và phối hợp giữa các microservice. Đó là một mô hình đơn giản và hiệu quả.
Khóa thời gian tồn tại (TTL) cho phép bạn "tự làm sạch" dữ liệu tạm thời: phiên, mã thông báo, kết quả truy vấn đã hết hạn, v.v. Điều này giúp ngăn chặn việc cơ sở dữ liệu bị lấp đầy bởi thông tin lỗi thời và đơn giản hóa logic hết hạn.
Bộ đếm nguyên tử rất tuyệt vời cho việc đo lường, giới hạn tốc độ, hàng đợi hoặc bất kỳ trường hợp nào bạn cần thêm/bớt một cách an toàn trong môi trường đồng thời.
Cuối cùng, khả năng hỗ trợ nhúng của Lua cho phép bạn chạy các tập lệnh gần với dữ liệu một cách nguyên tử. Điều này giảm thiểu việc truyền dữ liệu qua mạng và cho phép bạn thực hiện các thao tác phức tạp chỉ trong một bước duy nhất , cải thiện tính nhất quán và hiệu suất.
Câu hỏi thường gặp
Redis được dùng để làm gì? Để tăng tốc các ứng dụng với bộ nhớ đệm trong bộ nhớ, phiên làm việc, xếp hạng thời gian thực, hệ thống nhắn tin nhẹ với Pub/Sub, và như một cơ sở dữ liệu NoSQL khi độ trễ là yếu tố quan trọng hoặc cần cấu hình tính năng lưu trữ lâu dài.
Tại sao Redis lại nhanh đến vậy? Bởi vì dữ liệu được lưu trữ trong RAM, loại bỏ việc truy cập ổ đĩa trên luồng xử lý quan trọng và cung cấp các thao tác phía máy chủ mang tính nguyên tử; hơn nữa, giao thức của nó nhẹ và hiệu quả.
Nó có thể được sử dụng như một cơ sở dữ liệu không? Có. Nó là một cơ sở dữ liệu NoSQL trong bộ nhớ với các tùy chọn lưu trữ lâu dài (RDB và AOF). Tùy thuộc vào cấu hình của bạn, bạn có thể ưu tiên hiệu suất hoặc độ bền , hoặc kết hợp cả hai.
Hỗ trợ ngôn ngữ
Hiện có các client hoàn thiện cho hầu hết mọi ngôn ngữ lập trình: Python (redis-py), Java (Jedis), Node.js (ioredis), C#/.NET (StackExchange.Redis), PHP (phpredis), Go (go-redis), Ruby (redis-rb), và nhiều ngôn ngữ khác nữa. Sự đa dạng này đảm bảo tích hợp liền mạch với hệ thống hiện có của bạn.
Redis đã khẳng định vị thế là "con át chủ bài" trong việc giải quyết các vấn đề về hiệu năng và thời gian thực trong hầu hết các kiến trúc hiện đại: nó kết hợp tốc độ cực nhanh, cấu trúc dữ liệu phong phú, khả năng lưu trữ có thể cấu hình, sao chép dữ liệu và một bộ công cụ thiết thực, khi được sử dụng tốt, sẽ tạo ra sự khác biệt trong trải nghiệm người dùng.