文档章节

php redis实现秒杀功能

RitaChen
 RitaChen
发布于 2016/11/17 13:36
字数 424
阅读 289
收藏 0
点赞 0
评论 0

主要针对并发情况下,通过redis的分布式锁和队列的方式进行处理的代码

Queue:{商品ID}:   数据类型是有序集合(zset),成员是用户ID,score是用户入队的时间戳

Lock:Queue:{商品ID}: 数据类型是字符串(string),存储的是该锁的过期时间

goods:{商品ID}:stock: 存储的是商品的库存数量

简单介绍demo代码中的实现思路:

将当前秒杀的商品id作为一个队列名称

$queue_name = “Queue:{商品ID}”;

对$queue_name进行加锁

    通过setnx(满足原子性)实现加锁  :$redis->setnx("Lock:Queue:{商品ID}",  $expire time)

    加锁成功,给该锁设置一个过期时间,主要是为了防止死锁

    如果加锁失败,通过设置休眠时间,进行循环请求

加锁成功后,判断队列中的成员数是否超过指定的大小

$count = $this->redis->zCard("Queue:{$name}");
if($count >=  $this->redis->get("goods:{$name}:stock")) {
    $this->lockModel->unlock("Queue:$name");
    return '超过指定集合数量';
}

 判断用户ID是否存在队列中,如不存在则加入队列(score:存入的是当前时间戳 )

if (false === $this->redis->zScore("Queue:$name", $user_id)) {
    $this->redis->zAdd("Queue:$name", $score, $user_id);
}

入队成功,进行解锁$redis->del("Lock:Queue:{商品ID}");提示用户抢购成功。成功的用户会跳转到确认购买的页面,点击确认后才会生成订单、出队等后续操作

ps: 针对多个账号,一次性发送多个请求可以通过ip的访问频率的限制来预防

参考文章:http://blog.jobbole.com/95156/

demo代码的下载地址:https://github.com/Ritajiajia/redis_test/tree/master/test/seckill

    

© 著作权归作者所有

共有 人打赏支持
RitaChen
粉丝 3
博文 17
码字总数 20864
作品 0
成都
高级程序员
秒杀 计数器 直播--php 实现数据库连接池、直播平台

yaf项目快速开发(兼容php7): yaf project rapid development, integration of the db action class support chain operation, support separate read and write, pdo, mysqli, mongo, up......

qieangel
2015/09/07
11.5K
3
PHP秒杀系统 高并发高性能的极致挑战

先说一下体会,这个老师讲的算是比较慢的了,而且语义化的地方很多,我推荐大家睡觉的时候听,老师主要时讲解代码,大家可以看一遍代码,然后就听就行了,我这样学习就是享受啊,因为我眼睛一...

含笑666
06/06
0
0
都在讨论秒杀,大家实现秒杀的思路是什么呢?

我的思路是 某种产品秒杀N个 1、秒杀前,在redis中存入n条数据,包含id和对应产品的id,形成一个待秒杀产品队列 2、用户抢到一个,就pop出去一个,在这个出队的数组中加入用户的uid,存入一个...

悠悠知我心
2015/11/10
646
3
阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式。不仅可以给平台带来用户量,还可以提高平台知名度。一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升...

xqtesting
2017/12/07
0
0
阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

摘要:本文介绍如何使用阿里云redis搭建一个高性能的电商秒杀系统。 背景 秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式。不仅可以给平台带来用户量,还可以提高平台知名度。一个好...

阿里云云栖社区
2017/12/06
0
0
秒杀场景下MySQL的低效原因和改进

在「中国数据库技术大会」上,淘宝 share了「秒杀场景下MySQL的低效」,详细分析了秒杀的技术难点及改进措施,简而言之,主要就是在高并发事务请求的情况下,数据库性能由于死锁检测等因素直...

平江夜弹
2016/01/05
821
0
redis_简单秒杀_watch事务

简单秒杀 <?php header("content-type:text/html;charset=utf-8"); $redis = new redis(); $result = $redis->connect('127.0.0.1', 6379); $watchkey = $redis->get("watchkey"); $robtotal......

喵王不瞌睡
2016/03/31
85
0
JavaWeb秒杀业务场景设计

秒杀业务场景设计问题经常被面试的时候被问到,在实际业务中,也常常需要实现,下面我们来看看如何实现秒杀业务. 秒杀业务,是典型的短时大量突发访问类问题 特点: 秒杀时网站的访问量大增; 秒杀...

小红牛
06/11
0
0
redis,memcached

redis可以做分布式 memcached不能 mangodb是一个分布式数据库,可以存json串,是nosql类型 redis是缓存服务器,但是用成数据库服务器了 因为是放在内存中,所以内存消耗比较大,一般128G,2...

yinxingyouyou
06/28
0
0
瞬时高并发(秒杀/活动)Redis方案

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

浩爷
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

数据库事务的四大特性以及事务的隔离级别

本篇讲述数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是...

Java大蜗牛
6分钟前
0
0
Spring Boot 整合 MyBatis/通用Mapper/PageHelper分页插件

整合MyBatis 整合通用Mapper 1. POM依赖配置 <properties><mapper.starter.version>2.0.3-beta1</mapper.starter.version></properties><!-- 通用Mapper --><dependency><groupId>t......

OSC_fly
15分钟前
0
0
CentOS7 双网卡绑定

环境 操作系统 CentOS7.5,禁用 NetworkManager 服务 网卡 eth0 网卡 eth1 绑定网卡 bond0 网卡 eth0 配置 修改 /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=EthernetBOOTPROTO=noneD......

Colben
16分钟前
0
0
zk实战--rpc框架集群化

在看此篇内容时需要浏览下面内容 netty实战--手写rpc框架 前文功能简介以及功能扩充 利用netty来实现一个点对点的rpc调用。客户端和服务端都是靠手写地址进行socket同学的,无法1对多,也无法...

xpbob
33分钟前
11
0
springboot 发送邮件

获取授权码 添加配置 # 账号和密码spring.mail.username=aaa@qq.comspring.mail.password=bbb# 服务器地址spring.mail.host=smtp.qq.comspring.mail.properties.mail.smtp.ssl.en...

阿豪boy
33分钟前
0
0
如何使用GNU Ring?

文章名:如何使用GNU Ring? 作者:冰焰火灵X 1079092922@qq.com 文章许可:CC BY-SA 4.0 ##1. 安装 下载GNU Ring 点击左边选择你的系统版本(这里以 GNU/Linux 为例,我使用的是Mint 18.3)...

ICE冰焰火灵X
36分钟前
4
0
深入理解springMVC

什么是spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而...

Java填坑之路
41分钟前
1
0
《射雕英雄传》书摘

1. 我虽是个飘泊江湖的贫家女子,可不是低三下四、不知自爱之人。你如真心爱我,须当敬我重我。我此生决无别念,就是钢刀架颈,也决意跟定了你。将来……将来如有洞房花烛之日,自然……自能...

k91191
52分钟前
1
0
解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件

最近项目中发现了一个bug,具体表现为选中模态框上datepicker组件上的日期时,会触发模态框的关闭事件,导致数据编辑无法正常进行。网上搜索了下,解决方法如下: $('.datepicker').on('hid...

Funcy1122
56分钟前
0
0
Redis分布式锁的正确实现方式

前言 分布式锁一般有三种实现方式: 1.数据库乐观锁 2.基于Redis的分布式锁; 3.基于Zookeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis...

大海201506
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部