java程序领取优惠卷,高并发下怎么避免领取量超过预发量
基本思路是:锁+幂等性
具体实现:
使用redis的decr (对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。)可以实现原子性的递增递减操作控制优惠码不超送,然后给每个用户维护一个userid+优惠码活动的key保证幂等性,只要redis存在这种key,那就代表已经领取了,具体的优惠码分发可以异步执行。为了避免竞争(同一个用户,多个设备同时领取),参考:网页链接
1、对优惠券对象,做好安全锁,具体看你们的优惠券模块是怎么样的了,如果是存放在一个全局列表,只要对这个列表做安全锁,如果是数据库存储数据,那么只能控制那个从数据库拉取优惠券数据了,给这个方法加安全锁
2、消峰,领取优惠券这种活动,给用户来个验证码啥的输入,限定短时间内的多次刷新等等来避免每个线程同时执行领取的操作
2、消峰,领取优惠券这种活动,给用户来个验证码啥的输入,限定短时间内的多次刷新等等来避免每个线程同时执行领取的操作