Redis là gì và ứng dụng thực tế

Redis là gì? – Redis (REmote DIctionary Server) là một mã nguồn mở được dùng để lưu trữ dữ liệu có cấu trúc, có thể sử dụng như một database, bộ nhớ cache hay một message broker.

Dự án này ban đầu được đề xuất bởi một developer nhằm cải thiện khả năng mở rộng doanh nghiệp của mình. Hiện nay Redis có thể được sử dụng như một database, cache, message broker hay queue.

Redis có khả năng phản hồi chỉ trong vài mili giây, cho phép xử lý hàng triệu request mỗi giây, phù hợp với các ứng dụng trong thời gian thực như gaming, dịch vụ tài chính, IoT,… Vậy chúng ta sẽ đi vào cụ thể hơn nhé.

Redis hoạt động như thế nào

Redis sẽ chạy chương trình độc lập của nó như cách mà các RDBMS hoạt động và dữ liệu của Redis sẽ được lưu hoàn toàn ở memory của server (cụ thể là RAM). Đó là lý do mà Redis có tốc độ truy xuất dữ liệu rất nhanh so với RDBMS (chỉ truy xuất từ ổ cứng lên khi cần, mặc dù có cache). Do sử dụng memory làm nơi hoạt động chính, nên chi phí server có thể cao hơn vì RAM luôn mắc hơn và bộ nhớ ít hơn so với ổ cứng mà. 😉

Các kiểu dữ liệu trong Redis

Khác với RDBMS như MySQL, PostgreSQL, SQL Server, … thì Redis không có table (bảng). Redis lưu trữ dữ liệu dưới dạng key-value. Dưới đây mình sẽ liệt kê một vài kiểu dữ liệu Redis thường dùng nhất để lưu value nhé.

  • String: String là cấu trúc dữ liệu nhị phân, đồng thời là một trong những block linh hoạt nhất của Redis. Cấu trúc này có thể lưu trữ bất kỳ loại dữ liệu nào: Chuỗi, số nguyên, số thập phân, ảnh JPEG, đối tượng Ruby, … Redis có thể làm việc cùng string, từng phần của nó, cũng như giúp tăng/giảm giá trị của float, integer.
  • Hash: lưu trữ hash table của các cặp key-value, trong đó key được sắp xếp ngẫu nhiên, không theo thứ tự nào cả. Redis hỗ trợ các thao tác thêm, đọc, xóa từng phần tử, cũng như đọc tất cả giá trị.
  • Sorted Set: chứa một danh sách các member, có tính duy nhất và được sắp xếp theo điểm số (ở dạng số thập phân). Bên cạnh đó, người dùng cũng có thể truy vấn tập hợp dựa trên điểm số hay giá trị của member, lọc, tổng hợp, sắp xếp kết quả, … Ngoài ra còn có Set có tính năng tương tự nhưng có được sắp xếp.
  • List: trong Redis chứa tập hợp các phần tử chuỗi được sắp xếp theo thứ tự chèn của chúng. Người dùng có thể thực hiện các thao tác cơ bản với list như: Push, pop, trim, tìm vào xoá item dựa theo giá trị hoặc vị trí.

Ngoài ra, Redis còn hỗ trợ các data types khác như: Bitmaps, Bitfields, HyperLogLog, Stream… Xem thêm thông tin tại đây nhé.

Persistent Redis

Đây là tính năng giúp lưu trữ dữ liệu Redis lên ổ cứng trong trường hợp server bị tắt đột ngột hoặc restart định kỳ. Dưới đây là các tuỳ chọn:

  • RDB (Redis Database): Thực hiện các snapshot (ghi lại nhanh) của tập dữ liệu trong các khoảng thời gian nhất định.
  • AOF (Append Only File): Viết lại mọi thao tác ghi mà server nhận được, chạy mỗi khi server khởi động. Các lệnh được log theo định dạng giống như giao thức Redis theo kiểu append-only (chỉ thêm). Redis có khả năng viết lại log nếu background có kích thước quá lớn.
  • No persistence: Người dùng hoàn toàn có thể tắt tính năng này nếu chỉ cần dữ liệu tồn tại khi server đang chạy, không cần lưu lên ổ cứng cho lần chạy server tiếp theo.
  • RDB + AOF: Nếu kết hợp AOF và RBD, cần lưu ý rằng khi Redis restart thì file AOF sẽ được dùng để xây dựng lại tập dữ liệu ban đầu.
RDB (Redis DataBase file)AOF (Append Only File)
Ưu điểmRDB cho phép người dùng lưu các version khác nhau, rất thuận tiện khi có sự cố xảy ra.

Bằng việc lưu trữ data vào 1 file cố định, người dùng có thể dễ dàng chuyển data đến các data centers, máy chủ khác nhau.

