Cơ Bản Về Redis và Tích Hợp Với Node.js

Redis là một kho dữ liệu key-value trong bộ nhớ, mã nguồn mở, nổi tiếng với hiệu suất và tính linh hoạt. Redis hỗ trợ nhiều kiểu dữ liệu, phù hợp cho việc sử dụng bộ nhớ đệm, ứng dụng thời gian thực, hệ thống pub/sub, và nhiều hơn nữa.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu:

  • Các kiểu dữ liệu trong Redis
  • Các lệnh phổ biến của Redis
  • Cách tích hợp Redis vào dự án Node.js

📦 Các Kiểu Dữ Liệu & Lệnh Redis

Redis hỗ trợ nhiều cấu trúc dữ liệu khác nhau:

1. Chuỗi (Strings)

Chuỗi là kiểu dữ liệu cơ bản nhất trong Redis. Bạn có thể lưu trữ bất kỳ giá trị nào dưới dạng chuỗi, bao gồm cả số nguyên và JSON được tuần tự hóa.

SET name "Jay"
GET name
INCR counter

2. Danh sách (Lists)

Danh sách là các tập hợp có thứ tự của chuỗi. Bạn có thể thêm phần tử vào đầu hoặc cuối danh sách.

LPUSH mylist "apple"
RPUSH mylist "banana"
LRANGE mylist 0 -1

3. Tập hợp (Sets)

Tập hợp là các tập hợp không có thứ tự của các chuỗi duy nhất. Chúng hỗ trợ các phép toán như hợp, giao, và hiệu.

SADD myset "apple"
SADD myset "banana"
SADD myset "apple" # Trùng lặp, sẽ không được thêm
SMEMBERS myset

4. Băm (Hashes)

Băm là các bản đồ giữa trường chuỗi và giá trị chuỗi, rất lý tưởng để biểu diễn các đối tượng.

HSET user:1000 name "Jay" age 30
HGETALL user:1000

5. Tập hợp có thứ tự (Sorted Sets)

Tập hợp có thứ tự tương tự như tập hợp nhưng có một điểm số liên kết với mỗi phần tử, cho phép truy xuất theo thứ tự.

ZADD mysortedset 1 "apple"
ZADD mysortedset 2 "banana"
ZRANGE mysortedset 0 -1

6. Bitmaps, HyperLogLogs, Streams

Đây là các cấu trúc nâng cao hơn: Bitmaps được sử dụng cho các thao tác cấp bit, cho phép bạn thao tác các bit riêng lẻ trong một chuỗi.

SETBIT mybitmap 0 1
SETBIT mybitmap 1 1
BITCOUNT mybitmap

HyperLogLogs được sử dụng để ước tính số lượng phần tử duy nhất trong một tập hợp, rất hữu ích cho các trường hợp như theo dõi số lượng khách truy cập duy nhất.

PFADD myhll "apple" "banana" "orange"
PFCOUNT myhll

Streams được thiết kế cho các đường dẫn dữ liệu thời gian thực và nguồn sự kiện, cho phép bạn thêm và truy vấn dữ liệu theo chuỗi thời gian.

XADD mystream * name "Jay" age 30
XRANGE mystream - +

🔧 Tích Hợp Redis Với Node.js

Bạn có thể sử dụng thư viện ioredis hoặc redis client phổ biến. Dưới đây là một ví dụ với ioredis.

1. Cài Đặt Redis và ioredis

npm install ioredis
# hoặc
yarn add ioredis

Đảm bảo rằng bạn đã cài đặt và chạy Redis. Bạn có thể sử dụng Docker để chạy Redis một cách dễ dàng:

docker run -d -p 6379:6379 redis

2. Thiết Lập Cơ Bản

Tạo một tệp có tên redis.js và thêm đoạn mã sau:

// redis.ts
import Redis from 'ioredis';

const redis = new Redis({
  host: '127.0.0.1',
  port: 6379,
  // password: 'mật_khẩu_nếu_có'
});

export default redis;

3. Sử Dụng Redis Trong Ứng Dụng

Bây giờ bạn có thể sử dụng Redis trong ứng dụng của mình. Dưới đây là một ví dụ về việc thiết lập và lấy giá trị:

// example.ts
import redis from './redis';

// Chuỗi
await redis.set('greeting', 'Hello Redis');
const greeting = await redis.get('greeting');
console.log(greeting); // Hello Redis

// Danh sách
await redis.lpush('queue', 'task1');
const task = await redis.rpop('queue');
console.log(task); // task1

// Băm
await redis.hset('user:1', { name: 'Jay', role: 'admin' });
const user = await redis.hgetall('user:1');
console.log(user); // { name: 'Jay', role: 'admin' }

// Tập hợp có thứ tự
await redis.zadd('scores', 100, 'Jay');
const scores = await redis.zrange('scores', 0, -1, 'WITHSCORES');
console.log(scores);

// Pub/Sub
redis.subscribe('news');
redis.on('message', (channel, message) => {
  console.log(`Nhận tin nhắn từ ${channel}: ${message}`);
});

const publisher = new Redis();
publisher.publish('news', 'Tin nóng!');

4. Ví Dụ Về Bộ Nhớ Đệm

Bạn có thể sử dụng Redis làm bộ nhớ đệm để lưu trữ dữ liệu được truy cập thường xuyên. Dưới đây là một ví dụ về việc lưu trữ kết quả truy vấn cơ sở dữ liệu vào bộ nhớ đệm:

import redis from './redis';

async function getUserData(userId) {
  const cacheKey = `user:${userId}`;
  const cachedData = await redis.get(cacheKey);

  if (cachedData) {
    return JSON.parse(cachedData);
  }

  // Mô phỏng truy vấn cơ sở dữ liệu
  const userData = await queryDatabase(userId);
  await redis.set(cacheKey, JSON.stringify(userData), 'EX', 3600); // Lưu vào bộ nhớ đệm trong 1 giờ
  return userData;
}

async function queryDatabase(userId) {
  // Mô phỏng truy vấn cơ sở dữ liệu
  return { id: userId, name: 'Jay', age: 30 };
}

5. Kết Luận

Redis là một công cụ mạnh mẽ cho bộ nhớ đệm và các ứng dụng thời gian thực. Bằng cách tích hợp Redis vào các dự án Node.js, bạn có thể cải thiện đáng kể hiệu suất và khả năng mở rộng. Hướng dẫn này đã bao quát các khái niệm cơ bản về kiểu dữ liệu, lệnh, và cách sử dụng Redis trong ứng dụng Node.js. Hãy khám phá thêm các tính năng nâng cao như giao dịch, scripting Lua, và clustering khi bạn đã quen thuộc hơn với Redis. Redis là một công cụ đa năng có thể nâng cao đáng kể ứng dụng của bạn.

Happy Coding

6. Tài Nguyên Tham Khảo