REDIS的并发用于分布式系统中的闪存销售



我将建立一个用于Flash Sale的系统,该系统将共享相同的redis实例,并且一次将在15个服务器上运行。

因此,Flash Sale的算法将是。

Set Max inventory for any product id in Redis 
 using redisTemplate.opsForValue().set(key, 400L);
for every request :
   get current inventory using Long val = redisTemplate.opsForValue().get(key);
    check if it is non zero
     if (val == null || val == 0) {
                            System.out.println("not taking order....");
     } 
else{
put order in kafka 
and decrement using redisTemplate.opsForValue().decrement(key)
}

,但这里的问题是并发: 如果我设置库存400并使用500请求线程进行测试, 库存变成负面, 如果我使函数同步,则无法在分布式服务器中进行管理。

那么,最好的方法是什么?注意:由于请求计数高,我无法选择RDBM并设置隔离级别。

redis是一单读,因此在其上运行lua脚本始终是原子。您可以在redis实例上定义一个LUA脚本并从春季实例中运行。

您的LUA脚本将只是针对您的REDIS实例执行的操作序列(唯一具有正确值的股票值的实例(,并返回新值,例如,如果该值为负,则错误。

您的LUA脚本基本上是一项重新交易,还有其他方法可以实现REDIS交易,但是IMHO LUA最简单的是最简单的(也许是表现最低的人,但我发现在大多数情况下,它已经足够快(。

最新更新