redis实现有序的消息队列
2015-09-07 23:32
721 查看
转载地址:http://www.cnblogs.com/haython/p/3529112.html
redis是什么东西就不多说了,网上文章一搜一大堆。
首先来说一下我要实现的功能:
类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时方便,
而且所有的消息有优先级,也会有定时发送(如果同一时间消息过多,则会有延迟)
思路:
首先一个是将这两个分为两个队列来实现, 一个用来实现消息优先级,一个来实现定时发送
用的是redis的有序集合,用zadd添加时,将score比做是优先级,也可以用时间戳来当做score,用来表示时间
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
$redis->zRevRangeByScore('zset1, '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,20)));
这条语句表示从zset1这个队列里按照score从最大(+inf)到最小(-inf)的排序中取出20条,不带score,如果想要从小到大可以用 zRangeByScore
如果你想让这些都运行在命令行下,可以参考下面来,当然这些是经过删减的
1 <?php
2
while (true) {
3
$pid = pcntl_fork();
4
if ($pid == -1) {
5
echo date('Y-m-d H:i:s') . "fork失败!\n";
6 }
else if ($pid == 0) {
7
$redis = new Redis();
8
$redis->connect('127.0.0.1', 6379);
9
$redis->zRevRangeByScore('zset1', '+inf', '-inf',
array('withscores'=>false, 'limit'=>array(0,20)));
10
exit;
11 }
else {
12 pcntl_wait($status);
13 }
14 }
pcntl_fork是PHP中的生成子进程,当调用该函数时,会返回一个进程pid,当pid为0时表明是在子进程中,所以把要执行的东西全放这里
redis是什么东西就不多说了,网上文章一搜一大堆。
首先来说一下我要实现的功能:
类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时方便,
而且所有的消息有优先级,也会有定时发送(如果同一时间消息过多,则会有延迟)
思路:
首先一个是将这两个分为两个队列来实现, 一个用来实现消息优先级,一个来实现定时发送
用的是redis的有序集合,用zadd添加时,将score比做是优先级,也可以用时间戳来当做score,用来表示时间
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
$redis->zRevRangeByScore('zset1, '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,20)));
这条语句表示从zset1这个队列里按照score从最大(+inf)到最小(-inf)的排序中取出20条,不带score,如果想要从小到大可以用 zRangeByScore
如果你想让这些都运行在命令行下,可以参考下面来,当然这些是经过删减的
1 <?php
2
while (true) {
3
$pid = pcntl_fork();
4
if ($pid == -1) {
5
echo date('Y-m-d H:i:s') . "fork失败!\n";
6 }
else if ($pid == 0) {
7
$redis = new Redis();
8
$redis->connect('127.0.0.1', 6379);
9
$redis->zRevRangeByScore('zset1', '+inf', '-inf',
array('withscores'=>false, 'limit'=>array(0,20)));
10
exit;
11 }
else {
12 pcntl_wait($status);
13 }
14 }
pcntl_fork是PHP中的生成子进程,当调用该函数时,会返回一个进程pid,当pid为0时表明是在子进程中,所以把要执行的东西全放这里
相关文章推荐
- redis常用命令笔记
- Ubuntu下 Redis安装
- redis基础命令(下)
- Spring整合Redis
- redis常用命令
- Redis中连接池使用的相关问题
- scala链接redis
- redis集群部署搭建
- redis 学习路线
- redis linux安装 [adlist.o] Error jemalloc/jemalloc.h: No such file or directory
- 在Ubuntu 14.04 64bit上安装redis 3.0.3
- Redis安装与基本配置
- Linux 下 安装Redis
- Redis学习笔记(六)--消息通知
- You need tcl 8.5 or newer in order to run the Redis test
- java对redis的基本操作
- Redis学习笔记(五)--排序
- Redis学习笔记(四)--过期时间
- 用Redis存储Tomcat集群的Session
- windows 下 redis 安装配置