并发编程之redis分布式锁

2021-04-15  本文已影响0人  凌晨的咸鱼

基于redis实现的锁机制,主要是依赖redis自身的原子操作(因为redis是单线程)。

可能发生的问题:

  final String script = "if redis.call(\"get\",\"" + lock + "\") == \"" + uid + 
                      "\"then  return redis.call(\"del\",\"" + lock + "\") else return 0 end ";
  jedis.eval(script);
  这段lua脚本是用c语言写的,redis在调用的时候判断和删除是原子操作。

redis分布式锁的优化(例如秒杀库存系统 -> 快并且准):

场景:客户下单 -> 拿到redis分布式锁 -> 查询库存(库存充足) -> 下单 -> 生成订单或者扣款等 -> 减库存 -> 解锁
假设从拿锁到解锁之间需要20毫秒,那么一秒钟只能下单50个。

解决方案1:

使用分段锁,例如把1000个库存平分在10个字段中,每个库存100个,可以使用随机算法去访问这10个库存段,每个下单流程和上面场景中一样,这样就差不多能提高10倍性能,参考:(https://zhuanlan.zhihu.com/p/268290754?utm_source=wechat_session)

解决方案2:

个人想法,可以使用生产者消费者模式,先把总库存容量塞进队列容量1000,每次有订单过来减去队列容量,直到队列为空,后续的生成订单等流程单独设计模块,如果有生成订单失败或者付款失败的队列容量在加上。

上一篇下一篇

猜你喜欢

热点阅读