热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis队列_redis实现消息队列

本实例使用thinkphp5创建数据库CREATETABLEthink_order_queue(idint(11)NOTNULLAUTO_INCREMENT,order_idint

本实例使用thinkphp5

a212e8c55d4cbaea4c09f5d93b24562a.png
63ec63d4a7775fa08a1c5f49d3d5f19d.png
122cecec0e9200f05ea199fede757856.png
6ea56e54b6f61b1a43043d583812b1b3.png
e7c09f919d9ae6a946c8c656d3392aa3.png
78bf8116eb1258551dc9f3cdf5640d06.png
68b0bef90a5a9651a407f250fd47a375.png
9786a2667d632bcce47295cb48921b35.png
97b14061f100998c869c4f9588633cf5.png

//创建数据库

CREATE TABLE `think_order_queue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL COMMENT '订单id',
`mobile` varchar(255) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '手机号',
`created_at` int(11) DEFAULT NULL COMMENT '创建时间',
`updated_at` int(11) DEFAULT NULL,
`status` tinyint(2) DEFAULT NULL COMMENT '0未处理,1已处理,2处理中',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='订单队列表';

//创建模型

namespace appcommonmodel;
use thinkModel;
class OrderQueue extends Model{
}

//生成订单

public function orderQueue(){//订单id
$order_id = rand(10000, 99999);//生成的订单信息
$insert_data = array(
'order_id' => $order_id,
'mobile' => 1857523452 . rand(1, 9),
'created_at'=> time(),
'status' => 0,
);
$result = model('order_queue')->save($insert_data);
if(!$result){
return '保存失败';
}
return "保存成功!";
}

//配送系统处理队列中的订单
public function orderProcess(){
$waiting = array('status'=>0); //未处理
$lock = array('status'=>2); //改为等待中 //处理数据更新为等待状态
$res_lock = model('order_queue')->where($waiting)->order('id asc')->update($lock);//选择更新的数据进行配送
if($res_lock){
$success = array('status'=>1, 'updated_at'=>time());
$result = model('order_queue')->where($lock)->update($success);
if(!$result){
return 'error';
}
return 'success';
}
return '处理失败';
}

9d46905120dd00f6258abf9607788898.png
ebcea3c8a766f46c5058b4ec392ef4be.png
6d027c94f0d79fb8218033e89acdba07.png
4e8a6f122081a80ba1c73dca1122fce5.png
2373fd5987914cd8cb6a8c6f3885a479.png

CREATE TABLE `redis_queue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) DEFAULT NULL,
`time_stamp` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '微秒时间戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='redis秒杀';

//thinkphp5 thinkcachedirverRedis.php默认没有lpush,lLen等方法,要自己添加

public function lLen($key){
return $this->handler->lLen($key);
}
public function lPush($key,$value){
return $this->handler->lPush($key, $value);
}
public function rPush($key,$value){
return $this->handler->rPush($key, $value);
}
public function lpop($key){
return $this->handler->lPop($key);
}
public function close(){
return $this->handler->close();
}

//接受用户请求
public function orderRedis(){//thinkphp5 redis默认没有lpush,lLen等方法,要自己添加
$redis = new cachedriverRedis();
$redis_name = "miaosha";
for($i&#61;0; $i<100; $i&#43;&#43;){
$uid &#61; rand(1000, 10000);
$num &#61; 10;//如果当天人数少于10的时候&#xff0c;则加入这个队列
if($redis->lLen($redis_name) <10){

//微秒
$redis->rPush($redis_name, $uid . &#39;%&#39; . microtime());
echo $uid . &#39;秒杀成功&#39;;
} else {//如果当天人数达到10个人&#xff0c;则返回秒杀已完成
echo &#39;秒杀已结束&#39;;
}
}
$redis->close();
}

//处理redis请求
public function redisQueue(){
$redis &#61; new cachedriverRedis();
$reids_name &#61; &#39;miaosha&#39;;//死循环
while(1){//从队列最左侧取出一个值
$user &#61; $redis->lpop($reids_name);//然后判断这个值是否存在
if(!$user || $user &#61;&#61; &#39;null&#39;){sleep(1);
exit();
}//切割事件&#xff0c;uid
$user_arr &#61; explode(&#39;%&#39;, $user);
$insert_data &#61; array(
&#39;uid&#39; &#61;> $user_arr[0],
&#39;time_stamp&#39; &#61;> $user_arr[1],
);//保存到数据库中
$res &#61; model(&#39;redis_queue&#39;)->insert($insert_data);//数据库插入失败的时候回滚机制
if(!$res){
$redis->rPush($reids_name, $user);
}sleep(1);
}//释放redis
$redis->close();
}



推荐阅读
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 我在使用Laravel 5.4时遇到了一个问题,当我发送Markdown格式的邮件时,输出结果并不如预期。以下是详细情况和解决方案。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
author-avatar
大苏打的苏打水
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有