Redis应用实践
消息队列
使用list实现
rpush, lpop 实现
客户端判断如果pop出的结果为空 可以sleep 1秒,防止连续不间断的查询浪费性能
使用brpop(blocking)更好的解决上面的问题
如果阻塞太久客户端会自动断开链接,所以代码要编写重试机制
延时队列
使用zset实现,score存放任务的到期处理时间
代码中使用zrangebyscore筛选出已到期的任务
注意多线程时争抢任务的处理,拿到消息后,尝试调用rem执行删除这条消息,返回结果删除成功后才开始执行任务。
优化:可以使用lua脚本将zrangebyscore和zrem变成一个原子操作,避免多次争抢的发生。