前言
上一个redis应用是做分布式锁
这次看到那个用redis做队列
其实我觉得用处不是很大 毕竟市面上有非常成熟的mq 要求性能的 kafka 要求稳定性的 rabbit
redis的mq实在是没办法比 只能在做一些无关紧要的地方做队列玩玩
例如:
通过redis 队列 异步存日志
通过redis 队列 做一些提示性的推送之类的
list 实现简单的队列 (点对点)
参考之前的文章: redis深度历险-基础数据结构阅读笔记
添加元素 rpush/lpush
非阻塞模式
lpop/rpop
演示队列使用rpush/lpop 右进左出队列
1 | #添加进队列 |
队列操作类实现
1 | package com.ming.base.queue; |
队列测试用例
1 | package com.ming.base.queue; |
阻塞模式
block阻塞获取list元素 blpop/brpop 指令格式 blpop name timeout
演示队列使用 rpush/blpop 方法做队列
1 | #添加进队列 |
队列操作类实现
1 | package com.ming.base.queue; |
队列测试用例
1 | package com.ming.base.queue; |
redis的publish 和subscribe (点对多 )
redis提供一套简单的发布订阅系统 用来弥补使用list做队列无法快速做到发布订阅模式
命令 | 格式 | 备注 |
---|---|---|
publish | publish channelName message | 返回接受到消息的订阅者数量 |
subscribe | subscribe channelName | 订阅channel |
unsubscribe | unsubscribe channelName | 退订channel |
psubscribe | psubscribe channelPattern | 按照channelPattern 正则订阅符合规则的channel |
punsubscribe | punsubscribe channelPattern | 按照channelPattern规则取消订阅符合规则的channel |
pubsub | pubsub subcommand arg | 查看 发布订阅系统状态 |
- pubsub 详解
subcommand | arg | 说明 |
---|---|---|
CHANNELS | [pattern] | 返回指定模式pattern的活跃的频道,指定返回由SUBSCRIBE订阅的频道 |
NUMSUB | channel channel2 … | 返回指定频道的订阅数量 |
NUMPAT | - | 返回订阅模式的数量,注意:这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和 |
java代码示例
1 | package com.ming.base.queue; |
总结
书上还有一种用zset实现的 队列 不过我感觉没啥必要
redis的队列做一些允许误差的快方案 还是可以的
但是对队列有要求 例如速度、稳定性 有还是直接使用成熟的mq kafka或者rabbit就行