redis之消息队列
redis之消息队列
不建议使用redis来实现消息队里,如果对消息可靠性有较高要求的场景,应当使用MQ,rabbitMQ , kafka etc...
主要利用list数据结构
生产者lpush,消费者rpop
blpush+brpop - 阻塞
延迟队列:

使用zset实现
Producer:
jedis.zadd(queuekey, System.currentTimeMillis() + 5000, ???) |
Consumer:
zrangebyscore key min max withscores limit 0 1
查询最早的一条任务,来进行消费
Eg:
new Thread() {
public void run() {
while (true) {
Set<String> resultList;
// 只获取第一条数据, 只获取不会移除数据
resultList = jedis.zrangebyscore(key, System.currentTimeMillis(), 0, 1);
if (resultList.size() == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
} else {
// 移除数据获取到的数据
if (jedis.zrem(key, resultList.get(0)) > 0) {
String orderId = resultList.get(0);
log.info("orderId = {}", resultList.get(0));
this.handleMsg(orderId);
}
}
}
}
}.start();
new Thread() { |
问题:
消息可靠性较低
没有重试机制
没有ACK,消息是否被正常处理redis是不知道的。