Redis应用实践

消息队列

  • 使用list实现

  • rpush, lpop 实现

  • 客户端判断如果pop出的结果为空 可以sleep 1秒,防止连续不间断的查询浪费性能

  • 使用brpop(blocking)更好的解决上面的问题

  • 如果阻塞太久客户端会自动断开链接,所以代码要编写重试机制

延时队列

  • 使用zset实现,score存放任务的到期处理时间

  • 代码中使用zrangebyscore筛选出已到期的任务

  • 注意多线程时争抢任务的处理,拿到消息后,尝试调用rem执行删除这条消息,返回结果删除成功后才开始执行任务。

  • 优化:可以使用lua脚本将zrangebyscore和zrem变成一个原子操作,避免多次争抢的发生。