上一篇文章我发表了如何处理数据库高并发问题,今天, 我总结下如何用Redis来存储。上一篇文章URL:
https://blog.youkuaiyun.com/qq_40206199/article/details/103238024
发完这篇帖子,还要忙着测试功能,图片我就不贴了。直接贴代码。如果有同学有更好的方法,请留言,或者加我QQ: 858427398, 一起学习,成长!
这个是用Redis存储商品,限制100个请求,没有用锁进行锁住,利用了Redsi的单线程,和decrBy的原子性来保证商品不超卖。
/**
* Redis存储
* 记得把卖出去的数量从数据库里面减去
* 表单要控制只能点击一次,不能重复点击
* 如果并发量实在大,可以用lua脚本保存原子性
* 这个版本只是简单存储用Redis进行优化
* @param param
* @return
*/
@Override
public void orderAdd2(OrderParam param) {
try {
//10万人请求,只保留2000个用户,其他的抛出已经抢购完成。
long count = RedisUtil.incr( "quantity");
System.out.println("进来的请求是:" + count);
//我这只是简单测试,拿100个用户, 去抢购20件商品,如果是正式环境,那么你要考虑有多少用户是抢购但不换取的,这里只是测试
if(100 <= count){
System.out.println("已经抢购完成");
return; //自定义返回异常
}else {
Integer i = Integer.valueOf(RedisUtil.get("commdity"));
System.out.println("商品数量是:" + i);
System.out.println("剩下商品数量是: " + i);
if(i <=0) {
System.out.println("库存不足,停止售卖");
return; //自定义返回异常
}
//使用decrBy原子性,保证商品不被超卖,需要考虑,如果用户买了10个商品,但是商品库存没有10个,那么需要把扣的商品进行补回去!
RedisUtil.decrBy("commdity", param.getQuantity());
}
}catch (Exception e){
System.out.println("库存不足,停止售卖");
}
}
择其善者而从之,其不善者而改之