电商平台 都会有抢购的情况,比如 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. ElasticSearch 5.0.0 集群安装部署文档

    1.  搭建环境 3台物理机 操作系统 centos7 es1   192.168.31.141   4g内存   2核 es2   192.168.31.142   4g内存   2核 es3    ...

  2. 自动化测试 selenium中WebDriver 和WebElement的区别

    之前在做UI自动化测试中 经常会用到  WebDriver  和 WebElement两个类   以前对这两个类总感觉有点傻傻分不清 昨天看了下之前下的代码  结合自己的理解  对着两个类的区别和关系 ...

  3. 微信小程序--TabBar不出现的一种原因

    转自 http://blog.csdn.net/yedouble/article/details/54089825 pages数组的第一项必须是tabBar的list数组的一员. quedian无法返 ...

  4. Link/cut Tree

    Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...

  5. 利用 xrandr 命令修改屏幕分辨率

    问题背景 电脑外接着一个 23' 的显示器,分辨率为 1920*1080. 操作系统:ubuntu 14.04 今天,通过 Setting->Displays 中选择外接屏的分辨率时,发现最大只 ...

  6. dm642的中断定时器

    TIMER_Handle TimerHandle0; void timer1() { ////////////定时器///////////////////////  TimerHandle0 = TI ...

  7. Android WebView 缓存机制和模式详解

    当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹: 我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webv ...

  8. Error Code: 1054. Unknown column 'age' in 'user'

    1.错误描述 10:28:20 alter table user modify age int(3) after sex Error Code: 1054. Unknown column 'age' ...

  9. 双硬盘RAID 0全攻略

    . RAID53 RAID7即高效数据传送磁盘结构,是RAID3和带区结构的统一,因此它速度比较快,也有容错功能.但价格十分高,不易于实现. 为什么需要磁盘阵列        如何增加磁盘的存取(ac ...

  10. 使用Gulp进行代码压缩的步骤以及配置

    一.安装步骤 1.首先确定是否安装了node.js,如果未安装,请先安装node.js: 2.确定是否安装了包管理工具npm,如未安装请安装:npm install npm -g: 3.安装gulp: ...