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很棒。
分享到:
相关推荐
在实际应用中,开发者可以根据业务需求,选择合适的数据结构,利用Redis的特性优化系统性能,如使用List作为消息队列,Set实现交集、并集和差集操作,Sorted Set进行范围查询等。同时,通过监控Redis的内存使用、...
同时,Redis++也可以用于消息队列,用于异步处理任务。除此之外,Redis++也可以作为数据存储系统,用于存储结构化数据。 Redis++是一个功能强大且灵活的缓存系统,它可以满足各种应用场景的需求。通过这篇文章,...
【微服务SpringBoot整合Redis基于Redis的Stream消息队列实现异步秒杀下单】这篇文章主要讲解了如何在微服务架构中使用SpringBoot整合Redis来构建一个基于Redis Stream的消息队列,以此来实现实时、高效的异步秒杀...
在IT行业中,队列是一种常见的数据结构,尤其在处理大量并发任务或后台异步操作时,它的作用尤为重要。本文将详细探讨PHP中的队列技术,包括如何使用PHP-Redis扩展来实现高效的数据处理。 首先,PHP队列是PHP应用...
压缩包子文件列表中的“rabbitmq-server-3.7.15.exe”是RabbitMQ的安装程序,RabbitMQ是一个开源的消息代理软件,基于AMQP协议,常与Redis一起使用,构建微服务架构中的消息队列系统。当一个应用程序发送消息到...
Redis 消息队列是一种基于 Redis 数据库实现的消息传递机制,它允许生产者将消息放入队列,然后由消费者从队列中取出并处理。在分布式系统中,消息队列常用于解耦组件、实现异步处理以及提高系统的吞吐量。本文将...
5. **使用场景**:例如,当用户提交一个耗时的操作请求时,MVC应用程序可以立即返回一个响应,将任务放入Redis队列,然后后台进程处理任务,避免用户等待。 6. **代码示例**:项目可能包含如何在MVC应用程序中创建...
标题中的“Redis延时消息队列基于swoole实现的多进程消费端”是指使用Redis作为消息队列,结合Swoole的多进程特性来构建一个高效、可扩展的延迟消息处理系统。在这个系统中,Redis作为一个可靠的键值存储,用于暂存...
此外,由于Redis是单线程模型,虽然在处理并发请求时效率稍逊于多线程数据库,但其简单的架构和高效的内存管理使其在许多应用场景下仍具有显著优势,如缓存、计数器、队列服务等。在Windows环境下,Redis提供了便捷...
Laravel/Lumen 使用 Redis队列 Laravel/Lumen 框架提供了一个队列系统,允许开发者将耗时操作或高并发操作异步执行,以缓解系统压力、提高系统响应速度和负载能力。在这个系统中,Redis 可以作为队列驱动,负责存储...
**Redis入门到精通系列之九:Redis实战(六)——基于Redis队列实现异步秒杀下单测试项目代码** 在本教程中,我们将探讨如何利用Redis的队列特性来实现一个高效的异步秒杀下单系统。秒杀活动是电商、营销活动中常见的...
《Redis Queue Tool 4.1.5:Python中的队列管理利器》 Redis Queue Tool,简称RQT,是一个基于Python的高效、灵活的队列管理工具,它利用了Redis数据库的强大功能来处理任务队列。在版本4.1.5中,这个库提供了一...
在Laravel7中,Redis队列的使用是一个高效且灵活的方法来处理异步任务和后台工作。Redis是一个开源的、高性能的键值存储系统,它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,这使得它成为处理队列的...
例如,可以使用哈希存储用户信息,使用列表实现消息队列,使用有序集合进行排名等。 Redis的发布/订阅(Pub/Sub)模式允许应用程序之间进行异步通信。发布者发送消息到频道,订阅者可以监听并接收这些消息,这种...
- 消息队列:发布/订阅模式,用于异步处理任务。 - 计数器:统计网站访问次数等。 - 分布式锁:在多服务器环境中保证操作的互斥性。 - 会话存储:替代传统的文件或数据库存储用户会话。 8. **Redis 高级特性** ...
- 消息队列:通过发布订阅功能实现任务队列,处理异步任务。 - 分布式锁:通过单个键的设置和删除操作,实现跨节点的锁机制。 - 计数器:利用自增操作计数,适用于统计、排行等功能。 6. **Redis的扩展性** - *...
标题中的“基于redis实现的消息队列”指的是使用Redis这一开源数据结构存储系统来构建消息队列(Message Queue, MQ)的解决方案。Redis以其高性能、丰富的数据结构和内存存储特性,常被用作构建消息队列的底层技术。...
1. 生产者脚本:这部分代码负责创建任务,并将任务数据序列化后使用`LPUSH`命令推入Redis队列。 2. 消费者脚本:这部分代码使用`BRPOP`或`LPOP`命令持续监听队列,一旦有新消息,就执行相应的任务处理逻辑。 3. 错误...
也可以作为消息队列,实现异步处理;或者存储用户会话,提高用户体验。由于其支持主从复制和Sentinel哨兵系统,可以构建高可用的分布式环境。此外,通过Cluster集群功能,Redis还能实现数据分片,进一步提升处理能力...