在订单有限的情况下,多个外卖骑手需要在抢单的过程中,不会对于已经加锁的订单重复生成订单。

这时候可以里面MySQL中的约束unique key去实现订单的唯一特性,即uniqkey(order_id),在表中已经存在该订单的情况下,其他外卖骑手无法再重复创建订单。

如果只是这样设计表的话,存在一个问题,就是技术和业务耦合在一起,如果需要进行拓展,需要重新设计表结构。

因此,可以设计一张锁表,专门用来管理维护业务的加锁逻辑。

表结构如下:

(id,lock_key,locked_by)

uniqkey(lock_key) lock_key唯一

(biz_type,key) 为了把业务和技术区分开来,解耦

操作:

获取锁: insert

释放锁:delete lock_key=? and locked_by=? 解铃还须系铃人

基于MySQL的unique key 解决方案优势在于事务的安全性

由于性能问题,redis提供基于redission的解决方案如下