【问题标题】:What assumptions can I make when using Redis with a single connection from a NodeJS server将 Redis 与来自 NodeJS 服务器的单个连接一起使用时,我可以做出哪些假设
【发布时间】:2014-06-30 21:54:03
【问题描述】:

我在一个 NodeJS 实例上使用 SocketIO,它有一个到 Redis 缓存的连接。此缓存被用作在实时环境中维护状态的一种手段。

我的前提包括并发问题可能会由于发生大量事务而发生,但是,我不确定我需要解决哪些并发问题...

我的初始设计使用 Lua 脚本和 EVAL(使用 EVAL 调用的脚本被认为是 Redis 的原子事务)来实现对给定键的状态的检查,但除此之外我不是确定我是否需要在其他任何地方实现锁。

我主要关心的是当 SocketIO 捕获一个连接并随后执行一个事件时,我能保证在该事件中发生的 Redis EVAL 什么。一个具体的用例:

1) 客户端 A 发出一个被服务器捕获的事件

2) 服务器执行请求的事件,包括调用EVAL Redis 上的 Lua 脚本

3) 客户端 B 发出一个被服务器捕获的事件

4) 服务器执行请求的事件,其中包括调用EVAL Redis 上不同的 Lua 脚本

由于 NodeJS 的异步特性,我是否可以假设来自客户端 A 的 EVAL 将始终在客户端 B 之前被 Redis 服务器接收?我对事件循环的理解完全错误吗?

【问题讨论】:

    标签: node.js concurrency redis socket.io


    【解决方案1】:

    答案完全取决于您的代码。基本上是的,对于这种类型的事件,nodejs 将按照它们出现在事件循环队列中的顺序处理它们。

    但是,您说请求处理包括调用EVAL,这意味着如果您的处理包括其他 I/O(如查询持久性数据库),则处理来自客户端 A 的请求的步骤顺序可以与处理来自客户端 B 的请求的步骤交错。

    一般来说,如果可能,您应该尽量避免创建中断并发的逻辑。如果某些事情需要以完全相同的顺序完成,请考虑创建一个处理队列(全局队列,其中只有在前一个项目完成后才能处理下一个项目)或将关键部分本地化为原子序列(如 LUA 脚本)。

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2021-09-12
      相关资源
      最近更新 更多