web编程开发中,会遇到资源争用的情况。举例:
有多个商品,商品抢单,每个商品都有数量限制。
但凡遇到此类问题,自古以来,就有两种解决方式:1、使用锁,2、使用队列。
使用任意一个就可以。
使用队列的方式最为简单,不考虑加锁。也无需使用数据库的锁。
把所有的请求都放入队列,然后把队列处理的结果返回给客户端。每次都查询商品的剩余数量是否为0,为0就拒绝请求。
如果商品太多,可以按商品大类分成多个队列。这样处理速度快些。
现在的问题是:队列是异步返回的,怎么办呢?
构思场景,
进程A处理web请求(会同时有多个类似A的进程出现),进程B是队列,进程C是监听队列的守护进程。
简单的做法是:A把请求放入队列,然后进程C处理好直接异步通知客户端,但这得有nodejs之类的长连接帮助。因为要推送。
所以使用如下方案解决:
使用redis把队列的异步返回改成同步
1、添加redis守护进程D。
新的场景:进程A处理web请求(会同时有多个类似A的进程出现),进程B是队列,进程C是监听队列的守护进程。进程D是redis。
2、web请求进程A:
创建一个随机数random。
把处理消息发给队列,但是把random加入到消息里。
使用 $result = $redis->blPop(random, 30);// 30秒是等待时间,
$redis->delete(random); // 取出消息后,这个键就没用了。
BLPOP是列表的阻塞式(blocking)弹出原语。
它是LPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BLPOP命令阻塞,直到等待超时或发现可弹出元素为止。
然后只要从$result中获取进程C的返回即可。
3、守护进程C:
把rendom从消息中取出,处理整条消息,得到结果。
然后把结果放到以random为键名称的redis的列表里。即可。
$redis->lPush(random, '处理结果');//这句话执行完后,进程A的blPop方法会立刻返回!
4、缺点:
此方案没什么缺点,只有队列本身的缺点,就是如果并发请求太多,处理不过来,则客户端需要等。
解决方案就是添加多个队列,添加多个守护进程处理队列,守护进程和队列也可以分布在不同的服务器。
5、优点:
超级简单,redis很棒。
分享到:
相关推荐
资源微服务SpringBoot整合Redis基于Redis的Stream消息队列实现异步秒杀下单知识分享
3-2 Redis队列秒杀实现 (14:29) 第4章 RabbitMQ:更专业的消息系统实现方案 以RabbitMQ为例讲解了一些专业消息系统的原理,并使用官方的DEMO,演示其中的一个模块的使用方法。了解这类消息系统使用的步骤和应用场景...
测试项目代码
这是一个可以扩展的队列处理程序,没有使用框架。我们的项目使用Yii的框架,所有这里的测试示例就按照Yii的方式来编写的。
1、异步队列处理 2、redis 过滤(就是只处理当天第一次请求) 3、redis 辅助存储app名称(验证过后批量插入数据app名称表中) 4、拼接插入的以及新增的如详细表中 解决办法: 1、接口修改 redis 过滤 + 如l
消息队列:Redis支持发布/订阅模式,可用于事件驱动架构,实现异步消息传递。 缺点 复杂性:引入Redis增加了系统的复杂性,需要考虑数据一致性、部署维护等问题。 成本:部署和维护Redis需要额外的成本和资源。 无...
1.redis 和 memcached 什么区别?为什么高并发下有时单线程的 redis 比多线程的memcached 效率要高? 2.redis 主从复制如何实现的?...14.使用 Redis 做过异步队列吗,是如何实现的 15.Redis 如何实现延时队列
redis异步任务 interface.php <?php for($i=0;$i<100 xss=removed xss=removed>connect(127.0.0.1); $redis->publish(test,$msg); $redis->close(); } handler.php <?php $redis = new Redis(); $redis->...
Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步...
Redis流队列 Redis流v5 +上的消息队列。 redis v5 +流,ES6 __keyevent@5__:expired保证__keyevent@5__:expired消息( __keyevent@5__:expired )不丢失 采用ES6 +异步/等待+面向对象设计 达到易读懂,方便修改。 ...
把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2).建议定时任务入队列 3)创建定时任务出队列 文件:demo.php插入数据到redis...
概述2.数据类型3.持久化4.过期键的删除策略5.内存相关6.线程模型7.事务8....使用Redis做过异步队列吗,是如何实现的 Redis如何实现延时队列 Redis回收进程如何工作的? Redis回收使用的是什么算法?
Excel_To_DB 一款将Excel表格中的数据导入至数据库中的小工具,SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库 详细介绍:
【实例简介】 C# StackExchange.Redis 操作封装类库,分别封装了Redis五大数据结构(String,Hash,List,Set,ZSet)的增删改查的操作方法,支持Async异步操作。支持Redis分库操作。...包括Redis队列操作测试
thorns 是一个 Python 开发的分布式异步队列系统。 运行流程 启动redis内存服务器,作为队列存储数据库使用 配置芹菜(celery)运行环境,并连接redis队列内存
Java实现消息队列,异步队列、延迟队列、死信队列、各种异常逻辑处理。 完全开源、自主研发,实际项目中使用验证,功能稳定,性能优,部署时集成Redis即可。 基于springboot框架,启动快,各种容错,占用内存资源少
它使用Redis作为队列系统,并使用Docker轻松创建容器。 生产者在队列中添加工作描述,如下所示: { " type " : " print " , " name " : " nameOfTheJob " , " params " : { " text " : " Hello world " } } ...
AsyncMailSend Desc: 基于Redis消息队列实现的异步化框架,将页面注册与邮件发送解耦,实现在注册成功后异步发送邮件的功能。 运行项目的时候: 需先开启Redis服务。
事件队列CPU网络1-req2-req3-req 1-execdruration 11-rep2-execdruration 22-execdruration