Khi restart server, dùng RDB làm việc với lượng data lớn sẽ có tốc độ cao hơn là dùng AOF.
Sử dụng AOF sẽ giúp đảm bảo dataset được bền vững hơn so với dùng RDB. Người dùng có thể cấu hình để Redis ghi log theo từng câu query hoặc mỗi giây 1 lần.

Redis ghi log AOF theo kiểu thêm vào cuối file sẵn có, do đó tiến trình seek trên file có sẵn là không cần thiết. Ngoài ra, kể cả khi chỉ 1 nửa câu lệnh được ghi trong file log (có thể do ổ đĩa bị full), Redis vẫn có cơ chế quản lý và sửa chữa lỗi đó (redis-check-aof).

Redis cung cấp tiến trình chạy nền, cho phép ghi lại file AOF khi dung lượng file quá lớn.
Nhược điểmRDB không phải là lựa chọn tốt nếu bạn muốn giảm thiểu tối đa nguy cơ mất mát dữ liệu. Thông thường người dùng sẽ setup để tạo RDB snapshot 5 phút 1 lần (hoặc nhiều hơn). Do vậy, trong trường hợp có sự cố, Redis không thể hoạt động, dữ liệu trong những phút cuối sẽ bị mất.

RDB cần dùng fork() để tạo tiến trình con phục vụ cho thao tác disk I/O. Trong trường hợp dữ liệu quá lớn, quá trình fork() có thể tốn thời gian và server sẽ không thể đáp ứng được request từ client trong vài milisecond hoặc thậm chí là 1 second tùy thuộc vào lượng data và hiệu năng CPU.
File AOF thường lớn hơn file RDB với cùng 1 dataset. AOF có thể chậm hơn RDB tùy theo cách thức thiết lập khoảng thời gian cho việc sao lưu vào ổ cứng. Tuy nhiên, nếu thiết lập log 1 giây 1 lần có thể đạt hiệu năng tương đương với RDB.

Developer của Redis đã từng gặp phải bug với AOF (mặc dù là rất hiếm), đó là lỗi AOF không thể tái tạo lại chính xác dataset khi restart Redis. Lỗi này chưa gặp phải khi làm việc với RDB bao giờ.

Triển khai Redis và demo sử dụng

Hướng dẫn cài đặt cụ thể Redis trên OS bạn dùng tại đây: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/

Ở đây mình sẽ hướng dẫn sử dụng trên Windows, do Redis không có bản chính thức tại OS này nên chúng ta sẽ phải dùng WSL hoặc Docker để triển khai nó.

Để dùng WSL hoặc Docker, hãy chắc rằng máy bạn đủ mạnh tí để nó có thể chạy (máy phải hỗ trợ ảo hoá, RAM nên từ 8gb trở lên). Mình sẽ hướng dẫn trên Docker, link tải tại đây: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe

Sau khi cài đặt Docker thành công, mở chương trình lên và tại thanh tìm kiếm, chúng ta sẽ gõ từ khoá redis và bấm Pull để nó tải về:

Tiếp theo, qua mục Images bấm biểu tượng Run tại dòng redis để tạo một Container mới.

Trong mục Optional settings, dòng Container name bạn đặt tên cho nó, hoặc để trống để random tên. Dòng Host port bạn nhập 6379 để ứng với port Redis mặc định và bấm Run.

Sau khi chạy Container thành công, chúng ta sẽ có màn hình Log như thế này:

Tiếp theo chúng ta sẽ cài công cụ để kết nối vào server Redis. Ở đây mình sẽ dùng phần mềm của Redis có tên là Redis Insight. Link tải ở đây: https://s3.amazonaws.com/redisinsight.download/public/latest/Redis-Insight-win-installer.exe

Sau khi cài Redis Insight, chúng ta sẽ thêm Redis database vào phần mềm để lưu lại kết nối.

Chúng ta sẽ thử tạo key và làm vài thứ với nó. Có nhiều loại key cho bạn chọn, ở đây mình dùng String. TTL là thời gian hết hạn của key (tính bằng giây).

Bạn có thể tự mình khám phá thêm tính năng của Redis tại phần mềm Redis Insight. Còn về phần Docker để chạy server Redis, bạn có thể Run/Stop/Delete nó tại mục Containers, không cần tạo thêm Container như bước đầu (trừ khi bạn muốn thử chạy nhiều server Redis cùng lúc thì có thể tạo thêm tại mục Images bằng cách Run một cái mới).

Bài viết giới thiệu và hướng dẫn sử dụng nhanh Redis đến đây là hết, các bạn ủng hộ cho mình một bình luận để cải thiện thêm chất lượng nhé! Ở những bài viết sau mình sẽ hướng dẫn Redis trong ngôn ngữ lập trình. 😁

Content Protection by DMCA.com

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *