Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Node.js实现存款人和取款人之间的匹配?_Javascript_Node.js_Redis_Microservices_Matching - Fatal编程技术网

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

Javascript 如何使用Node.js实现存款人和取款人之间的匹配?,javascript,node.js,redis,microservices,matching,Javascript,Node.js,Redis,Microservices,Matching,我的应用程序需要匹配引擎微服务,我需要在储户和取款人之间实现匹配。因此,储户和取款人的所有详细信息都存储在redis缓存中。将有大量的请求进入这个微服务,并被放入redis缓存。我需要在相同数量的基础上进行匹配 1) 如何进行匹配,是否需要将缓存中的详细信息提取到两个单独的数组和 在这两个数组上执行匹配。使用两个数组进行迭代,这是正确的方法吗 怎么办 2) 当提取到数组中的数据变大时,匹配就会变得复杂和复杂 也需要很多时间。处理这种情况的更好方法是什么 Consider the followi

我的应用程序需要匹配引擎微服务,我需要在储户和取款人之间实现匹配。因此,储户和取款人的所有详细信息都存储在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

将取款人元素作为分数
奖金÷金额
保存一个排序集

为了

您可以使用以下方式存储它:

然后使用获取并删除顶部元素。或者,您也可以使用,无需删除即可获得相同的内容,如下所示:

ZREVRANGEBYSCORE withdrawers +inf -inf WITHSCORES LIMIT 0 1
使用
ZPOPMAX
处理取款人时,如果匹配是部分匹配,则您可以
ZADD
以减少的金额和奖金再次取款

如果您为您的储户提供先进先出服务,请使用列表对他们进行排队:排队、处理

在处理存款人时,如果匹配是部分匹配,则您将
RPUSH
以减少的金额进行匹配

您的match maker客户端可以使用命令的阻止版本来消费:存款人和取款人

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

最初,我们说对取款人使用
score=bonus÷amount
,以最大限度地增加存款人的奖金。但这使得如何解决分数中的关系变得有些随意(您将首先获得按字典排序的max记录)

有很多解决办法

您可以使用更复杂的分数来解决关系。例如,要首先以最低金额获得奖金最大化:

分数=四舍五入(奖金*1000000÷金额)+1÷金额

四舍五入,你考虑一个技术领带范围:<代码>奖金额>代码>。该范围的大小由乘数的倒数决定。这里,1000000表示该范围的大小为0.000001

或者,在调用
ZREVRANGEBYSCORE-drawers+inf-inf with-cores LIMIT 0-1
以获得最大分数后,您可以简单地执行
ZREVRANGEBYSCORE-drawers-score-score-score-score-score-score-score-score-score-score-score-score-score
以使所有元素处于平局的顶部。然后在客户端解决这个问题


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

您在redis中使用什么数据类型来存储这些元素?(字符串、哈希、列表等)。如果可能,请提供一些示例。根据这一点,最好的解决方案可能是redis(服务器端)或node.js(客户端)或混合解决方案。感谢@LeoMurillo的回复,现在我们决定将其保留为一个列表,但也需要对此的建议。我们正在处理大量到匹配引擎微服务的传入请求,所有存款请求信息将进入redis缓存中的一个列表,取款请求信息将进入另一个列表。因此,personA存款20,personB取款20,personC存款20,您想匹配personA,personB,personC吗?或者先进先出(仅仅是personA personB)?实际上我需要与personA、personB和personC匹配!。。。匹配涉及到很多因素,但简单地说,下面是一个场景:人物角色存入20+0奖金,人物B提取20+0奖金,personC存款20+10奖金,然后personB和personC将匹配,因为取款人从存款人处获得更多奖金。请编辑此问题,以包括任何人需要帮助的所有相关详细信息。请看,这里是一个详细问题的示例:。如果您希望redis server在解决方案中提供帮助,最有可能的是,排序集将发挥作用-请参阅。
ZADD withdrawers 0.01 "personA|10000|100"
ZREVRANGEBYSCORE withdrawers +inf -inf WITHSCORES LIMIT 0 1