电商 - 秒杀商品之高并发(2) - Redis存储

上一篇文章我发表了如何处理数据库高并发问题,今天, 我总结下如何用Redis来存储。上一篇文章URL:

https://blog.csdn.net/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("库存不足,停止售卖");
        }
    }

择其善者而从之,其不善者而改之

发布了72 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40206199/article/details/103257575