Redis中的并发用于分布式系统中的Flash销售

时间:2019-05-18 08:23:28

标签: spring concurrency redis

我要构建一个用于Flash出售的系统,该系统将共享相同的Redis实例,并且一次可在15台服务器上运行。

因此,Flash销售的算法将是

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个请求线程对其进行测试,  库存变成负数  如果使功能同步,则无法在分布式服务器中对其进行管理。

那么最好的方法是什么? 注意:由于请求数量过多,我无法使用RDBMS并设置隔离级别。

1 个答案:

答案 0 :(得分:0)

Redis是单线程的,因此在其上运行Lua脚本始终是原子的。 然后,您可以在Redis实例上定义Lua脚本,然后从Spring实例运行它。

您的Lua脚本只是针对您的redis实例(唯一一个具有正确股票价值的实例)执行的一系列操作,例如,返回新值,如果该值为负,则返回错误。

您的Lua脚本基本上是Redis事务,还有其他方法可以实现Redis事务,但是IMHO Lua首先是最简单的(也许性能最低,但是我发现在大多数情况下它足够快)。