Content

redis使用Lua脚本解决多线程下的超卖问题及原因解析(redis集群命令行)墙裂推荐

文章摘要

这篇文章介绍了**MengLin.Shopping.Redis.LuaScript**命名空间中的**SecKillOriginal**静态类。该类的主要功能包括: 1. 初始化时删除数据库中的所有数据(包括删除默认的db0)。 2. 初始化库存数量为1,订单数量为0。 3. 在**Show**方法中,循环三次尝试获取库存数量: - 如果库存数量大于0,则递减库存并增增订单。 - 如果库存数量为0,则提示“抢购失败: 原因是因为没有库存”。 文章重点描述了类内静态方法的 Redis 数据库操作及其逻辑实现。

namespace MengLin.Shopping.Redis.LuaScript { public class SecKillOriginal { static SecKillOriginal() { using (RedisClient client=new RedisClient(“127.0.0.1”, 6379)) { //删除当前数据库中的所有Key, 默认删除的是db0 client.FlushDb(); //删除所有数据库中的key client.FlushAll(); //初始化库存数量为1和订单数量为0 client.Set(“inventoryNum”, 1); client.Set(“orderNum”, 0); } } public static void Show() { for (int i=0; i < 3; i++) { Task.Run(()=> { using (RedisClient client=new RedisClient(“127.0.0.1”, 6379)) { int inventoryNum=client.Get<int>(“inventoryNum”); //如果库存数量大于0 if (inventoryNum > 0) { //给库存数量-1 var inventoryNum2=client.Decr(“inventoryNum”); Console.WriteLine($”给库存数量-1后的数量-inventoryNum: {inventoryNum2}”); //给订单数量+1 var orderNum=client.Incr(“orderNum”); Console.WriteLine($”给订单数量+1后的数量-orderNum: {orderNum}”); } else { Console.WriteLine($”抢购失败: 原因是因为没有库存”); } } }); } } } }