Redis là một kho lưu trữ key-value hiệu suất cao, mã nguồn mở, hỗ trợ nhiều cấu trúc dữ liệu khác nhau. Bài viết này sẽ giúp bạn hiểu rõ hơn về Redis, từ những khái niệm cơ bản đến các tính năng nâng cao như replication, persistence và sharding.
Redis - Máy chủ từ điển từ xa
REDIS - Remote Dictionary Server (Máy chủ Từ điển Từ xa) là một kho lưu trữ key-value mã nguồn mở, tiên tiến. Nó hỗ trợ nhiều cấu trúc dữ liệu khác nhau như chuỗi, hash, danh sách, tập hợp và tập hợp đã sắp xếp. Redis được biết đến với hiệu suất cao, tính linh hoạt và dễ sử dụng, khiến nó trở thành lựa chọn phổ biến cho các nhà phát triển.
Tại sao chúng ta lại cần Redis?
Tại sao chúng ta cần Redis? Ví dụ, trong các ứng dụng như LinkedIn, Facebook hoặc Instagram, việc tải một lượng lớn dữ liệu (chẳng hạn như ảnh đại diện, tên, người theo dõi và bài đăng) từ cơ sở dữ liệu có thể chậm, đặc biệt nếu người dùng thường xuyên làm mới trang. Redis hỗ trợ bằng cách lưu trữ dữ liệu sau lần tải đầu tiên, vì vậy các yêu cầu tiếp theo sẽ nhanh chóng tìm nạp dữ liệu đã lưu, cải thiện trải nghiệm người dùng.
Vậy rốt cuộc Redis là gì?
Redis là một kho lưu trữ cấu trúc dữ liệu trong bộ nhớ được sử dụng làm cơ sở dữ liệu, bộ nhớ đệm và trình môi giới tin nhắn.
Redis rất tốt cho việc xây dựng các ứng dụng web có hiệu suất cao và khả năng mở rộng. Khi nói "mọi thứ đều trong bộ nhớ" với Redis, điều đó có nghĩa là tất cả dữ liệu được lưu trữ trong RAM (Random Access Memory) của máy tính thay vì trên ổ cứng.
Điều này làm cho việc truy cập dữ liệu cực kỳ nhanh chóng vì RAM đọc và ghi nhanh hơn nhiều so với ổ cứng. Redis thường được gọi là máy chủ cấu trúc dữ liệu, vì các khóa có thể chứa chuỗi, hash, danh sách, tập hợp và tập hợp đã sắp xếp. Redis được viết bằng ngôn ngữ C.
Các kiểu dữ liệu trong Redis
- Strings (chuỗi): Kiểu đơn giản nhất, lưu trữ văn bản hoặc dữ liệu nhị phân. Hãy coi nó giống như một phần thông tin duy nhất, chẳng hạn như tên hoặc số.
- Lists (danh sách): Tập hợp các chuỗi được sắp xếp theo thứ tự. Hãy tưởng tượng một danh sách việc cần làm, nơi bạn có thể thêm, xóa và truy cập các mục theo vị trí của chúng.
- Sets (tập hợp): Tập hợp các chuỗi duy nhất không theo thứ tự. Hữu ích để lưu trữ các mục không cho phép trùng lặp, giống như danh sách các thẻ duy nhất.
- Sorted Sets (tập hợp đã sắp xếp): Tương tự như tập hợp nhưng có điểm được gán cho mỗi mục, cho phép chúng được sắp xếp. Tuyệt vời cho bảng xếp hạng, nơi bạn cần xếp hạng các mục.
- Hashes (bảng băm): Ánh xạ các trường và giá trị, giống như một từ điển. Hoàn hảo để lưu trữ các đối tượng có nhiều thuộc tính, chẳng hạn như hồ sơ người dùng.
- Bitmaps (bản đồ bit): Chuỗi có thể được coi là mảng bit, hữu ích để theo dõi các trạng thái nhị phân, như hoạt động của người dùng.
- HyperLogLogs: Cấu trúc dữ liệu xác suất để đếm các mục duy nhất với mức sử dụng bộ nhớ tối thiểu. Tiện dụng cho phân tích quy mô lớn.
- Streams (luồng): Cấu trúc dữ liệu giống như nhật ký để lưu trữ chuỗi tin nhắn, hữu ích để xử lý dữ liệu theo thời gian thực.
Redis Replication và Pub/Sub
1. Redis Replication
Redis có thể tạo bản sao dữ liệu của nó trên nhiều máy chủ Redis khác, được gọi là "slave". Quá trình này được gọi là replication. Máy chủ chính, được gọi là "master", gửi các bản cập nhật đến tất cả các slave của nó. Bằng cách này, nếu máy chủ master gặp sự cố, một trong các slave có thể tiếp quản, đảm bảo dữ liệu của bạn luôn sẵn có và an toàn.
2. Pub/Sub
Nó giống như một hệ thống nhắn tin, trong đó người gửi (publisher) gửi tin nhắn trong khi người nhận (subscriber) nhận chúng thông qua kênh. Một client có thể đăng ký bất kỳ số lượng kênh nào.
Bảo mật Redis
Redis có thể được bảo mật để bất kỳ client nào kết nối cần phải xác thực trước khi thực hiện các lệnh. Để bảo mật Redis, bạn cần đặt mật khẩu trong tệp cấu hình. Sau khi đặt mật khẩu, nếu client cố gắng chạy lệnh mà không xác thực, họ sẽ nhận được lỗi (error) NOAUTH Authentication required. Do đó, client phải sử dụng lệnh AUTH để xác thực.
Redis Persistence
Persistence đề cập đến khả năng lưu dữ liệu vào đĩa để có thể khôi phục sau khi khởi động lại hoặc gặp sự cố. Điều này đảm bảo rằng dữ liệu của bạn không bị mất và có thể được khôi phục về trạng thái trước đó. Có 2 phương pháp chính để duy trì tính bền vững: RDB và AOF.
1. RDB (Sao lưu Cơ sở dữ liệu Redis)
Tạo ảnh chụp nhanh của toàn bộ tập dữ liệu theo các khoảng thời gian được định cấu hình. Lưu ảnh chụp nhanh vào đĩa dưới dạng tệp nhị phân. Hiệu quả và nhanh chóng để tải. Tác động tối thiểu đến hiệu suất trong quá trình tạo ảnh chụp nhanh.
Ví dụ: Một trang web thương mại điện tử sử dụng RDB để chụp ảnh nhanh các phiên người dùng và giỏ hàng cứ sau 15 phút để khôi phục nhanh chóng.
Nhược điểm: Nguy cơ mất dữ liệu giữa các ảnh chụp nhanh. Không phù hợp cho các ứng dụng yêu cầu độ bền cao.
2. AOF (Tệp chỉ thêm)
Ghi lại mọi hoạt động ghi được máy chủ nhận. Định kỳ ghi lại tệp AOF để giữ cho nó gọn nhẹ. Độ bền cao hơn với ít rủi ro mất dữ liệu.
Ví dụ: Một hệ thống giao dịch tài chính sử dụng AOF để ghi lại mọi giao dịch ngay lập tức, đảm bảo độ bền cao và giảm thiểu mất dữ liệu.
Nhược điểm: Kích thước tệp lớn hơn so với RDB. Hiệu suất chậm hơn do ghi lại mọi hoạt động. Redis cho phép bạn sử dụng cả RDB và AOF cùng nhau để kết hợp các lợi ích của cả hai phương pháp, mang lại sự cân bằng giữa hiệu suất và an toàn dữ liệu.
Redis Sharding
Redis Sharding là một cách để phân chia dữ liệu của bạn trên nhiều máy chủ Redis để xử lý nhiều dữ liệu và lưu lượng truy cập hiệu quả hơn. Hãy tưởng tượng bạn có một thư viện với hàng nghìn cuốn sách. Nếu tất cả sách được lưu trữ trong một phòng, nó có thể trở nên chật chội và chậm để tìm một cuốn sách.
Để giải quyết vấn đề này, bạn có thể chia sách thành các phòng khác nhau dựa trên thể loại của chúng. Bây giờ, mỗi phòng có ít sách hơn, giúp bạn tìm thấy thứ mình cần nhanh hơn. Trong Redis, sharding hoạt động tương tự. Thay vì lưu trữ tất cả dữ liệu trên một máy chủ, bạn chia nó trên nhiều máy chủ (shard). Mỗi shard xử lý một phần dữ liệu, giúp hệ thống nhanh hơn và có khả năng mở rộng hơn.
Những hạn chế của Redis
- Sử dụng bộ nhớ: Redis lưu trữ tất cả dữ liệu trong RAM, điều này có thể tốn kém đối với các tập dữ liệu lớn.
- Đơn luồng: Redis chạy trên một luồng duy nhất, điều này có thể hạn chế hiệu suất đối với các tác vụ sử dụng nhiều CPU.
- Bảo mật cơ bản: Redis có các tính năng bảo mật tích hợp hạn chế, điều này có thể không đủ cho dữ liệu nhạy cảm.
- Không có truy vấn phức tạp: Redis không hỗ trợ các truy vấn phức tạp như cơ sở dữ liệu SQL.
- Rủi ro mất dữ liệu: Vì Redis chủ yếu nằm trong bộ nhớ, nên có nguy cơ mất dữ liệu nếu máy chủ gặp sự cố trước khi dữ liệu được lưu vào đĩa.
Cảm ơn các bạn đã theo dõi!