使用redis把队列的异步返回改成同步 - 队列使用

标签: redis 队列 异步 | 发表时间:2018-01-24 11:16 | 作者:
出处:http://www.iteye.com
web编程开发中,会遇到资源争用的情况。举例:

有多个商品,商品抢单,每个商品都有数量限制。

但凡遇到此类问题,自古以来,就有两种解决方式:1、使用锁,2、使用队列。
使用任意一个就可以。

使用队列的方式最为简单,不考虑加锁。也无需使用数据库的锁。

把所有的请求都放入队列,然后把队列处理的结果返回给客户端。
如果商品太多,可以按商品大类分成多个队列。这样处理速度快些。

现在的问题是:队列是异步返回的,怎么办呢?

构思场景,进程A处理web请求,进程B是队列,进程C是监听队列的守护进程。
简单的做法是:A把请求放入队列,然后进程C处理好直接异步通知客户端,但这得有nodejs之类的长连接帮助。因为要推送。

所以使用如下方案解决:
使用redis把队列的异步返回改成同步
添加redis守护进程D。

web请求进程A:
创建一个随机数random。
把处理消息发给队列,但是把random加入到消息里。
使用 $result =  $redis->blPop("chan-1",30);// 30秒是等待时间,

BLPOP是列表的阻塞式(blocking)弹出原语。

它是LPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BLPOP命令阻塞,直到等待超时或发现可弹出元素为止。

然后只要从$result中获取进程C的返回即可。

守护进程C:
把rendom从消息中取出,处理整条消息,得到结果。
然后把结果放到以random为键名称的redis的列表里。即可。

$redis->lPush('random键', '处理结果');











已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [redis 队列 异步] 推荐:

使用redis把队列的异步返回改成同步 - 队列使用

- - ITeye博客
web编程开发中,会遇到资源争用的情况. 有多个商品,商品抢单,每个商品都有数量限制. 但凡遇到此类问题,自古以来,就有两种解决方式:1、使用锁,2、使用队列. 使用队列的方式最为简单,不考虑加锁. 把所有的请求都放入队列,然后把队列处理的结果返回给客户端. 如果商品太多,可以按商品大类分成多个队列.

redis作为消息队列的使用

- - ITeye博客
在redis支持的数据结构中,有一个是集合list. 对List的操作常见的有lpush  lrange等. 在这种常见的操作时,我们是把集合当做典型意义上的‘集合’来使用的. 往往容易被忽视的是List作为“队列”的使用情况. 反编译redis的jar包,会发现:.  pop意为“弹”,是队列里的取出元素.

用redis实现支持优先级的消息队列

- - 企业架构 - ITeye博客
用redis实现支持优先级的消息队列. 系统中引入消息队列机制是对系统一个非常大的改善. 例如一个web系统中,用户做了某项操作后需要发送邮件通知到用户邮箱中. 你可以使用同步方式让用户等待邮件发送完成后反馈给用户,但是这样可能会因为网络的不确定性造成用户长时间的等待从而影响用户体验. 有些场景下是不可能使用同步方式等待完成的,那些需要后台花费大量时间的操作.

【使用Redis构建任务队列】 | bboyjing's blog

- -
本章节将学习如何使用Redis来构建任务队列,实现类似RabbitMQ之类的消息队列的功能. 依然使用之前虚构的例子,现在来实现通过电子邮件来订阅商品交易市场中已售出的商品的相关信息. 因为对外发电子邮件可能会有非常高的延迟,甚至可能会出现发送失败的情况,所以将使用任务队列来记录邮件的收信人以及发送邮件的原因,并构建一个可以在邮件发送服务器运行变得缓慢的时候,以并行方式一次发送多封邮件的工作进程.

JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)

- - 企业架构 - ITeye博客
MySQL到Redis数据复制方案. 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略.

Redis 负载监控——redis-monitor

- - ITeye资讯频道
redis-monitor是一个Web可视化的 redis 监控程序. 使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等. 实时的消息处理信息,例如处理 command 数量、连接总数量等. 内存占用、 cpu 消耗实时动态图表.

Redis 起步

- - 博客园_首页
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章:. Redis是一个key-value存储系统. 和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型.

redis 配置

- - 谁主沉浮
# 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写). # 内存配置大小写是一样的.比如 1gb 1Gb 1GB 1gB. # daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes. # 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址.

Cassandra代替Redis?

- - Tim[后端技术]
最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例. 而这篇 百万用户时尚分享网站feed系统扩展实践文章则提到了Fashiolista和Instagram从Redis迁移到Cassandra的案例. 考虑到到目前仍然有不少网友在讨论Redis的用法问题,Redis是一个数据库、内存、还是Key value store?以及Redis和memcache在实际场景的抉择问题,因此简单谈下相关区别.

redis 部署

- - CSDN博客云计算推荐文章
一、单机部署 tar xvf redis-2.6.16.tar.gz cd redis-2.6.16 make make PREFIX=/usr/local/redis install  #指定安装目录为/usr/local/redis,默认安装安装到/usr/local/bin. # chkconfig: 2345 80 10       #添加redhat系列操作系统平台,开机启动需求项(运行级别,开机时服务启动顺序、关机时服务关闭顺序) # description:  Starts, stops redis server.