www.fltk.net > REDIS实现定长队列

REDIS实现定长队列

redis只能负责数据的存储,对于队列的维护,还得自己代码操作比如你自己定义一个队列长度、队列放到redis中,自己实现定长队列操作

redis设计用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列,它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列;另外,做消息队列的其他特性例如FIFO(先入先出)也很容易实现,只需要一个list对象从头取数据,从尾部塞数据即可;redis能做消息队列还得益于其list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口,它们都是阻塞版的,所以可以用来做消息队列.

redis只是提供一个高性能的、原子操作的分布式队列实现.具体的业务还是得需要你自己定制.你的需求实际上是一个变形的生产者-消费者实现.对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,这跟用不用redis其实没有多大的关系.一般的实现方法是你需要将用户的请求封装成一个Task,然后将这个Task再push到redis队列,然后后端的worker.php完全可以多进程、多线程的并发处理Task并将处理结果回调给请求方.这里唯一麻烦点的就是这个Task的设计,需要能够包含请求信息(请求内容,请求方标识等等).

具体的业务还是得需要你自己定制.你的需求实际上是一个变形的生产者-消费者实现.对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,这跟用不用redis其实没有多大的关系.一般的实现方法是你需要将用户的请求封装成一个task,然后将这个task再push到redis队列,然后后端的worker.php完全可以多进程、多线程的并发处理task并将处理结果回调给请求方.这里唯一麻烦点的就是这个task的设计,需要能够包含请求信息(请求内容,请求方标识等等).

现在的项目,都是部署在多个服务器,或者多个IP上,而且前台经由F5分发,所以用户的请求究竟落在那一台的服务器上,是无法确定的.对于项目中,有一秒杀设计,刚开始没有考虑到这种部署,同时也是使用最容易处理的方式,直接给数据

“消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器.

方法如下:[php]viewplaincopyprint?$redis=newRedis();$redis->connect('127.0.0.1',6379);while(1){try{$value="value_".time();$redis->LPUSH('key1',$value);echo$value."\n";sleep(rand(1,3));}catch(Exception$e)

首先来说一下我要实现的功能:类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时方便,而且所有的消息有优先级,也会有定时发送(如果同一时间消息过多,则

在列表中的另一个元素之前或之后插入一个元素Llen获得队列(List)的长度Lpop从队列的左边出队一个元素Lpush从队列的左边入队一个或多个元素Lpushx当队列存在时,从队到左边入队一个元素Lrange从列表中获取指定返回的元素Lrem从列表中删除元素

PHP 版本简易实现将消息加入优先级的队列,将1,2替换为时间就是定时发送的队列了1 $redis = new Redis();2 $redis->connect('127.0.0.1', 6379);3 $redis->zAdd('zset1', 1, 'message');4 $redis->zAdd('zset1', 2, 'message2');从队列中取出数据1

网站地图

All rights reserved Powered by www.fltk.net

copyright ©right 2010-2021。
www.fltk.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com