redis 秒杀多并发处理
网上有很多处理并发的例子 但是感觉太麻烦啦 所以凭着自己的感觉写了一个
测试 1秒 300个请求 是通过的
欢迎各位大神指点
学习参考
http://doc.redisfans.com/topic/transaction.html#check-and-set
// 1乐观锁
public function optimisticlock($key){if(!$this->_redis->EXISTS($key)){return false;}$this->_redis->WATCH($key); //监听事务// 库存数量$value = $this->_redis->get($key);if(!$value){return false;}$value = $value - 1;$this->_redis->MULTI; //事务开始$resoult=$this->_redis->set($key,$value);$this->_redis->EXEC; //事务结束return $resoult;
}
测试过程
huiting@USER-WangHuiTing:/opt$ http_load -p 300 -s 1 test.txt
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
http://www.yuexing.eihoo.cn/index.php?mod=test&act=optimisticlock: byte count wrong
18764 fetches, 300 max parallel, 3.4125e+06 bytes, in 1.00005 seconds
181.864 mean bytes/connection
18763.1 fetches/sec, 3.41234e+06 bytes/sec
msecs/connect: 0.206676 mean, 2.604 max, 0.032 min
msecs/first-response: 4.53481 mean, 981.273 max, 0.188 min
15 bad byte counts
HTTP response codes:code 200 -- 15code 502 -- 18749
第二种方式用列表的方式 list 利用redis 的原子性 lpop 单进程 一个一个排队释放队列里面的元素
1,入库存
// 商品库存存redis public function set_stock($stock,$goods_id){ $key = 'seckill'.'_'.$goods_id; for ($i=0;$i<$stock;$i++){ $this->_redis->lpush($key,1); } }
2,出库存
//秒杀出库存 public function out_stock($goods_id){ $key = 'seckill'.'_'.$goods_id; $count = $this->_redis->lpop($key); if(!$count){ //debug_log_write(); return false; } return true; }
3.锁处理
public function lock($strMutex, $intTimeout, $intMaxTimes = 0) {$objRedis = new \Redis();$objRedis->pconnect($this->my_config['redis_server'], 6379);//使用incr原子型操作加锁$intRet = $objRedis->incr($strMutex);if ($intRet === 1) {//设置过期时间,防止死任务的出现$objRedis->expire($strMutex, $intTimeout);return true;}if ($intMaxTimes > 0 && $intRet >= $intMaxTimes && $objRedis->ttl($strMutex) === -1) {//当设置了最大加锁次数时,如果尝试加锁次数大于最大加锁次数并且无过期时间则强制解锁$objRedis->del($strMutex);}return false; }
$bool=$this->lock('lock_edit_userinfo_'.$user_id,1,1); if($bool==true){$task_mod->adduser_task($user_id, 5, 1, 1, 0); }
redis 秒杀多并发处理相关推荐
- Redis 秒杀案例
Redis 秒杀案例 文章目录 Redis 秒杀案例 实现 ab工具模拟并发 超卖和超时问题解决 配置JedisPool连接池来解决超时问题 利用乐观锁淘汰用户,解决超卖问题 库存遗留问题解决 什么是 ...
- 保姆级redis6全流程学习和redis秒杀全流程
文章目录 前言 一.redis解决的问题 1.1.1解决session共享问题 1.1.2降低io读操作 1.2.1nosql数据库的特点 1.2.2 NoSQL的适用场景 1.2.3 NoSQL不适 ...
- Redis 秒杀实战
原文链接:https://www.cnblogs.com/chenyanbin/p/13587508.html 已原创授权 为啥写这个微信抢红包项目呢,公司 0202 年 08 月 22 日,公司周年 ...
- PHP redis秒杀返回结果,php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- redis 秒杀成功 mysql_如何使用Redis实现秒杀
如何使用Redis实现秒杀 发布时间:2020-07-15 14:33:30 来源:亿速云 阅读:150 作者:Leah 如何使用Redis实现秒杀?很多新手对此不是很清楚,为了帮助大家解决这个难题, ...
- 头条Java后台3面(含答案):事务+List集合+慢查询SQL+Redis+秒杀设计
头条Java一面 1.讲讲jvm运行时数据库区 2.讲讲你知道的垃圾回收算法 3.jvm内存模型jmm 4.内存泄漏与内存溢出的区别 5. select.epoll 的区别?底层的数据结构是什么? 6 ...
- Redis秒杀功能设计与实现
前言 抢购问题不仅是电商类项目中一个重要的业务,也是许多开发人员在进阶过程中绕不开的问题,关于抢购,如果理清了前后的逻辑和里面涉及到的几个关键性的问题,问题就迎刃而解了 抢购中的几个常见问题 如何设计 ...
- mysql慢查询面试题_头条Java岗3面入职:事务+慢查询SQL+Redis+秒杀设计面试题等
一面 1.讲讲jvm运行时数据库区 2.讲讲你知道的垃圾回收算法 3.jvm内存模型jmm 4.内存泄漏与内存溢出的区别 5. select.epool 的区别?底层的数据结构是什么? 6.mysql ...
- redis秒杀代码案例
用redis实现的秒杀代码案例 public class JedisInstance {public synchronized static Jedis getSingleJedis() {Jedis ...
最新文章
- 史上最详细版Centos6安装详细教程
- NPTL简介 (NATIVE POSIX Thread Library)
- UserWarning: Update your `Conv2D`
- General-purpose and introductory examples for the scikit.
- SAP UI5 的 兼容性规则 Compatibility Rules
- python cmp函数未定义_python用plt画图时,cmp设置方法
- JEECG社区第六期架构培训班报名
- Jsp页面的几种传参方式
- 寒武纪“动荡”的 6 周年:CTO 梁军离职,市值蒸发 59 亿,核心技术人才仅剩 3 人
- Android Sqlite3数据库操作
- 思科2960g端口限速配置
- Fix Bug的五个阶段
- 事实表 的指标 维度表_数据库-事实表和维度表之间的区别?
- CDN (Content Delivery Network 内容分发网络)
- LimeSDR系列产品介绍(一):板卡级(Board Level)产品
- win10微软图标点击无反应_双击电脑桌面图标没反应,win10双击图标没反应
- ImageNet缔造者:让冰冷的机器读懂照片背后的故事
- 学计算机应该具备什么能力,学习计算机专业该具备那些能力?
- PTA航空公司VIP客户查询c++版——山东科技大学
- linux下查看系统配置参数
热门文章
- 技术派-IEEE standard for floating-point arithmetic
- 定义一个描述三角形的类,名字为Triangle,属性有: private double a, b, c; 方法有: double getPerimeter(),计算三角形的周长 double getA
- S7-200SMART案例分析——程序框架
- 六界仙尊h5服务器维护多久,六界仙尊H5游戏常见问题说明
- Kotlin系列之基础语法
- 试验箱的基本参数与循环系统无效缘故
- PMP之第一章 引论
- 5G NR 基本概念 SCS,RB,CRB,PointA
- 职场办公常用的技巧,办公如有神助
- html怎么编写化学符号,水的化学符号怎么写