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

随心笔谈9个月前更新 admin
188 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章介绍了**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($”抢购失败: 原因是因为没有库存”);
}
}
});
}
}
}
}

© 版权声明

相关文章