PHP消息队列实现及应用:流量削峰案列(Redis的List类型实现秒杀)

来源:互联网 发布:淘宝卖家中心客服电话 编辑:程序博客网 时间:2024/06/05 17:57

本文只能参考,切勿偏听偏信!!!

Redis中的List类型是双向链表结构,简单理解就是队列。 支持反向查找和遍历。
可以从头部或者尾部往redis列表里添加元素,这个列表最多可以支持40亿个元素,因此redis在实现一个简单轻量级的消息队列的时候非常有优势。

redis中List类型的具体使用方法:
这里写图片描述

另外还有下面这些方法:

ltrim:保留指定区间内的元素llen:获取列表长度lset:通过索引设置列表元素的值lindex:通过索引获取列表中元素的值lrange:获取列表指定范围内的元素

一个简单的秒杀应该怎么设计:
这里写图片描述

秒杀业务程序:记录是哪一个用户参与了秒杀,时间。
用户的ID存入Redis的链表里面,进行排队。
(本案例,就前10个人秒杀成功)
所以列表的长度为10就可以了,10个之后如果再往里追加数据,那么可以直接拒绝请求。

在redis存满10个之后,后面就可以有其他程序来进行取值或其他操作。
入库程序可以遍历redis里的值,然后保存到mysql中。(这个过程可以是循环扫描)

代码层设计
“`
秒杀程序把请求写入Redis(uid、time_stamp);
检查Redis已存放数据的长度,超出上限直接丢弃;
死循环处理已存入Redis的数据并入库。

数据库设计:

CREATE TABLE redis_queue (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
uid int(11) unsigned NOT NULL DEFAULT ‘0’,
time_stamp varchar(24) NOT NULL DEFAULT ” COMMENT ‘微秒时间’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我们需要2个程序:1个是把用户请求接收写入到redis中的程序;另外一个是把redis中的数据拿出来,处理存入到mysql数据库的程序。处理用户请求:

处理redis中数据参考代码: