在订单有限的情况下,多个外卖骑手需要在抢单的过程中,不会对于已经加锁的订单重复生成订单。
这时候可以里面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的解决方案如下