我将建立一个用于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最简单的是最简单的(也许是表现最低的人,但我发现在大多数情况下,它已经足够快(。