解决高并发订单redis死锁烦恼(高并发订单redis死锁)
随着全球电商行业的快速发展,越来越多的商家都纷纷选择在线运营,因此订单量也大幅度提升。但传统的订单服务及数据库不能有效解决瞬时高并发带来的容量压力,也不能满足处理订单服务快速响应需求,很多运营商陷入了死锁烦恼之中。
死锁是指在多线程环境下,当其他线程持有而自己又需要持有的资源时,导致自己无法把自己的操作完成的情况的情况--由于其它线程持有某种资源,而当前线程运行下去也无法释放独占的资源,从而进入一种无法推进的状态,形成循环等待。
Redis是一个红色数据库,用于存储键值对。它具有快速,健壮,可扩展等特点,可以有效解决高并发订单redis死锁问题。
首先,通过Redis中构建消息队列,将同步处理的单子以此推入队列,再用一定的策略把消息拉出来处理,这样做的好处在于,不同的工作可以给队列发布不同的消息,同时进行处理,有效降低了耗时,同时也提高了系统的并发能力。
其次,为了解决死锁问题,可以使用watch+multi/exec机制,即使用watch监控一组键,在发出exec之前,如果发现watch的键发生变化,那么exec会失败,此时不会写入数据库,可以重新再来一次,减少写入时出现异常问题与死锁的可能性。
再者,可以尝试使用异步任务来完成订单处理,即将处理订单的操作异步发布出去,外部的程序请求获取消息和结果。这样做的好处在于,用户不用阻塞在等待操作完成,可以立即返回,非常好的缓解了瞬时高并发带来的压力,同时可以有效降低死锁的发生。
由此可见,遇到高并发订单Redis死锁问题,可以通过构建消息队列,使用watch+multi/exec机制,采用异步任务等多种方式,来解决高并发订单Redis死锁烦恼。
// 使用watch+multi/exec机制:
client.watch('key')client.get('key', (err, value) => {
const multi = client.multi() multi.set('key', value + 1)
multi.exec((err, results) => { // 用戶的操作
})})
// 使用异步任务:// 把要处理的任务发布上去
client.rpush('tasks', JSON.stringify(task)) // 将处理结果返回
client.lpop('results')