// 安装 Redis 客户端
npm install redis
// 引入 Redis
const redis = require('redis');
// 创建 Redis 客户端实例
const client = redis.createClient();
// 发布消息
client.publish('channel', 'Hello, Redis!');
// 订阅消息
client.subscribe('channel');
// 监听消息
client.on('message', (channel, message) => {
console.log(`Received message from channel ${channel}: ${message}`);
});使用 Redis 实现分布式锁
const redis = require('redis');
const client = redis.createClient();
async function acquireLock(resource, timeout) {
return new Promise((resolve, reject) => {
const identifier = generateUniqueIdentifier();
// 使用 SETNX 命令获取锁
client.setnx(resource, identifier, (err, result) => {
if (err) {
reject(err);
return;
}
if (result === 1) {
resolve(identifier);
} else {
// 获取锁失败,等待并重试
setTimeout(async () => {
try {
const newIdentifier = await acquireLock(resource, timeout);
resolve(newIdentifier);
} catch (err) {
reject(err);
}
}, 100);
}
});
});
}
async function releaseLock(resource, identifier) {
return new Promise((resolve, reject) => {
// 使用 Lua 脚本解锁,保证解锁的原子性
const script = 'if redis.call("get",KEYS[1]) == ARGV[1] then \
return redis.call("del",KEYS[1]) \
else \
return 0 \
end';
client.eval(script, 1, resource, identifier, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}Redis 高性能缓存方案
const redis = require('redis');
const client = redis.createClient();
function getCache(key) {
return new Promise((resolve, reject) => {
// 先查询缓存
client.get(key, (err, result) => {
if (err) {
reject(err);
return;
}
if (result) {
// 返回缓存数据
resolve(JSON.parse(result));
} else {
// 从数据库中查询数据
const data = fetchDataFromDatabase();
// 将数据缓存起来
client.setex(key, 3600, JSON.stringify(data));
// 返回数据
resolve(data);
}
});
});
}
function fetchDataFromDatabase() {
// 模拟从数据库中查询数据的过程
console.log('Fetching data from database...');
return { id: 1, name: 'Redis 高性能缓存方案' };
}利用 Redis 实现限流功能
const redis = require('redis');
const client = redis.createClient();
function limitRequest(key, maxRequests, duration) {
return new Promise((resolve, reject) => {
// 使用 Redis 的 INC command 实现计数器
client.incr(key, (err, currentCount) => {
if (err) {
reject(err);
return;
}
if (currentCount > maxRequests) {
// 超过最大请求数,拒绝请求
reject(new Error('Too many requests'));
} else {
// 还未达到最大请求数,放行请求
resolve();
}
// 设置过期时间,以清除计数器
client.expire(key, duration);
});
});
}