// 安装 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); }); }); }