redis之消息队列

redis之消息队列

不建议使用redis来实现消息队里,如果对消息可靠性有较高要求的场景,应当使用MQ,rabbitMQ , kafka etc...

主要利用list数据结构

Screen Shot 2020-09-21 at 11.15.30 PM

生产者lpush,消费者rpop

blpush+brpop - 阻塞


延迟队列:

Screen Shot 2020-09-21 at 11.19.02 PM

使用zset实现

Producer:

jedis.zadd(queuekey, System.currentTimeMillis() + 5000, ???)

Consumer:

zrangebyscore key min max withscores limit 0 1 查询最早的一条任务,来进行消费

Eg:

new Thread() {
@Override
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();

问题:

消息可靠性较低

没有重试机制

没有ACK,消息是否被正常处理redis是不知道的。