1. Node.js与Redis连接基础Redis作为高性能的内存数据库在现代Web开发中扮演着重要角色。Node.js通过异步非阻塞I/O模型与Redis的快速内存操作完美契合这种组合特别适合需要处理高并发、低延迟场景的应用。1.1 环境准备在开始连接前确保已安装以下组件Node.js 16.x或更高版本建议使用LTS版本Redis服务器5.0版本npm或yarn包管理器验证Node.js安装node -v npm -vRedis服务检查redis-cli ping # 应返回 PONG1.2 客户端库选型Node.js生态中有多个Redis客户端库可供选择node-redis(官方推荐)最新v4.x支持Promise API完整的Redis命令支持活跃的维护更新ioredis(备选方案)支持集群和哨兵模式自动重连机制兼容旧版API提示新项目建议直接使用node-redis老项目迁移可参考官方迁移指南2. 连接实现详解2.1 基础连接配置安装node-redis客户端npm install redis基础连接示例import { createClient } from redis; const client createClient({ url: redis://localhost:6379 }); client.on(error, (err) { console.error(Redis Client Error, err); }); await client.connect();2.2 连接参数配置常用连接配置项参数类型默认值说明socketObject-套接字配置socket.hostStringlocalhostRedis主机地址socket.portNumber6379Redis端口socket.tlsBooleanfalse启用TLS加密passwordStringnull认证密码databaseNumber0数据库索引生产环境推荐配置const client createClient({ socket: { host: production.redis.example.com, port: 6379, tls: true, reconnectStrategy: (retries) Math.min(retries * 100, 5000) }, password: complex_password_123, database: 1 });2.3 连接状态管理重要事件监听client.on(connect, () { console.log(Connecting to Redis...); }); client.on(ready, () { console.log(Redis client ready); }); client.on(end, () { console.log(Connection closed); }); client.on(reconnecting, () { console.log(Attempting to reconnect...); });连接健康检查// 检查底层socket状态 const isSocketOpen client.isOpen; // 检查命令执行准备状态 const isReady client.isReady;3. 核心操作实践3.1 数据读写操作字符串操作示例// 设置键值自动序列化 await client.set(user:1000, JSON.stringify({ name: Alice, age: 28, lastLogin: new Date() })); // 获取并反序列化 const userData JSON.parse(await client.get(user:1000));哈希操作示例// 设置哈希字段 await client.hSet(product:500, { name: Smartphone, price: 599.99, stock: 50 }); // 获取全部哈希字段 const product await client.hGetAll(product:500);3.2 批量操作与管道管道技术提升性能const pipeline client.multi(); pipeline.set(counter, 0); pipeline.incr(counter); pipeline.get(counter); const results await pipeline.exec(); // results [OK, 1, 1]3.3 事务处理原子事务示例await client.executeIsolated(async (isolatedClient) { await isolatedClient.watch(balance); const balance parseInt(await isolatedClient.get(balance)); if (balance 100) { await isolatedClient.unwatch(); return; } const multi isolatedClient.multi(); multi.decrBy(balance, 100); multi.incrBy(savings, 100); await multi.exec(); });4. 高级应用场景4.1 发布/订阅模式发布端await client.publish(notifications, JSON.stringify({ type: system, message: Server maintenance scheduled }));订阅端const subscriber client.duplicate(); await subscriber.connect(); await subscriber.subscribe(notifications, (message) { console.log(Received:, JSON.parse(message)); });4.2 实现分布式锁可靠锁实现async function acquireLock(lockName, timeout 5000) { const identifier Math.random().toString(36).substring(2); const lockKey lock:${lockName}; const acquired await client.set(lockKey, identifier, { NX: true, PX: timeout }); if (!acquired) throw new Error(Lock acquisition failed); return { release: async () { const script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end ; await client.eval(script, { keys: [lockKey], arguments: [identifier] }); } }; }4.3 性能优化技巧连接池配置const client createClient({ socket: { connectTimeout: 5000, keepAlive: 30000 } });命令批处理const commands [ [set, key1, value1], [hset, hash1, field1, value1], [zadd, zset1, 1, member1] ]; await client.multi(commands).exec();Lua脚本优化const script local count redis.call(GET, KEYS[1]) if tonumber(count) tonumber(ARGV[1]) then redis.call(SET, KEYS[1], ARGV[2]) return 1 end return 0 ; await client.eval(script, { keys: [threshold], arguments: [100, 50] });5. 生产环境实践5.1 错误处理策略健壮的错误处理机制async function safeRedisCall(fn) { try { return await fn(); } catch (err) { if (err.code ECONNRESET) { console.warn(Connection reset, attempting reconnect...); await client.connect(); return safeRedisCall(fn); } throw err; } } // 使用示例 await safeRedisCall(() client.get(important-data));5.2 监控与日志关键指标监控client.on(command, (command) { monitor.log(Command: ${command}); }); client.on(commandQueueLength, (length) { metrics.gauge(redis.queue_length, length); });5.3 连接关闭管理优雅关闭方案async function gracefulShutdown() { try { await client.quit(); console.log(Redis connection closed); } catch (err) { console.error(Error closing Redis:, err); } finally { process.exit(0); } } process.on(SIGTERM, gracefulShutdown); process.on(SIGINT, gracefulShutdown);6. 常见问题排查6.1 连接问题常见错误及解决方案错误现象可能原因解决方案ECONNREFUSEDRedis服务未启动检查redis-server进程ETIMEDOUT网络问题/防火墙验证网络连通性NOAUTH密码错误检查认证配置ERR unknown command命令拼写错误验证命令语法6.2 性能问题性能优化检查清单避免大键值超过1MB使用管道批量操作合理设置过期时间避免阻塞命令如KEYS使用SCAN替代全量遍历6.3 内存管理内存优化技巧// 设置自动过期 await client.set(temp:session, data, { EX: 3600 // 1小时后过期 }); // 使用压缩 await client.set(large:data, compress(data), { EX: 86400 });在实际项目中我发现合理设置连接超时和重试策略能显著提高系统稳定性。对于关键业务路径建议实现降级方案当Redis不可用时可以切换到备用存储或本地缓存。