前言:高并发的秒杀活动中,通过查询数据库判断是否还有库存,然后对库存字段进行增减,极易出现库存超出或者库存为负的情况,一般来说有3中解决办法(数据库表加锁,memche缓存,redis队列);

我们这里使用redis来解决问题:

1、思路:

  1)触发开始开团的同时,把库存数量更新到id对应的队列上去(定时更新,或者手动更新)

  2)用户请求接口,如果队列长度>0,移除一个队列记录,同时对数据库进行相应操作

  3)如果队列长度<=0,拦截用户的访问,返回‘无库存’

步骤:

1、后台准点插入记录到redis

$redis = get_redis();
// 1、数据库获取拼团信息
$sql = "select id,title,surplus_num,high_lines,ku_1,ku_2,ku_3,ku_4 from group_goods";
$arr = getrecord_array($sql);//2、删除旧redis队列
foreach ($arr as $key => $value) {//商品id$goods_id = $arr[$key]['id'];$redis->delete('acst_goods_high_lines'.$goods_id);
}// 3、准点插入记录到redis
foreach ($arr as $key => $value) {//商品id$goods_id = $arr[$key]['id'];//库存数量$num = $arr[$key]['ku_3'];//json转换$in_list = json_encode($arr[$key]);for ($i=0; $i < $num; $i++) { $redis->lpush('acst_goods_high_lines'.$goods_id,$in_list);}
}

2、客户端抢购

$redis = get_redis();
//获取队列长度
$leng = $redis->lLen('acst_goods_high_lines'.$goods_id);
if($leng>0){   //移除一条记录$redis->lpop('acst_goods_high_lines'.$goods_id);//减去库存---增加成功开团数$sql = "update group_goods set surplus_num = surplus_num-1,mtime = $t,success_num=success_num+20  where id = $goods_id limit 1";exec_db($sql);}else{echojson('已售罄,敬请期待',0);
}

转载于:https://www.cnblogs.com/wenlei/p/9159736.html

redis解决“高并发定时秒杀”库存误差问题相关推荐

  1. Redis解决高并发(秒杀抢红包)

    1,Redis 丰富的数据结构(Data Structures) 字符串(String) Redis字符串能包含任意类型的数据 一个字符串类型的值最多能存储512M字节的内容 利用INCR命令簇(IN ...

  2. Nginx与Redis解决高并发问题

    Nginx与Redis解决高并发问题 参考文章: (1)Nginx与Redis解决高并发问题 (2)https://www.cnblogs.com/nucdy/p/5516511.html 备忘一下.

  3. 如何解决高并发,秒杀问题 1

    如何解决高并发,秒杀问题 参考文章: (1)如何解决高并发,秒杀问题 (2)https://www.cnblogs.com/apollo1616/articles/10166870.html 备忘一下 ...

  4. redis解决高并发问题,如商品秒杀

    redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动... redis之所以能解决高并发的原因是它可以直接访问内存,而以往我们用的是数据库(硬盘),提 ...

  5. 如何解决高并发,秒杀问题

    相信不少人会被这个问题困扰,分享大家一篇这样的文章,希望能够帮到你! 一.秒杀业务为什么难做? 1)im系统,例如qq或者微博,每个人都读自己的数据(好友列表.群列表.个人信息): 2)微博系统,每个 ...

  6. 使用Redis解决高并发方案 以及 思路讲解

    NoSQL Not Only SQL的简称.NoSQL是解决传统的RDBMS在应对某些问题时比较乏力而提出的. 即非关系型数据库,它们不保证关系数据的ACID特性,数据之间一般没有关联,在扩展上就非常 ...

  7. springboot中使用Redis解决高并发的方法

    一.集成redis 1.引入redis的依赖 <dependency><groupId>org.springframework.boot</groupId>< ...

  8. SpringBoot: Redis 模拟高并发商品秒杀测试

    秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题.对这类问题,有三种优化性能的思路: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理 用上这三招,不论秒杀时负载多大,都能轻松应 ...

  9. 91免费视频Redis+Lua解决高并发场景在线秒杀问题

    为何要使用Lua脚本解决商品超卖的问题呢? Redis在2.6版本后原生支持Lua脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 将复杂的或者多步的redis操作,写为一个脚本,一次 ...

最新文章

  1. docker镜像的备份和恢复
  2. 现在学java还是python好_该学Java还是Python?
  3. Linux下tmp文件夹的文件自动删除的问题(转)
  4. SAP CRM WebClient UI搜索结果界面的扩展字段显示
  5. js实现数组降维算法[不准用Array.prototype.flat的api]
  6. 草稿 datagridview的显示与修改
  7. VS2012下基于Glut OpenGL显示一些立体图形示例程序:
  8. 转:基于Jmeter的MQTT测试插件
  9. 【HTML+PHP+SQL】综合实验:一个简单丑陋的论坛网站(实现用户注册、登录、注销、修改信息、留言等功能)
  10. avi格式如何转换成mp4格式
  11. MODBUS-RTU协议主机和从机代码STM32 包含2个程序代码,主机和从机
  12. 金蝶云苍穹 通用图控件
  13. 安卓默认打开指定apk的无障碍权限
  14. 【渝粤教育】21秋期末考试国际私法10216k1
  15. Oracle 数据库表中已有重复数据添加唯一键(唯一约束)
  16. 北大青鸟 JQuery 制作特效 第一章 课后简答题
  17. 【深度学习入门基础】一、从线性代数和微积分的角度看神经网络
  18. 如何使用SSM框架开发一套WEB薪资管理系统
  19. 新手建站免费空间及其使用体验
  20. java后台批量下载文件压缩ZIP

热门文章

  1. php 基础函数写法,字符串,常用函数
  2. 使用Javascript来实现的超炫组织结构图(Organization Chart)
  3. Python Numpy 教程(使用 Jupyter 和 Colab)
  4. LIST OF CITIES FOR POTENTIAL VISIT IN SOUTHERN UK
  5. 家长对孩子的期望 from father
  6. English debate sample motion
  7. how to become a good teacher
  8. if you have something important on the clean my mac
  9. C#与U3D中字符串尾0
  10. U3D Debug.log的问题