https://github.com/luin/ioredis
目前用得最多的 Node.js Redis 库是 node redis,不过这个库基本已经不再维护了,存在很多 bug(在生产环境中碰到过),也缺失了很多功能(如 pipeling 和脚本优化)。而 ioredis 不仅支持了 Cluster 和 Sentinel,还在 API 层面和 node redis 保持了兼容。在 50 并发测试时性能达到了 node redis 的 2-3 倍。
欢迎大家使用和 star!
而 ioredis 不仅支持了 Cluster 和 Sentinel,还在 API 层面和 node redis 保持了兼容
可以考虑哦~
@i5ting 嗯…大部分兼容。multi 命令的结果格式不一样
@luinlee 楼主年少有为,很棒~~后生可畏
已 star~
@i5ting 多谢!
@alsotang 嘻嘻~表现不错…
撸主是写 redis 入门的那位?
@xadillax 嗯…
赞,正愁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 我说呢,还以为是某个站内技术贴,竟然是出版物,给楼主顶个。
@Hanggi 多谢!
怎么在我的机器上试,不报错,也没有任何反应呢? 而且如果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 好的,多谢
mark
@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吧
打扰~
mark
LZ,求问为什么我开着redis,就是连不上, ioredis:redis status[localhost:6379]: connecting -> close +16ms ioredis:connection reconnect in 2ms +0ms 是不是我拉下配置什么东西了
mark
@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尝试从新配置才好的,谢谢了!
@luinlee 有空我试试
虚心求教各位大神,客户端和redis master节点的连接完全ok,然后这时候,通过sentinel手动做一次failover,这个时候我的客户端怎么知道当前已经发生主从切换了呢,我的理解是这种情况下,我的客户端应用是不能知道的,因为客户端这边和sentinel的连接不是长连接。
@hzxuzhonghu 我在 GitHub 回答你了。给大家参考:https://github.com/luin/ioredis/issues/305
config set foo bar
ioredis怎么写?
@wwj559 就是按顺序写,可以参考:https://github.com/luin/ioredis/blob/master/examples/basic_operations.js 有现成的例子
伸手党表示垂地顿首
先给石墨研发star一下 From Noder
好文必须顶。。。
已用,确实不错
@i5ting 我们的游戏在pvp活动中已经在用ioredis了 cluster用起来还是比较挺好的。
@luinlee 是的,大神一解释就完全明白 了, 都是因为没深入研究redis的原理
@luinlee 请问集群是否可以只绑定集群的ip和端口,不绑定集群地址的数组?
@zhengnz 集群的 ip 和端口?你不是用的官方 Cluster 么
@luinlee 我的意思是绑定其中一个的ip和端口,会自动转其他的吗?还是说只能绑定数组才是集群模式?
@zhengnz 理论上最低程度只要填一个就可以了,其他的节点会自动发现
@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
。
@luinlee 好的 谢谢
解析文件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( --[[----- 这个脚本是不是没有缓存
找到一个bug, 麻烦看看:https://github.com/luin/ioredis/issues/418