精华 ioredis - 一个支持 Cluster 和 Sentinel 的 Redis 库
发布于 10 年前 作者 luinlee 48633 次浏览 最后一次编辑是 8 年前 来自 分享

https://github.com/luin/ioredis

目前用得最多的 Node.js Redis 库是 node redis,不过这个库基本已经不再维护了,存在很多 bug(在生产环境中碰到过),也缺失了很多功能(如 pipeling 和脚本优化)。而 ioredis 不仅支持了 Cluster 和 Sentinel,还在 API 层面和 node redis 保持了兼容。在 50 并发测试时性能达到了 node redis 的 2-3 倍。

欢迎大家使用和 star!

90 回复

而 ioredis 不仅支持了 Cluster 和 Sentinel,还在 API 层面和 node redis 保持了兼容

可以考虑哦~

@i5ting 嗯…大部分兼容。multi 命令的结果格式不一样

@luinlee 楼主年少有为,很棒~~后生可畏

@i5ting 多谢!

@alsotang 嘻嘻~表现不错…

撸主是写 redis 入门的那位?

赞,正愁node redis不支持cluster呢!已star !

@In37 多谢!因为生产环境还没用上 Cluster,所以如 README 里说的 Cluster 还是实验功能。对应的 functional tests 在这里:https://github.com/luin/ioredis/blob/master/test/functional/cluster.js,接下来我会着重弄这个,如果有问题欢迎发 issue :-)

已经是 Redis 网站推荐的 client 了:http://redis.io/clients#nodejs

马克 自豪地采用 CNodeJS ionic

和Teambition的thunk-redis可以PK下.

@meteormatt 嗯嗯和作者zensh有过交流,很棒的作者,thunk-redis 也很不错~互相学习

看着示例代码就比node-redis好看

@luinlee 楼主的redis 入门有链接吗?

@luinlee 我说呢,还以为是某个站内技术贴,竟然是出版物,给楼主顶个。

怎么在我的机器上试,不报错,也没有任何反应呢? 而且如果redis需要密码的话,这样能连上吗?

var redis = new Redis({ sentinels: [{ host: ‘127.0.0.1’, port: 26379 } ], name: ‘mymaster’ } );

redis.get( ‘testingkey’, function(err, result ) { if (err) console.log(err); else console.log(result); } );

大侠,sentinel到底怎么连呀?

@bjshijh 密码要设置 password 选项,文档里有些。Sentinel 是这样连,可以打开调试信息:DEBUG=ioredis:* node yourapp.js

@我在用iosredis的Sentinel,在set值的时候不能设置过期时间的吗,我在文档里好像没看到有配置,坐等大神回复

找到了,文档中找不到,看到reids.getBuiltinCommands()才知道有ttl和expire方法。(以前没用过redis,不知道有这些东西,~囧~)

@fisherwj 直接使用 set 命令也可以设置过期时间,可以参考官网文档:http://redis.io/commands/set

@luinlee 大神,请教下,使用ioredis等连接redis时,不需要考虑连接池什么的吗? 是库里面自动处理的吗? 然后还想请教下,任务队列的话,用ioredis的pubsub或者kue哪个会更好些呢?某些任务我不想丢失,比如给用户记账等操作 谢谢

呃。。。我這邊已經在清理 redis 了,改成用 shm 和 mongodb ,已經受夠 redis 的IPC性能了

@morfies 一般不需要考虑连接池,ioredis 没有处理。因为到 Redis 的连接很轻量,同时 Redis 也是单线程模型。

任务队列可以考虑用 bull,kue 也可以的。自己的 pubsub 因为没有持久化,如果消费者没有启动,消息就丢失了

@luinlee 大神,我可以请教一个问题吗 我现在队列用的是bull,但它依赖了node redis, 而我的其它缓存用了ioredis, 当我把应用放到阿里云时(用的kvstore,其redis版本为2.8),启动会报错

Unhandled rejection Error: ERR unknown command evalsha at ReplyParser.<anonymous> (/data/paperplane/node_modules/redis/index.js:317:31) at ReplyParser.emit (events.js:107:17) at ReplyParser.send_error (/data/paperplane/node_modules/redis/lib/parser/javascript.js:296:10) at ReplyParser.execute (/data/paperplane/node_modules/redis/lib/parser/javascript.js:181:22) at RedisClient.on_data (/data/paperplane/node_modules/redis/index.js:547:27) at Socket.<anonymous> (/data/paperplane/node_modules/redis/index.js:102:14) at Socket.emit (events.js:107:17) at readableAddChunk (_stream_readable.js:163:16) at Socket.Readable.push (_stream_readable.js:126:10) at TCP.onread (net.js:538:20)

@luinlee 不好意思,我找到原因了, 阿里的kvstore不支持evalsha命令,但是不巧,bull使用到了 我先用kue吧

打扰~

LZ,求问为什么我开着redis,就是连不上, ioredis:redis status[localhost:6379]: connecting -> close +16ms ioredis:connection reconnect in 2ms +0ms 是不是我拉下配置什么东西了

@zeroone001 端口或者 host 错了吧

@luinlee 端口和host都是默认的,127.0.0.1:6379

@zeroone001 这个原因太多了,你给的信息有点少

cluster的示例就不能跑

@blackjack 首页的示例是 2.x 版本的

