说明:网上很多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. Django--CRM-客户列表展示, 分页

    一 . 客户列表展示 为了插入数据方便,我们可以用django里面的admin插入数据 创建超级用户 把语言改成中文 结果: 列表展示 展示不同字段的方式: # 有需要的可以写 def__str__( ...

  2. 错误模块名称: KERNELBASE.dll

    部署win服务时,经常会出现类似下面的错误,错误模块名称: KERNELBASE.dll. 日志名称:          Application 来源:            Application ...

  3. MySQL列类型选择

    比如年龄这个字段可以使用  1990-03-15  也可以用  19900315表示在列类型上可以选择 char 和 int:如果一个字段可以选择多种类型,尽量选择一个更快的类型:字段类型优先级   ...

  4. ES 6 系列 - Proxy

    Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以是一种“元编程”,即对编程语言进行编程. 简单地理解,就是在目标对象之前假设一层“拦截”,外界对改对象的访问,都必须先通过这层拦截 ...

  5. How to create ISO on macOS

    hdiutil makehybrid -iso -joliet -o test1.iso /users/test/test1

  6. servlet篇 之 servlet的访问

    三:servlet的访问 使用web.xml文件中的这个<url-pattern>标签中的映射路径,来访问servlet 6.1 在浏览器的地址栏中,直接输入servlet映射的路径来访问 ...

  7. Nginx geo模块

    geo 模块默认编译进nginx 可以通过--without-http_geo_module禁用 Syntax: geo [$address] $variable { ... } Default: — ...

  8. js 异步代码

    这段时间一直在用node.js做毕设的后台,所以需要一些异步代码操作,主要的异步方式有:Promise.Generator 和 async / await,但下面主要讲 Promise 和 async ...

  9. 我踩过的Alwayson的坑!

    最近被sql server Alwayson高可用组和读写分离,弄得神魂颠倒,身心俱疲.遇到了下面一些问题,提醒自己也给后来人做些记录. EntityFramework支不支持Alwayson? 起因 ...

  10. kubernetes 编排详解 挂载

    ##kube挂载本地磁盘apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: re ...