IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> jedis操作redis来抢购秒杀商品 -> 正文阅读

[大数据]jedis操作redis来抢购秒杀商品

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

将jedis注入到spring中,略

@Autowired
JedisPool jedisPool;

    public static void main(String[] args) {
         //连接本地的 Redis 服务
        Jedis inputJedis = new Jedis("localhost", 6379);
        String RDIS_FILE_KEY = "Rdis_File_key";
        for (int i = 0; i < 10; i++) {
            inputJedis.lpush(RDIS_FILE_KEY,"aaaa"+10);
        }


        //=====================抢购代码==================
        //表示进行100次抢,但是程序线程在20个.进去了20个其他排队在等20人出来再进去
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        CountDownLatch countDown = new CountDownLatch(100);
        for (int i = 0; i <100; i++) {
            int index = i;
            executorService.execute(() -> {
                Jedis checkJedis = new Jedis("localhost", 6379);
                Long zcard = checkJedis.llen(RDIS_FILE_KEY);
                System.err.println(Thread.currentThread().getName()+"======"+zcard);
                if (zcard>0){
                    String result = checkJedis.lpop(RDIS_FILE_KEY);
                    System.out.println("用户"+index+" 抱歉已抢走!"+result);
                    countDown.countDown();
                    return;
                }
                //表示一个线程执行完毕了
                countDown.countDown();
                System.err.println(Thread.currentThread().getName()+"没有任何商品,结束战斗");
                checkJedis.close();
            });
        }
        executorService.shutdown();
        try {
            //等待所有线程执行完毕
            countDown.await();
            System.out.println("所有用户秒杀完毕,开始公布结果:");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

下面是源码,在servie层函数中接口执行?:

生产数据

        String goodsKey = "goods:iphone8";
        Jedis jedis = jedisPool.getResource();
        jedis.set(goodsKey, "100"); // 设置100个商品
        jedisPool.returnResource(jedis);

?开始抢购:



        /** 1000线程抢购100个商品 */
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        CountDownLatch count = new CountDownLatch(10000);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            int finalI = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    Jedis jedis =null;
                    while (true) {
                        try {
                            jedis = jedisPool.getResource();
                            // watch 监视一个key,当事务执行之前这个key发生了改变,事务会被打断
                            jedis.watch(goodsKey);
                            int currentGoodsCount = Integer.parseInt(jedis.get(goodsKey)); // 当前剩余商品数量
                            if (currentGoodsCount <= 0) {
                                System.out.println("商品已抢完," + finalI + "---> 抢购失败 XXX");
                                break;
                            }
                            Transaction tran = jedis.multi(); // 开启事务
                            tran.incrBy(goodsKey, -1); // 商品数量-1
                            List<Object> exec = tran.exec(); // 执行事务
                            if (CollectionUtil.isEmpty(exec)) {
                                System.out.println(finalI + "---> 抢购失败,继续抢购");
                                Thread.sleep(1);
                            } else {
                                Jedis finalJedis = jedis;
                                exec.forEach(
                                        succ -> {
                                            String succStr = finalI + "===========================> 抢购到第【"
                                                    + ((100 - currentGoodsCount) + 1)
                                                    + "】份商品,该商品剩余:"
                                                    + succ.toString();
                                            System.out.println(succStr);
                                            finalJedis.set("goodsResult:" + finalI, succStr); // 业务代码,处理抢购成功
                                        });
                                break;
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            if (jedis != null) {
                                jedis.unwatch();
                                jedisPool.returnResource(jedis);

                            }
                        }

                    }
                }
            });
            count.countDown();
        }
        executorService.shutdown();
        try {
            count.await();
            long time = System.currentTimeMillis() - startTime;
            System.out.println("共耗时:" + time + "毫秒");
            // JedisPoolUtil.close();
            System.in.read();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:08:12  更:2022-03-06 13:10:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:59:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码