redis的brpop简单使用

来源:互联网 发布:做微信小视频的软件 编辑:程序博客网 时间:2024/06/06 03:06

redis作为消息队列,已经在许多互联网公司推广开了,相比memcacheq更加丰富的数据结构和功能当然是它备受青睐的主要原因。redis的安装不用赘述,安装完毕后有redis-server和redis-cli两个工具可用,一个服务器端一个客户端。然后接着安装php的扩展。

我在网上找了几个php的扩展,安装使用都不是很方便,没有做具体功能与性能的比较,就随便找了个用C实现的扩展来试试吧

git clone https://github.com/owlient/phpredis.git

cd phpredis

phpize

./configure & make & make install

编辑php.ini添加对redis.so的扩展支持(这个链接下面有扩展包和测试用例),我们来运行几组测试吧:

<?php        $r = new Redis();        $r->connect("127.0.0.1", 6379);        $r->set("key1","ciaos");        $r->set("key2","penjin");        $res = $r->mget(array("key1","key2"));        var_dump($res);/*array(2) {  [0]=>  string(5) "ciaos"  [1]=>  string(6) "penjin"}*/?>
我看这个扩展对redis的命令支持得都不错,可惜项目不是很活跃,不过基本的功能都和官方命令一样的。我们就来测试一下brpop的效果吧,首先模拟一个消息的“生产者”

<?php        $r = new Redis();        $r->connect("127.0.0.1", 6379);        $r->lpush("msg","Hello ciaos");        $r->lpush("msg","Hello penjin");?>
然后模拟一个消息的消费者,而redis-server则充当中间的消息队列(我这里当然用的是redis的list类型)

<?php        $r = new Redis();        $r->connect("127.0.0.1", 6379);        $res = $r->brpop("msg",0);        var_dump($res);?>
很简单,brpop的意思是在消息队列尾阻塞地取出消息,参数0表示一直阻塞下去直到有消息在msg这个list中,我们可以指定一个数字代表过期时间。首先运行消费者,可以看到程序阻塞了,然后运行“生产者”,则消费者输出了消息如下:

[root@fedora lib]# php consumer.php array(2) {  [0]=>  string(3) "msg"  [1]=>  string(11) "Hello ciaos"}
lpush操作和brpop操作也保证了队列的先进先出,如果用blpop则会看到输出的是"Hello penjin"(第二条消息)。

其中brpop还可以指定监测多个消息队列,直到有任意一个消息队列中有待处理消息时阻塞返回,感觉还是比较简单易用的。redis的list消息队列没有优先级的概念,所有消息都只能先进先出或者后进先出,要实现优先级,可以考虑使用set数据结构。

下面整理一些网上说到的redis的应用场景:

  1. 作为缓存使用,提供比memcached更加丰富的数据结构和功能
  2. 使用list可以构造队列系统(如上面的简单的消息队列),使用sorted set可以构造带优先级的队列系统
  3. 计数器应用,redis的操作都是原子性的,不必担心memcache中操作数据存在的不一致的隐患
  4. 排行榜应用,tag消息系统等
原创粉丝点击