已star 大赞! 公司生产环境已经在使用了

要是有集群相关示例就好了,有Cluster自然就要用Cluster

@eragon Readme 中有一些简单的示例

大神,问个问题。HSCAN命今要怎么传参数。我只能做key和游标,不能传正则。 不是用hscanStream.

@cqxudy 一个地方问我就好了…我微博私信回你了。key 就是 pattern,Redis 不支持正则

按照官方给的示例,链接不上集群呀! 单个都ok呀!

@dragonsknight 肯定能连上的…好过公司线上都在用呢 =.=,开 debug 模式看看吧

@luinlee var Redis = require(‘ioredis’);

var cluster = new Redis.Cluster([ { port: 7001, host: ‘182.92.11.51’ }, { port: 7002, host: ‘182.92.11.51’ }, { port: 7003, host: ‘182.92.11.51’ }, { port: 7004, host: ‘182.92.11.51’ }, { port: 7005, host: ‘182.92.11.51’ }, { port: 7006, host: ‘182.92.11.51’ } ]); 这样不对吗?

楼主应该再写一篇 demo

@dragonsknight 对的,可以打开调试模式看看日志(DEBUG=ioredis:* node yourapp.js

@luinlee cancelled because Node.js is unresponsive

@luinlee 我只是按照论坛搭建了cluster,是不是还要配置Sentinel 呢?

@luinlee 单个是可以连接上的

@dragonsknight 那说明搭建的方式有问题,sentinel 和 cluster 没关系

@luinlee 我是按照redis.cn论坛提供的搭建集群的,命令执行都没问题!

@dragonsknight 用 redis-cli 连上试试,redis-cli -p 7001 -h 182.92.11.51,然后执行个 cluster slots,看看返回啥。另外开启 debug 模式后,ioredis 无论能不能连上,都会有输出的。

这样看起来是没问题的,不过信息太少,我猜测是 IP 的问题,需要通过内网 IP 连接 Redis。如果不行的话就只能开 debug 模式看日志了

@luinlee 不能是外网吗?我在阿里云上面部署的!

完全兼容 redis模块吗

@dragonsknight 和你绑定的 interface 有关

@captainblue2013 大部分是兼容的,不过 redis 模块有很多遗留的历史问题,导致一些接口不友好,ioredis 做了一些不兼容的修改。具体可以参考文档:https://github.com/luin/ioredis/wiki/Migrating-from-node_redis 有很多公司已经迁移到了 ioredis,基本上来说改动很小

@luinlee 谢谢大神耐心回答,问题解决了,因为使用./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006创建集群,所以比较慢,把ip地址改成182.92.11.51就好了,不知道为什么,是看了https://github.com/xetorthio/jedis/issues/659尝试从新配置才好的,谢谢了!

虚心求教各位大神,客户端和redis master节点的连接完全ok,然后这时候,通过sentinel手动做一次failover,这个时候我的客户端怎么知道当前已经发生主从切换了呢,我的理解是这种情况下,我的客户端应用是不能知道的,因为客户端这边和sentinel的连接不是长连接。

@hzxuzhonghu 我在 GitHub 回答你了。给大家参考:https://github.com/luin/ioredis/issues/305

config set foo bar

ioredis怎么写?

伸手党表示垂地顿首

先给石墨研发star一下 From Noder

好文必须顶。。。

已用,确实不错

@i5ting 我们的游戏在pvp活动中已经在用ioredis了 cluster用起来还是比较挺好的。

@luinlee 是的,大神一解释就完全明白 了, 都是因为没深入研究redis的原理

@luinlee 请问集群是否可以只绑定集群的ip和端口,不绑定集群地址的数组?

@zhengnz 集群的 ip 和端口?你不是用的官方 Cluster 么

@luinlee 我的意思是绑定其中一个的ip和端口,会自动转其他的吗?还是说只能绑定数组才是集群模式?

@zhengnz 理论上最低程度只要填一个就可以了,其他的节点会自动发现

@luinlee 生产环境下建议是多个还是一个好呢? From Noder

@zhengnz 多个会好些,保证一个节点失效了依旧可以连接上整个集群

@luinlee 好的,非常感谢

@luinlee 在使用sentinels的时候,我的master redis与slave redis连接都需要不同的password。我可以使用sentinels通过password连接master的redis。但是当master故障之后切换到slave的时候我怎么使用password连接这个slave的redis。难道我要使用同一个password???

@luinlee 发现ioredis 以sentinel模式链接的时候 host地址不对 启动的的时候不报错 是什么情况?类似下面的这种 var client = new Redis({ sentinels: [{ host: ‘1722222.168.100.53’, port: 26379 }], name: ‘mymaster’ }) 地址写的不对启动的时候居然能够启动 但是redis实际上没有链接上

@youyouStorm 连接是异步的,所以填错地址不会影响启动。可以看一下 sentinelRetryStrategy

解析文件rpush并发达到12k/s 给力给力

@luinlee 发现使用defineCommand自定义执行脚本命令,每次都会打印执行eval的脚本 ioredis:redis write command[0] -> evalsha(0550e3e827539e62ac842fa3f9396972d56ab97a,3,1,1,1,a2) +9m ioredis:redis write command[0] -> eval( --[[----- 这个脚本是不是没有缓存

回到顶部