您的位置:首页 > 数据库 > Redis

Redis入门系列之队列和发布订阅模式

2015-06-04 00:00 701 查看
一.Redis实现队列

之前说了,使用lpush 配合rpop 或者rpush配合lpop就能实现队列了.Redis提供了一个方法可以阻塞等待,如果队列里面是空的就阻塞等待.

生产者:

localhost:6379> lpush queue 5 4 3 2 1
(integer) 5

消费者:

localhost:6379> BRPOP  queue 0
1) "queue"
2) "5"
(67.95s)
localhost:6379> BRPOP  queue 0
1) "queue"
2) "4"
localhost:6379> BRPOP  queue 0
1) "queue"
2) "3"
localhost:6379> BRPOP  queue 0
1) "queue"
2) "2"
localhost:6379> BRPOP  queue 0
1) "queue"
2) "1"
localhost:6379> BRPOP  queue 0


brpop key time

time为阻塞等待的时间,0表示无限等待

队列 queue里面是空的,则会阻塞等待.由于设置的时间为无限等.

Redis在取队列的时候支持优先级.

生产者:

localhost:6379> lpush queue:1 5 4
(integer) 2
localhost:6379> lpush queue:2 2 1 0
(integer) 3

消费者:

localhost:6379> brpop queue:1 queue:2 10
1) "queue:1"
2) "5"
localhost:6379> brpop queue:1 queue:2 10
1) "queue:1"
2) "4"
localhost:6379> brpop queue:1 queue:2 10
1) "queue:2"
2) "2"
localhost:6379> brpop queue:1 queue:2 10
1) "queue:2"
2) "1"
localhost:6379> brpop queue:1 queue:2 10
1) "queue:2"
2) "0"
localhost:6379> brpop queue:1 queue:2 10
(nil)
(10.32s)

brpop后面放多个队列的时候 前面的队列优先级高.会先取出前面的队列之后在取后面的队列.

二.发布/订阅

所有订阅者都可以收到发布者的内容.也是利用redis的列表实现的.但是发布者发布的内容不会被存储下来,所以如果channel中没有订阅者,则消息直接丢失.

发布者:

localhost:6379> publish channel hi
(integer) 0

由于这个时候channel还没有订阅者,所以返回的结果是0.

订阅者:

localhost:6379> subscribe  channel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel"
3) (integer) 1

这样每次发布者发布消息之后,所有对这个channel订阅的订阅者都能收到消息.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息