说明:网上很多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. Socket用线程池处理服务

    while(true){ try{ Socket clientSocket = serverSocket.accept(); new Thread(new HandlerThread(clientSo ...

  2. Linux的基础命令, django的安装与使用

    一. Linux一些基础指令 cat命令, 用于查看纯文本文件(常用于内容较少的) cat 校花的故事.txt # 查看文件 cat -n 校花的故事.txt # 查看文件并显示行号 -n 显示行号 ...

  3. java、二维数组详解!

    /* java 二维数组的概念 使用方法! 1.什么是二维数组? 答案:数组的数组! 他的每一个元素都是数组!二维数组是(存储一维数组的)一维数组. 2.如何定义?(以二维数组为列) int arr[ ...

  4. 十、docker扩展

    一.memcached docker pull memcached docker run --name my-memcache -d -p 11211:11211 memcached telnet 1 ...

  5. 【python练习题】程序13

    #题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153= ...

  6. C 语言-----字符串和输入输出函数

    在C语言中,没有字符串类型,那它是怎么表示字符串呢? 由于字符串是一系列单个字符的组合,所以它用char 类型的数组来表示字符串,在数组中,一个数组元素存放一个char类型字符. ]; name 变量 ...

  7. codevs2822

    解题思路: tarjan缩点后算出度为0的点有几个,如果只有一个且这个点为爱心天使就行了: #include<iostream> #include<algorithm> #in ...

  8. PlaNet,使用图像输入来学习世界模型

    Google AI团队与DeepMind合作,上周宣布了一个名为PlaNet的新的开源“Deep Planning”网络. PlaNet是一个人工智能代理,它只使用图像输入来学习世界模型,并使用这些模 ...

  9. 炎黄流程中改流程节点颜色的js

  10. CF1106F Lunar New Year and a Recursive Sequence

    题目链接:CF1106F Lunar New Year and a Recursive Sequence 大意:已知\(f_1,f_2,\cdots,f_{k-1}\)和\(b_1,b_2,\cdot ...