public static void Show()
{
// 使用多线程模拟高并发下多用户创建订单,实现扣减库存,使用redis+lua脚本实现
using (var client = new RedisClient("127.0.0.1", 6379))
{
//Console.WriteLine(client.ExecLuaAsString(@"redis.call('set','name','clay6668888')"));
//Console.WriteLine(client.ExecLuaAsString(@"return redis.call('get','name')"));
Console.WriteLine(client.ExecLuaAsString(@"redis.call('set','number','10')"));
List<Task> taskList = new List<Task>();
for (int i = 0; i < 100; i++)
{
User user = new User();
user.Id = i;
user.Name = "坤坤" + i;
taskList.Add(Task.Factory.StartNew(() => CreateOrder(user)));
}
Task.WaitAll(taskList.ToArray());
}
}
public static void CreateOrder(User user)
{
using (var client = new RedisClient("127.0.0.1", 6379))
{
var totalCount = client.ExecLuaAsString(@"return redis.call('get','number')");
if (Convert.ToInt32(totalCount) == 0)
return;
Console.WriteLine($"创建用户:{user.Name}的订单");
var lua = @"local count = redis.call('get',KEYS[1])
if(tonumber(count)>0)
then
redis.call('INCR',ARGV[1])
return redis.call('DECR',KEYS[1])
else
return -1
end";
var str = client.ExecLuaAsString(lua, keys: new[] { "number" }, args: new[] { "ordercount" });
Console.WriteLine($"用户:{user.Name}的订单减去库存");
}
}
redis+lua高并发下实现扣减库存
最新推荐文章于 2024-06-21 01:57:35 发布