首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在从NodeJS服务器使用单个连接的Redis时,我可以做哪些假设

在从NodeJS服务器使用单个连接的Redis时,我可以做哪些假设
EN

Stack Overflow用户
提问于 2014-07-01 05:54:03
回答 1查看 100关注 0票数 0

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

我的前提是,并发问题可能是由于大量事务发生而发生的,然而,我不确定我需要考虑哪些并发问题……

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

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

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

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-07-01 17:55:42

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24499545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档