我要构建一个用于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并设置隔离级别。
答案 0 :(得分:0)
Redis是单线程的,因此在其上运行Lua脚本始终是原子的。 然后,您可以在Redis实例上定义Lua脚本,然后从Spring实例运行它。
您的Lua脚本只是针对您的redis实例(唯一一个具有正确股票价值的实例)执行的一系列操作,例如,返回新值,如果该值为负,则返回错误。
您的Lua脚本基本上是Redis事务,还有其他方法可以实现Redis事务,但是IMHO Lua首先是最简单的(也许性能最低,但是我发现在大多数情况下它足够快)。