作者回复: 不是预扣库存多放开,是在预扣库存前设置一个购买资格,购买资格是300,预扣库存还是100不变。不会出现商品超卖的问题。
问答题回答思路很好。
作者回复: 是的,可以参考下官方的使用文档,在单机且运用服务的CPU核数比较小的环境下,可能测试性能效果没有很大差别,如果想要效果更明显,可以在redis集群环境且应用服务的CPU核数在16以上的环境下进行性能压测,效果会更明显。
https://github.com/redisson/redisson/wiki/2.-配置方法#21-程序化配置方法
作者回复: 嗯,黑名单机制是一个方向
作者回复: 没有直接的解决方案,但是我们可以通过间接的方案来减少这种恶意锁单的问题。建立信用以及黑名单机制,首先在获取购买资格时将黑名单用户过滤掉,其次在获取购买资格后,信用级别高的用户优先获取到库存。用户一旦恶意锁单就会被加入到黑名单。
作者回复: 有界队列LinkedBlockingQueue或者Disruptor实现队列
作者回复: 我们是放在mq中去实现的,rabbitmq中有一个延时队列,当过期时间到了,就会被放到死信队列中,只要去死信队列中实时消费就好了。
定时任务也是一种实现方式,在分布式部署定时任务时,要实现分布式定时任务。
作者回复: 我们是通过一个生产者消费者的方式实现缓存库存的添加和删除,并且通过分布式锁来保证原子性
作者回复: 通过分布式锁来控制的,在下单时,以缓存中的库存为准,不会修改DB中的库存,只有在支付完成之后,回调时去数据库中扣除库存,严格上来说,只要业务操作没有bug,两者的库存就是一致的
作者回复: 扣除缓存中的库存也需要分布式锁,订单超时被取消会增加库存。
作者回复: 是的
作者回复: 相当于线程池中的阻塞队列
作者回复: 通过分布式锁可以保证不超卖,具体回顾之前41讲的分布式锁设计。
作者回复: 由于请求量比较大,我们可以使用其他脚本语言+redis实现一个中间代理来做排队等待,减少Java应用的内存压力。
作者回复: 到了支付界面,我们已经锁定库存了,所以即使增大购买资格,也没法解决这个问题。
作者回复: 对的
作者回复: 是的
作者回复: 设置黑名单是一种常用的解决方案