redis实现秒杀

1.环境准备

eclipse + redis

2.具体实现

需求:某公司实现秒杀环节,100部手机(具体东西,自己设置)

2.1启动redis服务端

1.启动redis服务端(后台运行)

  1. 进入 DOS窗口

  2. 在进入redis的安装目录

  3. 输入:redis-server --service-install redis.windows.conf --loglevel verbose ( 安装redis服务 )

  4. 输入:redis-server --service-start ( 启动服务 )

  5. 输入:redis-server --service-stop

2.2做代码具体实现

入口类

public class MainController {
    
    public static void main(String[] args) {
        
         String key="shouji";
         int num=100;
        
        Jedis jedis = new Jedis("localhost");
        jedis.set(key, num+"");
        jedis.close();
        //创建一个线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(20);
        //模拟一千个人同时访问
        for (int i =0; i < 1000; i++) {
//          new Run("user"+i,key,num)
            threadPool.execute(new Run("user"+i,key,num));
        }
        threadPool.shutdown();
    }
}

具体业务逻辑

public class Run implements Runnable{

    private String key;
    private String name;
    private int num;
    
    public Run(String name,String key,int num) {
        this.name = name;
        this.key = key;
        this.num = num;
    }
    
    Jedis jedis = new Jedis("localhost");
    @Override
    public void run() {
        //redis 监视一个key,当这个key的值发生改变时候,事务提交失败
        jedis.watch(key);
        String string = jedis.get(key);
        //得到商品的数量
        int currentnum = Integer.parseInt(string);
        if (currentnum <= num && currentnum >= 1) {
            //进行秒杀环节
            //开启事务
            Transaction multi = jedis.multi();
            //让商品减少一个
            multi.incrBy(key,-1);
            //提交事务.如果事务提交失败,返回值为空
            List<Object> exec = multi.exec();
            if (exec == null || exec.size()==0) {
                System.out.println(name+"----抢购失败!");
            }else {
                for (Object object : exec) {
                    System.out.println(name+"("+object.toString()+")"+"抢购商品成功,当前抢购成功人数为:"+(1-(currentnum-100)));
                }
            }
        }else {
            System.out.println("商品一已经被抢购完");
        }
        
    }

}

模拟一千个人同时抢购100部手机,使用redis做,redis是单线程操作,当事务被破坏时候,当前事务被破坏,达到多人抢购的效果

具体代码:码云https://gitee.com/zhangqiye/redis_second_kill/tree/master/Redis

也可加群共同探讨:552113611

欢迎各位指正
fd

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,386评论 19 139
  • 秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式。不仅可以给平台带来用户量,还可以提高平台知名度。一个好的...
    流浪冰007阅读 15,672评论 0 16
  • 首先,因为秒杀这个环节在商城项目中比较常见,最近写商城项目,碰到这个功能模块,于是就拿出来给大家分享一波。 难点:...
    墨丘利lh阅读 9,117评论 3 9
  • 秒杀订单提前写入 秒杀抢购取出
    始于原子阅读 3,649评论 0 1
  • 使用乐观锁的方式来实现秒杀功能
    phper1021阅读 5,603评论 0 6