一个 Redis 连接可以为一千个并发用户提供服务吗?
Can one single Redis connection serve a thousand concurrent users?
Context: 我正在构建一个将被 1000 个用户同时访问并使用 Redis 作为数据库的应用程序。我正在使用 node-redis 客户端。我读到建议从应用程序的每个实例只打开一个或几个连接,因为打开连接很昂贵。
问题:假设客户端向Redis发送命令。当应用程序需要发送另一个命令时,此命令正在传输到 Redis 或正在执行(基本上,未完成)。客户端是等待第一个命令完成还是立即向 Redis 发送第二个命令?
这很重要,因为如果客户端等待,应用程序将无法真正充分利用异步,并且当来自一千个用户的命令试图访问 Redis 时,网络调用将成为一个很大的瓶颈。最好命令已经在 Redis 中排队,而不是让它们等待较早的命令完成后再通过网络。
谢谢!
您可以 运行 您的节点应用程序的多个实例,然后使用 Nginx 来平衡负载(假设您正在使用它)。客户端无需等待,负载均衡。
使用 Redis Pub/Sub 创建连接。
这里documentation供参考。
更新: 找到了详细的一步步解释here
它基于 Redis 客户端的实现方式。
在Redis服务器端,所有命令都是可序列化执行的。所以单连接不会成为Redis服务器的问题。
在客户端,如果您的框架使用阻塞式 TCP 连接(如 Jedis),那么很少的连接将成为瓶颈,因为您的命令将在客户端被阻塞以等待空闲连接。
但是如果客户端使用 async / nio(比如 Lettuce),单连接就可以了,因为连接可以在线程之间重用。
此外,数以千计的并发用户对 Redis 来说不是问题,但如果您使用的是单个 Web 服务器,您还应该关注 Web 服务。
Context: 我正在构建一个将被 1000 个用户同时访问并使用 Redis 作为数据库的应用程序。我正在使用 node-redis 客户端。我读到建议从应用程序的每个实例只打开一个或几个连接,因为打开连接很昂贵。
问题:假设客户端向Redis发送命令。当应用程序需要发送另一个命令时,此命令正在传输到 Redis 或正在执行(基本上,未完成)。客户端是等待第一个命令完成还是立即向 Redis 发送第二个命令?
这很重要,因为如果客户端等待,应用程序将无法真正充分利用异步,并且当来自一千个用户的命令试图访问 Redis 时,网络调用将成为一个很大的瓶颈。最好命令已经在 Redis 中排队,而不是让它们等待较早的命令完成后再通过网络。
谢谢!
您可以 运行 您的节点应用程序的多个实例,然后使用 Nginx 来平衡负载(假设您正在使用它)。客户端无需等待,负载均衡。
使用 Redis Pub/Sub 创建连接。
这里documentation供参考。
更新: 找到了详细的一步步解释here
它基于 Redis 客户端的实现方式。
在Redis服务器端,所有命令都是可序列化执行的。所以单连接不会成为Redis服务器的问题。
在客户端,如果您的框架使用阻塞式 TCP 连接(如 Jedis),那么很少的连接将成为瓶颈,因为您的命令将在客户端被阻塞以等待空闲连接。
但是如果客户端使用 async / nio(比如 Lettuce),单连接就可以了,因为连接可以在线程之间重用。
此外,数以千计的并发用户对 Redis 来说不是问题,但如果您使用的是单个 Web 服务器,您还应该关注 Web 服务。