电商平台 都会有抢购的情况,比如 1元抢购。 而抢购 最重要的 就是库存,很多情况下  库存处理不好,就会出现超卖现象。

本文将用redis为缓存,StackExchange 框架,消息队列方式 实现分布式锁的情况

一,效果

先看效果,

窗体下单 构建高并发情况

开多个控制台应用程序 处理订单

二,配置Redis

  <Redis.Service>
<DbConfig Name="Order_DBName" Hosts="127.0.0.1:6379" dbNum=""> </DbConfig>
<DbConfig Name="Product_DbName" Hosts="127.0.0.1:6379" dbNum=""> </DbConfig>

模拟用户下单

      private void button1_Click(object sender, EventArgs e)
{
var orderCount = Convert.ToInt32(txt_OrderCount.Text);
var productId = Convert.ToInt32(txt_ProductId.Text); var productCount = Convert.ToInt32(txt_ProductCount.Text); for (int i = ; i < orderCount; i++)
{
RedisOrderModel cacheOrder = new RedisOrderModel()
{
Count = productCount,
OrderNo = (orderNo += ).ToString(),
ProductId = productId
};
orderRedis.Push(cacheOrder);
} }

控制台程序 处理订单

public void QueueList()
{
RedisOrderMessage redis = new RedisOrderMessage();
while (true)
{
try
{
var cacheOrder = redis.Pop();
if (cacheOrder == null)
{
Console.WriteLine("无订单,休息100毫秒");
Thread.Sleep();
continue;
} while (ThreadCount<=)
{
Console.WriteLine("线程已满,休息100毫秒");
Thread.Sleep();
}
//ThreadCount--;
Thread thread = new Thread(new ThreadStart(cacheOrder.CreateOrder));
thread.Start();
Console.WriteLine("正在处理订单,休息100毫秒");
Thread.Sleep();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "," + ex.StackTrace);
Thread.Sleep();
}
finally
{
ThreadCount++;
} }
}

使用分布式锁,判断库存是否足够

 public void LockStore(string productId, int count)
{
var keyInfo = AddSysCustomKey(productId); if (!Exists(keyInfo))
{
throw new Exception("商品缓存缓存不存在");
}
var redisConfig = ReadRedisConfig.GetRedisConfig(DB_Name);
var lockdb = redisConfig.GetDatabase(-);
var db = redisConfig.GetDatabase();
var token = Environment.MachineName;
while (true)
{
//db.LockRelease(keyInfo, token);
var con = lockdb.LockTake(keyInfo, token, TimeSpan.FromSeconds(10.0), CommandFlags.None);
//var con = db.LockTake(keyInfo, token, TimeSpan.FromSeconds(20), CommandFlags.None);
if (con)
{
try
{
var product = ConvertObj<CacheProduct>(db.StringGet(keyInfo));
if (product.Count < count)
{
throw new Exception("数量不够,下单失败");
}
product.Count -= count;
var json = ConvertJson(product);
db.StringSet(keyInfo, json); }
finally
{
lockdb.LockRelease(keyInfo, token); }
break;
}
} }

源码地址:

https://github.com/buruainiaaaa/CacheDemo.git

EF+Redis(StackExchange.Redis)实现分布式锁,自测可行的更多相关文章

  1. 使用Redis SETNX 命令实现分布式锁

    基于setnx和getset http://blog.csdn.net/lihao21/article/details/49104695 使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其 ...

  2. Redis 上实现的分布式锁

    转载Redis 上实现的分布式锁 由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多 ...

  3. 在 Redis 上实现的分布式锁

    由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多技术上的难点,在这我将对每一个有用 ...

  4. Redis整合Spring实现分布式锁

    spring把专门的数据操作独立封装在spring-data系列中,spring-data-redis是对Redis的封装 <dependencies> <!-- 添加spring- ...

  5. 使用Redis SETNX 命令实现分布式锁(转载)

    使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法. SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key 不存在. 若 ...

  6. 【连载】redis库存操作,分布式锁的四种实现方式[一]--基于zookeeper实现分布式锁

    一.背景 在电商系统中,库存的概念一定是有的,例如配一些商品的库存,做商品秒杀活动等,而由于库存操作频繁且要求原子性操作,所以绝大多数电商系统都用Redis来实现库存的加减,最近公司项目做架构升级,以 ...

  7. 基于 Redis 实现简单的分布式锁

    摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问.分布式锁实现的方案有很多 ...

  8. 基于Redis实现简单的分布式锁【理论】

    摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问.分布式锁实现的方案有很多 ...

  9. Redis、Zookeeper实现分布式锁——原理与实践

    Redis与分布式锁的问题已经是老生常谈了,本文尝试总结一些Redis.Zookeeper实现分布式锁的常用方案,并提供一些比较好的实践思路(基于Java).不足之处,欢迎探讨. Redis分布式锁 ...

随机推荐

  1. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  2. Java语言的特性

    一.跨平台 借助虚拟机,程序不经修改即可在不同硬件或者软件平台上运行.源代码级(C,C++源码会重新编译),目标代码级(Java). 二.面向对象 以对象为基本单位,使得程序开发变得简单易用,拓展更方 ...

  3. CNN 卷积层输入Map大小计算

    对于输出的size计算: out_height=((input_height - filter_height + padding_top+padding_bottom)/stride_height ) ...

  4. Linux sftp 安全文件传输命令

    sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性. 1.常用登陆方式: 格式:sftp <user>@<host> 通过sftp ...

  5. (转载)SVM-基础(三)

    支持向量机: Kernel  by pluskid, on 2010-09-11, in Machine Learning     70 comments 本文是"支持向量机系列" ...

  6. PhpStorm如何下载github上的代码到本地

    1.看着菜单栏有一个VCS(Virus Capture Scripter)集群服务器的选项,选择其下面的Checkout from Version Control,然后 (1)选择GIT:输入git的 ...

  7. cronatab周期性任务

    要执行周期性任务,要保证服务运行.服务名为crond:service crond start ; systemctl start crond; 配置文件 /etc/crontab cron的日志文件 ...

  8. Pandaboard ES编译bootloader、xloader、内核、以及安卓系统

    Building bootloader and kernel Bootloader Startwith building the bootloader. To learn more about the ...

  9. dojo单柱状图

    dojo单柱状图 1.dojo单柱状图源码 column.html: <!DOCTYPE HTML> <html lang="en"> <head&g ...

  10. MinnowBoard MAX 硬件开发板

    Minnowboard MAX MinnowBoard MAX是一款紧凑型,经济实惠,而且功能强大的开发板为专业人士和制造商.开放式的硬件设计使无尽的定制和集成的潜力.它采用64位英特尔®凌动™E38 ...