我们一直使用Redis,直到得出结论:由于其功能,转向使用KeyDB可能是一个不错的选择。
环境
OS: Centos 7
NodeJs: v12.18.0
Redis: v6.0.5
Targeted KeyDB: v0.0.0 (git:1069d0b4) // keydb-cli -v showed this. Installed Using Docker.
ioredis: v4.17.3
pm2: v4.2.1 // used for clustering my application.
背景
根据KeyDB文档,KeyDB兼容最新版的Redis。
KeyDB仍然完全兼容Redis模块API和协议。因此,从Redis迁移到KeyDB非常简单,类似于在Redis到Redis情况下迁移的操作。 https://docs.keydb.dev/docs/migration/
在同一页面上,他们提供了一个兼容KeyDB的redis客户端列表。该列表包括我正在使用的ioredis。
KeyDB兼容所有Redis客户端,如此处所列,因此这不应该成为问题。只需像在Redis中一样使用您的客户端即可。 https://docs.keydb.dev/docs/migration/
问题
正如文档中所说,我应该能够在几个小时内轻松地迁移到KeyDB。但对于我来说并非如此!我花了过去的三天时间在互联网上搜索解决方案。我得出结论,我应该写给stackoverflow :)
问题有点有趣。客户端实际上正在使用KeyDb,并且该过程实际上正在设置和检索密钥(不确定但可能会在错误期间丢失一些数据)。但是有10%的时间会给我以下错误,并在一段时间后继续工作。由于我在生产环境中使用Redis存储会话和其他内容,所以我不能冒着忽略这种坚持出现的错误的风险。
error: message=write EPIPE, stack=Error: write EPIPE
./app-error-1.log:37: at WriteWrap.onWriteComplete [as oncomplete] (internal/stream_base_commons.js:92:16), errno=EPIPE, code=EPIPE, syscall=write
我在互联网上搜索了几乎所有与此错误有关的内容,但没有人提供解决方案或对出错原因进行解释。
幸运的是,该过程“有时”会显示一个错误栈。它指向 ioredis 代码中的 lib/redis/index.ts:711
,但我不知道它的作用。
(stream || this.stream).write(command.toWritable());
https://github.com/luin/ioredis/blob/master/lib/redis/index.ts#L711
我在 ioredis 的 GitHub 存储库上发现了一些问题,其中提到了 EPIPE 错误。但是大部分都是关于错误处理的问题,并且已经标记为已解决。
我还在 Google 上发现了一些关于 EPIPE 错误的通用问题(大多数是关于我不使用的 socket.io 的内容)。
总结
这个东西有什么问题吗?
keydb
或key-db
标签? - Peshraw H. Ahmednull
,在实例上调用了.end()
,或者发生了一些致命的流错误。这是我在没有看到你的应用程序代码的情况下的最佳猜测。 - EddieDeanDEBUG=ioredis:* node app.js
,但没有注意到任何错误。我认为一切都指向在Docker内部安装的问题。 - Peshraw H. Ahmed