• 51272

    文章

  • 499

    评论

  • 40

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

分别开启15和20个线程模拟秒杀,操作redis事务,商品居然卖不完。。

695856371Web网页设计师②群 | 172816590(满)Web网页设计师①群, 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

欢迎来到梁钟霖个人博客网站。本个人博客网站提供最新的站长新闻,各种互联网资讯。 还提供个人博客模板,最新最全的java教程,java面试题。在此我将尽我最大所能将此个人博客网站做的最好! 谢谢大家,愿大家一起进步!

用 ExecutorService executor = Executors.newFixedThreadPool(15);创建线程池,分别模拟1000个用户去抢100个商品,线程池超过15个之后,商品居然秒杀不完? 两个类

package redis;

import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class SaleRunable implements Runnable {

    String productKey = "iphone8";//监视的key 当前秒杀商品的数量
    Jedis jedis = new Jedis("192.168.17.128");
    String userName;

    public SaleRunable(String userName) {
        this.userName = userName;
    }

    @Override
    public void run() {
        //商品的key  , 秒杀有个数量
        //watch 监视一个key,当事务执行之前这个key发生了改变,事务会被打断
        jedis.watch(productKey);
        String value = jedis.get(productKey);
        int num = Integer.valueOf(value);
        //这次秒杀的商品是100个iphone8
        if (num <= 100 && num >= 1) {
            //开启事务
            Transaction tx = jedis.multi();
            //减少一个商品数量
            tx.incrBy(productKey, -1);
            //提交事务,如果商品数量发生了改动 则会返回null
            List<Object> list = tx.exec();
            if (list == null || list.size() == 0) {
                System.out.println(userName + "商品抢购失败!");
            } else {
                for (Object success : list) {
                    System.out.println(userName + "(" + success.toString() + ")商品抢购成功,当前抢购成功的人数是:" + (1 - (num - 100)));
                }
            }
        } else {
            System.out.println(userName + "商品已经被抢完了");
        }
        jedis.close();
    }


    /**
     * 测试连接redis库
     * @param args
     */
    public static void main(String[] args) {
        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("192.168.17.128");
        System.out.println("连接本地的 Redis 服务成功!");
        // 查看服务是否运行
        System.out.println("服务 正在运行: " + jedis.ping());
    }


}

测试启动类如下

package redis;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import redis.clients.jedis.Jedis;

public class TestMs {

    public static void main(String[] args) throws InterruptedException {
        Jedis jedis = new Jedis("192.168.17.128");
        jedis.set("iphone8","100");
        jedis.close();
        //玩多线程
        ExecutorService executor = Executors.newFixedThreadPool(15);

        for(int i = 0 ; i < 1000; i++){
            executor.execute(new SaleRunable("user" + i));
        }
        executor.shutdown();
        System.out.println("抢购完成!");

    }
}

开启20个线程运行结果如下:


redis查看数据,还剩 27个。。


多次模拟,数据在卖出80个左右浮动,开启线程数越大,卖出的越少。。。

开启15个及小于15个线程,结果如下,基本上能卖完,多次运行偶尔会有1-2次卖出99个

redis数据库数据

啥情况呢?

源代码地址:
https://www.cnblogs.com/longtaosoft/p/6627568.html
https://blog.csdn.net/lzh657083979/article/details/77917088


 转载至链接:https://my.oschina.net/u/2301293/blog/1939052。


转载原创文章请注明出处,转载至: 梁钟霖个人博客www.liangzl.com

您觉喜欢本网站,或者觉得本文章对您有帮助,那么可以选择打赏。
打赏多少,您高兴就行,谢谢您对梁钟霖这小子的支持! ~(@^_^@)~

  • 微信扫一扫

  • 支付宝扫一扫

    支付宝打赏

1条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤
注册梁钟霖个人博客