0

[Series ioredis - Bài 1] Giới thiệu và Cẩm nang "Nhập Môn" ioredis cho Node.js

Chào các bạn! Trong thế giới phát triển Backend với Node.js, khi nhắc đến caching, pub/sub hay quản lý session, Redis gần như là cái tên đầu tiên nảy ra trong đầu chúng ta. Tuy nhiên, để giao tiếp với Redis từ Node.js, chúng ta cần một thư viện client (client library).

Có hai "ông lớn" trong mảng này là redis (hay còn gọi là node-redis) và ioredis. Trong series này, chúng ta sẽ đi sâu vào ioredis – một client cực kỳ mạnh mẽ, hiệu năng cao và đặc biệt tỏa sáng khi bạn làm việc với các kiến trúc hệ thống phức tạp như Redis Cluster hay Sentinel.

Hôm nay, ở Bài 1, chúng ta sẽ cùng tìm hiểu lý do tại sao nên chọn ioredis và cách thiết lập những kết nối đầu tiên nhé!

1. Tại sao lại chọn ioredis?

Nếu bạn đang băn khoăn tại sao không dùng thư viện redis mặc định mà lại là ioredis, thì đây là những "vũ khí" ăn tiền của nó:

  • Hỗ trợ Promises từ trong trứng nước: Không cần dùng util.promisify lằng nhằng, mọi hàm trong ioredis đều trả về Promise, giúp code async/await cực kỳ sạch sẽ.
  • Hỗ trợ chuẩn Redis Cluster & Sentinel: Đây là điểm sáng giá nhất. Nếu hệ thống của bạn scale lớn và cần high availability (tính sẵn sàng cao), ioredis xử lý việc kết nối và tự động phát hiện failover (chuyển đổi dự phòng) rất mượt mà.
  • Pipeline & Transaction: Xử lý hàng loạt lệnh (batching) tối ưu hiệu năng mạng.
  • Tự động kết nối lại (Auto-reconnect): Có cơ chế tự động thử kết nối lại với các chiến lược backoff (trì hoãn) có thể tùy chỉnh.

2. Khởi tạo dự án và Cài đặt

Đầu tiên, hãy chắc chắn rằng bạn đã cài đặt sẵn Node.js và một Redis server đang chạy (có thể dùng Docker để dựng nhanh Redis).

Khởi tạo project và cài đặt ioredis:

mkdir ioredis-series
cd ioredis-series
npm init -y
npm install ioredis

3. Kết nối với Redis

Hãy tạo một file index.js. Việc kết nối với Redis qua ioredis vô cùng đơn giản.

const Redis = require("ioredis");

// Cách 1: Kết nối với cấu hình mặc định (localhost:6379)
const redis = new Redis(); 

// Cách 2: Truyền vào một chuỗi URI (rất phổ biến khi dùng biến môi trường)
// const redis = new Redis("redis://:authpassword@127.0.0.1:6379/0");

// Cách 3: Kết nối với config object chi tiết
/*
const redis = new Redis({
  port: 6379,
  host: "127.0.0.1",
  username: "default", 
  password: "my-secret-password",
  db: 0, // Mặc định là DB số 0
});
*/

// Lắng nghe các sự kiện (Events) của Redis
redis.on("connect", () => {
  console.log("✅ Đã kết nối tới Redis thành công!");
});

redis.on("error", (err) => {
  console.error("❌ Lỗi kết nối Redis:", err);
});

Best Practice: Luôn luôn lắng nghe sự kiện error. Nếu không, khi Redis sập, ứng dụng Node.js của bạn có thể bị crash do unhandled exception.

4. Thao tác CRUD cơ bản nhất (String)

Redis là một kho lưu trữ Key-Value. Hãy thử thực hiện các thao tác thêm, sửa, đọc, xóa (Set/Get/Del) cơ bản nhất.

async function runBasicCommands() {
  try {
    // 1. Lưu dữ liệu (SET)
    // Lưu key "user:1:name" với giá trị "Hieu"
    await redis.set("user:1:name", "Hieu");
    console.log("Đã lưu thông tin user.");

    // 2. Lưu dữ liệu có thời hạn (SETEX - Set with Expiration)
    // Rất hữu ích cho Caching hoặc Session (lưu trong 60 giây)
    await redis.setex("session:token:abc123", 60, "active");
    console.log("Đã lưu session với thời gian sống 60 giây.");

    // 3. Lấy dữ liệu (GET)
    const name = await redis.get("user:1:name");
    console.log("Tên user là:", name);

    // 4. Xóa dữ liệu (DEL)
    await redis.del("user:1:name");
    
    // Kiểm tra lại sau khi xóa
    const deletedName = await redis.get("user:1:name");
    console.log("Sau khi xóa, data là:", deletedName); // Sẽ trả về null

  } catch (error) {
    console.error("Có lỗi xảy ra:", error);
  } finally {
    // Đóng kết nối một cách an toàn (Graceful shutdown)
    redis.quit();
  }
}

runBasicCommands();

Tổng kết Bài 1

Vậy là chúng ta đã hoàn thành bước chạy đà! Các bạn đã hiểu được ưu điểm của ioredis so với các thư viện khác, biết cách thiết lập kết nối, xử lý sự kiện lỗi và thao tác với những kiểu dữ liệu cơ bản nhất.

Trong thực tế hệ thống Backend, chúng ta không chỉ lưu text đơn giản. Ở Bài 2, chúng ta sẽ đi sâu vào việc lưu trữ các object phức tạp (như thông tin cấu hình, profile người dùng) bằng cách kết hợp JSON, Hash (HSET, HGET) và cách sử dụng Pipeline để tối ưu hóa hiệu năng khi phải query hàng nghìn key cùng lúc.

Hẹn gặp lại các bạn ở bài tiếp theo! Đừng quên để lại comment nếu bạn gặp khó khăn trong quá trình setup nhé.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí