Redis的队列和消息队列的区别【concept】
Redis 队列
用redis作为队列效率高,而且简单易用
使用场景
-
用于处理比较耗时的请求,例如批量发送邮件,如果直接在网触发执行发送,程序会出现耗时
-
高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台去处理这些请求
-
抢购场景,先入先出的模式
Redis 消息队列
主要应用在网络中实现异步任务,Reids可以充当消息队列实现两种模式:生产者 ->消费者,发布者->订阅者 第一种方式是一对一,后者是一对多
生产者/消费者模型
生产者模型需要存在生产者和消费者两方,而在redis中队列的存储和获取可以作为消息队列被生产者和消费者使用
生产者
redis 在其中做缓存的作用,将任放置到queue队列里面,其实redis有lpush和rpush,意思是从左边插入列队还是右边插入列队,这就是生产者部分,将任务插入指定的队列中。
消费者
简单的说就是拿出来(BRPOP,RPOP),队列是按顺序取任务的,一般是左边插入,右边取出,redis有BRPOP和RPOP,可以设置时间以秒为单位,如果队列是空的,那么先不返回,
等待一会(设置的时间【BRPOP queue 10】,等待10秒),如果在这期间有新的任务插入,那么就取出任务返回,还是没有的话,返回空。
- 订阅/发布模型
订阅/发布模型简单来说是由发布者向订阅者发送任务,同样任何订阅者都可以获取任务。
发布者使用publish channel task 来发布相关的任务,而订阅者则是使用subscribe channel,这是一个监听命令,redis会一直监听这个channel,如果发布者发布新的任务,
监听命令会返回任务,直到订阅者主动退出监听,但是redis也可以为这个设置超时,保证监听的有效性,默认如果60秒内没收到信息就异常退出,当然了这个可以配置。
Redis队列功能介绍
常用命令:
-
Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用
-
Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用
-
Brpoplpush
-
Lindex获取一个元素,通过其索引列表
-
Linsert在列表中的另一个元素之前或之后插入一个元素
-
Llen获得队列(List)的长度
-
Lpop从队列的左边出队一个元素
-
Lpush从队列的左边入队一个或多个元素
-
Lpushx当队列存在时,从队到左边入队一个元素
-
Lrange从列表中获取指定返回的元素
-
Lrem从列表中删除元素
-
Lset设置队列里面一个元素的值
-
Ltrim修剪到指定范围内的清单
-
Rpop从队列的右边出队一个元素
-
Rpoplpush删除列表中的最后一个元素,将其追加到另一个列表
-
Rpush从队列的右边入队一个元素
-
Rpushx从队列的右边入队一个元素,仅队列存在时有效
-
Redis支持php、python、c等接口