Javascript 当并发请求在Web服务器(NodeJS)中命中时,如何基于计数编写逻辑

Javascript 当并发请求在Web服务器(NodeJS)中命中时,如何基于计数编写逻辑,javascript,node.js,mongodb,redis,queue,Javascript,Node.js,Mongodb,Redis,Queue,在我的一个需求中,web应用程序必须处理并发请求。在这个应用程序中,当列表数据的计数达到50时,我必须执行一些逻辑。这里我使用redis/mogodb来存储该列表 每次有请求时,我都会将数据推送到该列表中。这里的问题是,既然我必须处理并发请求,我如何限制数据推送到那个列表上?如果超过该限制,我必须将数据推送到另一个列表 有人能帮我吗?假设您在Redis中使用列表,您可以通过以下方法实现这一点。这样,操作是原子的,您不必担心并发性 在本例中,您使用带有计数器的键来跟踪当前正在填充的列表,然后脚本将

在我的一个需求中,web应用程序必须处理并发请求。在这个应用程序中,当列表数据的计数达到50时,我必须执行一些逻辑。这里我使用
redis/mogodb
来存储该列表

每次有请求时,我都会将数据推送到该列表中。这里的问题是,既然我必须处理并发请求,我如何限制数据推送到那个列表上?如果超过该限制,我必须将数据推送到另一个列表


有人能帮我吗?

假设您在Redis中使用列表,您可以通过以下方法实现这一点。这样,操作是原子的,您不必担心并发性

在本例中,您使用带有计数器的键来跟踪当前正在填充的列表,然后脚本将计算当前列表的长度,如果添加此条目后列表将满(在您的案例中有50个条目),请让计数器指向下一个列表

首先,让我们看看Lua脚本:

local currentList = redis.call('GET', KEYS[1])
local listLen = redis.call('LLEN', 'list:'..currentList)
if listLen < (tonumber(ARGV[1]) - 1) then 
    return redis.call('LPUSH', 'list:'..currentList, ARGV[2])
else
    redis.call('INCR', KEYS[1])
    return redis.call('LPUSH', 'list:'..currentList, ARGV[2])
end
有很多方法可以使用Lua实现这一点。底线是您需要以原子方式执行推送,您需要将逻辑移动到Redis服务器,实现这一点的最简单方法是使用Lua脚本


您可以将Lua脚本中的return语句修改为
return'列表:'..currentList..=>'..redis.call('LPUSH','list:'..currentList,ARGV[2])
。然后您的返回值还提供了添加项目的列表:
list:3=>2

关于锁定呢?每一个请求都被推送到一个队列中,第一个请求进入队列时会得到关键部分。作业完成后,释放CS并增加计数。我不知道您的应用程序中是否必须有并发性。请参阅如何在node中使用Redis Lua脚本
>> SET curList 1
OK
>> SCRIPT LOAD  "local currentList = redis.call('GET', KEYS[1]) \n local listLen = redis.call('LLEN', 'list:'..currentList) \n if listLen < (tonumber(ARGV[1]) - 1) then  \n return redis.call('LPUSH', 'list:'..currentList, ARGV[2]) \n else \n redis.call('INCR', KEYS[1]) \n return redis.call('LPUSH', 'list:'..currentList, ARGV[2]) \n end"
80f7e9a7ae0c32bdb0577861217ef680411c2941
>> EVALSHA 80f7e9a7ae0c32bdb0577861217ef680411c2941 1 curList 3 faa
1
>> EVALSHA 80f7e9a7ae0c32bdb0577861217ef680411c2941 1 curList 3 foo
2
>> EVALSHA 80f7e9a7ae0c32bdb0577861217ef680411c2941 1 curList 3 fuu
3
>> EVALSHA 80f7e9a7ae0c32bdb0577861217ef680411c2941 1 curList 3 fii
1
>> LRANGE list:1 0 -1
1) "fuu"
2) "foo"
3) "faa"
>> LRANGE list:2 0 -1
1) "fii"