在所有的电商网站中,不乏大量的抢购,比如双十一,双十二等等,作为一名开发人员考虑最多的就是多并发以及高并发
废话少说,开始写代码。我用了C#的MemoryCache代替试下流行的各种缓存
商品测试类:
public class ProductInfo
{
/// <summary>
/// 商品Id
/// </summary>
public string ProductId { get; set; }
/// <summary>
/// 商品名称
/// </summary>
public string ProductName { get; set; }
/// <summary>
/// 商品剩余数量
/// </summary>
public int TotalCount { get; set; }
}
设置商品剩余数量缓存:
MemoryCache cache = MemoryCache.Default;
var model = new ProductInfo
{
ProductId = Guid.NewGuid().ToString(),
TotalCount = ,
ProductName = "XX商品名称"
};
cache.Set("Product", model, null, null);
MessageBox.Show("缓存设置完成!");
模拟 15 个用户同时抢购:
private void btnStart_Click(object sender, EventArgs e)
{
for (int i = ; i <= ; i++)
{
Thread t = new Thread(ConsumeProduct);
t.Start(i);
}
}
private void ConsumeProduct(object Id)
{
lock (this)
{
MemoryCache cache = MemoryCache.Default;
var model = cache["Product"] as ProductInfo;
if (model.TotalCount > )
{
model.TotalCount -= ;
cache.Set("Product", model, null, null);
Console.WriteLine($"使用数量1,剩余库存:{model.TotalCount},当前线程Id:{Id},当前时间:{DateTime.Now.ToString("ss:ffff")}");
}
else
Console.WriteLine($"库存数量不足,剩余库存:{model.TotalCount},当前线程Id:{Id},当前时间:{DateTime.Now.ToString("ss:ffff")}");
}
}
最后结果:
最后:抢购中最重要的是及时的进行数据更新,在更新的时候对事物进行加锁,防止多个线程对同一商品数量进行扣减,这仅仅是一个很简单的范例