javascript - 如何使用Node.js实现存款人和取款人之间的匹配?

标签 javascript node.js redis microservices matching

我的应用程序有一个匹配引擎微服务需求,我需要在存款人和取款人之间实现匹配。因此,存款人和取款人的所有详细信息都存储在redis缓存中。将有大量请求进入该微服务并放入 Redis 缓存中。我需要在相同金额的基础上进行匹配。

1) 如何进行匹配,我是否需要将详细信息从缓存中提取到两个单独的数组中,然后 对这两个数组执行匹配。迭代两个数组,这是正确的方法吗 做吗?

2) 当获取到数组的数据变大时,匹配会变得复杂并且 也会花费很多时间。处理这种情况的更好方法是什么?

 Consider the following scenario:-

 w/d     |w/d amt|w/d-bonus|d/p    |  depositors   
 personA |10000  |   100   |person1|     70000
 personB |50000  |   750   |       |      
 personC |20000  |   100   |       |
 personD |1000   |   50    |       |
 personE |100000 |   1000  |       |

here person1 will be matched first with personB (50K -50K), personB is completely matched hence he will give person1 750 amt as bonus to depositor.

now still 20k of depositor has to be matched. so, that will be matched with personE , since personE got only 20K (personE needed 100K) he will give only 200 amt (for 100K we have 1K bonus then for 20K bonus will be 200/- amt)as bonus to depositor.

Point to be noted:

1) person1 is first matched with personB then he is matched with personE.

2)person1 could have matched totally with personE but person1 would get less bonus that is 700/- amt.

3)but now since person1 is matched with personB and personE , person1 will receive total bonus of 950/- amt 

Main aim is to provide depositor a maximum bonus.

above is an example , the perfect match would be D,B,A,E and D,B,E
we will consider D,B,A,E since we can satisfy 4 withdrawers and yet 
give the depositor maximum bonus. 

here: 
w/d => withdrawer
d/p => depositor
amt => amount

最佳答案

使用您的提款者元素保留一个排序集,使用分数奖金 ÷ 金额

对于

w/d     |w/d amt|w/d-bonus
personA |10000  |   100   

您使用 ZADD 存储它:

ZADD withdrawers 0.01 "personA|10000|100"

然后你使用 ZPOPMAX 进行消费获取并删除顶部元素。或者您可以使用ZREVRANGEBYSCORE无需删除即可获得相同的结果,如下所示:

ZREVRANGEBYSCORE withdrawers +inf -inf WITHSCORES LIMIT 0 1

使用 ZPOPMAX 处理提款者时,如果匹配不完整,则您可以使用减少的金额和奖金再次ZADD

如果您以先进先出的方式为存款人提供服务,请使用列表对他们进行排队:LPUSH排队,RPOP来处理。

在处理存款人时,如果匹配是部分的,那么您用减少的金额RPUSH它。

您的匹配器客户端可以使用命令的阻塞版本来使用:BRPOP对于储户和 BZPOPMAX对于提款者。

但是,如果您有多个引擎进行匹配,那么您最好使用 Lua script 来完成整场比赛。为了原子性。如果两个队列都不为空,则脚本应从两个队列中弹出,推回部分匹配的任何更新记录,然后返回匹配结果(如果有)(如果队列为空则返回 nil),以便您可以处理它:它,执行它,无论你在做什么。

最初,我们说对提款者使用分数 = 奖金 ÷ 金额,以最大限度地提高存款者的奖金。但这在某种程度上留下了如何解决分数中的平局的随机性(您将首先获得按字典顺序排序的最大记录)。

对此有很多解决方案。

您可以使用更复杂的分数来解决平局问题。例如,要首先以最小金额获得奖金最大化:

分数 = 回合(奖金 * 1000000 ÷ 金额)+ 1 ÷ 金额

通过四舍五入,您将技术平局视为奖金 ÷ 金额的范围。该范围的大小由乘数的倒数决定。此处,1000000 使该大小范围为 0.000001。

或者,您可以简单地执行 ZREVRANGEBYSCORE Pullers Score Score 来获取顶部平局中的所有元素,然后调用 ZREVRANGEBYSCORE Pullers +inf -infWITHSCORES LIMIT 0 1 来获得最高分。然后您在客户端解决绑定(bind)问题。

或者您可以尝试使用排序集的字典属性,调整存储元素的方式。

关于javascript - 如何使用Node.js实现存款人和取款人之间的匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59711722/

相关文章:

javascript - 如何检测浏览器是否支持暗模式

javascript - 如何显示自动幻灯片

heroku - 我可以使用带有连接 URL 的 redis-cli 吗?

php - Nextcloud 未连接到 Redis

javascript - 如何从本地文件夹安装 npm 模块?

javascript - 如何更改拉斐尔图标的大小?

javascript - 如何路由嵌入查询字符串的搜索 URL?

javascript - 响应不返回数据

javascript - 从 Node.js 中的 .rar 文件读取所有文件名

redis - 共享 Redis 数据库?