Nodejs连接redis遇到的坑

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

from:http://cnodejs.org/topic/584fb72e9ff0dbf333450a15

目前Nodejs端使用redis模块对redis服务进行连接,代码如下:

var redisClient = redis.createClient(config.redisAuth);

redisClient.on("error", function (err) {
    redisClient.quit()
    logger.error("Error " + err);
    redisClient = redis.createClient(config.redisAuth);
});

module.exports = redisClient;

当redis发生error的时候,首先是quit了这个连接,然后再创建一个新的连接。这样写出现了一个问题,就是当发生error然后连接quit了之后,该连接并没有像预想中的去重新创建新连接去连接,所以之后使用 redisClient 去set或者get的时候就会报错,此时redis的操作无法再正常进行,除非重启服务器重置连接。当初这么写是为了保证redis链接在异常情况下保证能重连,现在看来这种方式是有问题的。

查看官方文档,确定redis库是有完善的自动重连机制的,所以以后这块我们就不做处理了。

redisClient.on("error", function (err) {
    logger.error("Error " + err);
});

但并不能保证就一定没问题了,所以这里准备加入redis错误告警,对redis异常进行监控。

redisClient.on("error", function (err) {
   report('RedisError');
   logger.error("Error " + err);
});

var client = redis.createClient({
    retry_strategy: function (options) {
        if (options.error.code === 'ECONNREFUSED') {
            // End reconnecting on a specific error and flush all commands with a individual error 
            report('连接被拒绝');
        }
        if (options.times_connected > 10) {
            report('重试连接超过十次');        
        }
        // reconnect after 
        return Math.max(options.attempt * 100, 3000);
    }
});

在redisClient初始化时,加入 retry_strategy 配置, 对连接的异常进行处理。

此方法如果返回 数字 类型比如 1000, 则该连接 会在 1秒后重新连接。如果返回非数字类型或者是 Error类型,则中断重连!!(所以必须返回数字)。

这里还有一个值得注意地方,当redis断开连接或者连不上的时候,会抛出一个异常,如果nodejs程序没有显示捕获这个异常进行处理,那么nodejs进程就会退出,所以需要如下类似的代码才能保证redis断开后重连。

function uncaughtExceptionHandler(err){
    if(err && err.code == 'ECONNREFUSED'){
        //do someting
    }else{
        process.exit(1);
    }
}
process.on('uncaughtException', uncaughtExceptionHandler);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Node.js 中使用 Redis 有很多种方法,下面是一种使用 `redis` 库来连接 Redis 的方法: 1. 安装 `redis` 库: ``` npm install redis ``` 2. 在 Node.js 代码中引入 `redis` 库并连接 Redis: ``` const redis = require('redis'); const client = redis.createClient(); ``` 3. 在连接成功后,你就可以使用 Redis 命令了,例如: ``` client.set('key', 'value', redis.print); client.get('key', (error, result) => { if (error) { console.log(error); return; } console.log(result); }); ``` 注意:如果 Redis 服务器不在本机上,你需要在 `createClient()` 函数中指定 Redis 服务器的地址和端口号。 希望这能帮到你! ### 回答2: Node.js连接Redis可以使用一些开源的Redis客户端库来实现,比如redis、ioredis等。下面以ioredis为例简单介绍Node.js连接Redis的步骤。 首先,需要安装ioredis库。可以通过npm命令来安装,命令如下: ```bash npm install ioredis ``` 安装完成后,在JavaScript代码中引入ioredis库: ```javascript const Redis = require('ioredis'); ``` 然后,可以创建一个Redis实例并连接Redis服务器: ```javascript const redis = new Redis({ host: 'localhost', port: 6379, // 默认的Redis端口 password: 'your password', db: 0 // Redis数据库索引,0表示默认数据库 }); ``` 在连接时,可以指定Redis服务器的地址、端口、密码和数据库索引等参数,具体根据实际情况设置。 连接成功后,就可以使用Redis实例进行各种操作了,比如设置键值对、获取值、删除等操作。下面是一个简单的示例: ```javascript // 设置键值对 redis.set('key', 'value'); // 获取值 redis.get('key').then(value => { console.log(value); // 输出:value }); // 删除键值对 redis.del('key'); ``` 另外,为了避免连接Redis时出现错误,可以对连接过程进行错误处理: ```javascript redis.on('error', err => { console.error('Redis connection error:', err); }); ``` 通过以上步骤,就可以使用Node.js连接Redis,并进行各种操作了。当然,根据具体情况还可以进行更多配置和操作,比如设置Redis过期时间、订阅和发布消息等,根据实际需求选择使用不同的Redis客户端库。 ### 回答3: Node.js连接Redis需要使用Redis模块,常用的有node_redis和ioredis。 首先,需要在Node.js中安装Redis模块。可以通过npm包管理器像下面这样安装它们: ``` npm install redis ``` 或者 ``` npm install ioredis ``` 接下来,在代码中导入Redis模块: 使用node_redis: ```javascript const redis = require('redis'); ``` 使用ioredis: ```javascript const Redis = require('ioredis'); ``` 然后,创建Redis客户端并连接Redis服务器: 使用node_redis: ```javascript const client = redis.createClient(); client.on('connect', function() { console.log('Redis服务器已连接'); }); client.on('error', function(err) { console.log('无法连接Redis服务器:' + err); }); ``` 使用ioredis: ```javascript const client = new Redis(); client.on('connect', function() { console.log('Redis服务器已连接'); }); client.on('error', function(err) { console.log('无法连接Redis服务器:' + err); }); ``` 现在,你可以使用client对象执行各种Redis操作,例如设置、获取和删除键值对: ```javascript // 设置键为"key",值为"value" client.set('key', 'value', function(err, reply) { if (err) { console.log('设置失败:' + err); } else { console.log('设置成功'); } }); // 获取键为"key"的值 client.get('key', function(err, reply) { if (err) { console.log('获取失败:' + err); } else { console.log('获取到的值为:' + reply); } }); // 删除键为"key" client.del('key', function(err, reply) { if (err) { console.log('删除失败:' + err); } else { console.log('删除成功'); } }); ``` 最后,不要忘记在不再使用Redis时,关闭Redis连接: 使用node_redis: ```javascript client.quit(); ``` 使用ioredis: ```javascript client.disconnect(); ``` 以上就是使用Node.js连接Redis的基本过程。当然,你还可以根据自己的需求进行更复杂的Redis操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值