写在前面
需求是做一个秒杀系统,比如大家来抢100台手机,先到先得。
查阅了网上很多用redis实现秒杀的demo(java语言),竟然没一个能用的!!!
有些是php的,没闲心研究了,现在说说为什么不能用:
-
绝大多数的DEMO都是基于redis的watch特性的事务实现①,
-
个别是基于redis分布式锁实现②。
-
当然还有些用了脚本的,我也没仔细看是lua还是调用redis指令,哪有那个闲心去研究哇。
照顾一下小白,分析一下为什么这几种实现不行
1.基于watch特性的 不靠谱 实现
其实这两种实现方式,完全可以理解为乐观锁(watch)和悲观锁(加分布式锁)
watch事务,相当于是乐观锁,这种方法在并发情况下极为不靠谱,假设有100个人同时尝试秒杀,那么极端情况下,有99个人都会失败,只有一个能修改成功。
然而demo里甚至没写如果修改失败了就重试这个功能,那显然这失败的99个人,已经提示失败了,过一会回来,发现还剩了90多。那我是怎么失败的?我替他们问问了。
并且使用这种方式实现呢,在并发量较大的时候,过多的重试线程应该会严重影响服务器性能。
2.基于用redis做个分布式锁的 不靠谱 实现
这种实现方式