说明:网上很多redis秒杀系统的文章,看的都是一头雾水,然后自己来实现一个,也方便以后自己学习

实现的方式是用的redis的list队列,框架为laravel

核心部分为list的pop操作,此操作为原子性,即使很多用户同时到达,也是依次执行

示例:

<?php
/**
* Created by PhpStorm.
* User: chenyRain
* Date: 2018/5/28
* Time: 11:36
*/ namespace App\Http\Controllers; use Illuminate\Support\Facades\Redis; class RedisController extends Controller
{
public $user_number = 50; // 允许进入队列的人数 /**
* 这个方法,相当于点击进入商品详情页,开启秒杀活动
*/
public function index()
{
$goods_number = 10; // 商品库存数量为10 if (! empty(Redis::llen('goods_name'))) {
echo '已经设置了库存了';
exit;
} // 初始化
Redis::command('del', ['user_number', 'success']); // 将商品存入redis链表中
for ($i = 1; $i <= $goods_number; $i++) { // lpush从链表头部添加元素
Redis::lpush('goods_name', $i);
} // 设置过期时间
$this->setTime(); // 返回链表 goods_name 的长度
echo '商品存入队列成功,数量:'.Redis::llen('goods_name');
} public function setTime()
{
// 设置 goods_name 过期时间,相当于活动时间
Redis::expire('goods_name', 120);
} /**
* 这个方法,相当于点击 抢购 操作
*/
public function start()
{
$uid = mt_rand(1, 99); // 假设用户ID // 如果人数超过50,直接提示被抢完
if (Redis::llen('user_number') > $this->user_number) {
echo '遗憾,被抢完了';
exit;
} // 获取抢购结果,假设里面存了uid
$result = Redis::lrange('success', 0, 20);
// 如果有一个用户只能抢一次,可以加上下面判断
if (in_array($uid, $result)) {
echo '你已经抢过了';
exit;
} // 将用户加入队列中
Redis::lpush('user_number', $uid); // 从链表的头部删除一个元素,返回删除的元素,因为pop操作是原子性,即使很多用户同时到达,也是依次执行
$count = Redis::lpop('goods_name');
if (! $count) {
echo '被抢完了';
exit;
} $msg = '抢到的人为:'.$uid.',商品ID为:'.$count;
Redis::lpush('success', $msg);
echo '公司拟,抢到了';
} /**
* 查看抢到结果
*/
public function result()
{
$result = Redis::lrange('success', 0, 20);
dd($result);
}
}

说明一下:

  1、首先运行index方法设置商品库存,并初始化结果队列和用户队列

  2、运行start方法来抢购

下面配上ab测试结果

附上抢到的人名单

laravel基于redis实现的一个简单的秒杀系统的更多相关文章

  1. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  2. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  3. Linux下一个简单的日志系统的设计及其C代码实现

    1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...

  4. Linux内核分析-构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel C ...

  5. Linux内核分析——构造一个简单的Linux系统MenuOS

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...

  6. 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...

  7. Linux内核设计第三周——构造一个简单的Linux系统

    Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...

  8. 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...

  9. 第三节 构造一个简单的Linux系统MenuOS——20135203齐岳

    第三节 构造一个简单的Linux系统MenuOS By 20135203齐岳 Linux内核源代码 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相 ...

随机推荐

  1. python爬虫之pandas

    一.简介: Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模 ...

  2. div中的相对定位与绝对定位

    1.position:relative; 如果对一个元素进行相对定位,首先它将出现在它所在的位置上.然后通过设置垂直或水平位置,让这个元素“相对于”它的原始起点进行移动.(再一点,相对定位时,无论是否 ...

  3. nginx反向代理(动静分离)

    使用反向代理(动静分离)可以让nginx专注静态内容,把动态请求交给apache来处理,发挥各自的优势,而且整个架构更加清晰: 这里假设你已经搭建好了nginx环境; 为了简单起见,就不用源码编译安装 ...

  4. Web API 2 自定义默认Identity Table Name

    One of the first issues you will likely encounter when getting started with ASP.NET Identity centers ...

  5. poj-2823(单调队列)

    题意:给你长度位n的数组,问每个长度为m的段的最值: 解题思路:这道题是单调队列的入门题: #include<iostream> #include<algorithm> #in ...

  6. 三星Galaxy S10可望率先应用于1TB的手机内存

    导读 三星电子(Samsung Electronics)1月30日宣布,已经开始量产业界首款容量高达1TB的嵌入式通用闪存存储器(embedded Universal Flash Storage,eU ...

  7. 简单聊聊Linux学习经历

    学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为了提升自己各方面的能力 ...

  8. HTML5-Video视频-基础篇

    展示视频 视频 <video width=" controls="controls"> <source src="movie.mp4" ...

  9. ☆ [POJ1021] Intervals 「差分约束」

    传送门 >Here< 题意:给出N段区间,并告诉你每段区间里有几个数(一个位置只能放一个数) 问总共至少有几个数 解题思路 差分约束题,本蒟蒻也是第一次做差分约束题…… 所谓差分约束,常常 ...

  10. Linux mount BSD disk partition

    Linux mount BSD disk partition 来源 https://www.cnblogs.com/jhcelue/p/6858159.html 假设须要从第二块硬盘复制文件.该硬盘格 ...