首页 > 其他分享 >秒杀实现 乐观锁

秒杀实现 乐观锁

时间:2022-11-09 14:11:40浏览次数:31  
标签:实现 System 乐观 秒杀 Result println jedis out

@RestController
public class HelloWorld {
    @GetMapping("hello")
    public Result hello(){
        Integer uid = (int) (Math.random()*100);
        String userKey = "sk:1010:user";
        String kcKey = "sk:1010:qt";
        Jedis jedis = new Jedis("42.193.140.45", 6379);
        if(jedis.get(kcKey) == null){
            System.out.println("秒杀未开始");
            jedis.close();
            return Result.fail();
        }
        //判断是否重复秒杀
        if(jedis.sismember(userKey,uid.toString())){
            System.out.println("你已经秒杀了,不能重复秒杀");
            jedis.close();
            return Result.fail();
        }
        if(Integer.parseInt(jedis.get(kcKey))<=0){
            System.out.println("秒杀结束");
            jedis.close();
            return Result.fail();
        }
        jedis.decr(kcKey);
        jedis.sadd(userKey,uid.toString());
        System.out.println("秒杀成功");
        jedis.close();
        return Result.ok();
    }
    @GetMapping("init")
    public Result init(){
        String userKey = "sk:1010:user";
        Jedis jedis = new Jedis("42.193.140.45", 6379);
        jedis.set("sk:1010:qt","10");
        jedis.del(userKey);
        jedis.close();
        return Result.ok();
    }
    @GetMapping("info")
    public Result info(){
        Jedis jedis = new Jedis("42.193.140.45", 6379);
        Set<String> smembers = jedis.smembers("sk:1010:user");
        System.out.println(smembers);
        String s = jedis.get("sk:1010:qt");
        System.out.println(s);
        return Result.ok();
    }
}

并发  执行之后会出现负值

 

 

1. 添加乐观锁

public Result hello(){
    Integer uid = (int) (Math.random()*100);
    String userKey = "sk:1010:user";
    String kcKey = "sk:1010:qt";
    Jedis jedis = new Jedis("42.193.140.45", 6379);
    //1 添加监视
    jedis.watch(kcKey);
    if(jedis.get(kcKey) == null){
        System.out.println("秒杀未开始");
        jedis.close();
        return Result.fail();
    }
    //判断是否重复秒杀
    if(jedis.sismember(userKey,uid.toString())){
        System.out.println("你已经秒杀了,不能重复秒杀");
        jedis.close();
        return Result.fail();
    }
    if(Integer.parseInt(jedis.get(kcKey))<=0){
        System.out.println("秒杀结束");
        jedis.close();
        return Result.fail();
    }
    //2 开启事务
    Transaction multi = jedis.multi();
    //3 组队
    multi.decr(kcKey);
    //jedis.decr(kcKey);
    //jedis.sadd(userKey,uid.toString());
    multi.sadd(userKey,uid.toString());
    //4 执行
    List<Object> exec = multi.exec();
    if(exec == null || exec.size() == 0){
        System.out.println("秒杀失败");
        jedis.close();
        return Result.fail();
    }
    System.out.println("秒杀成功");
    jedis.close();
    return Result.ok();
}

结果:

 

标签:实现,System,乐观,秒杀,Result,println,jedis,out
From: https://www.cnblogs.com/cciscc/p/16873432.html

相关文章

  • Java中线程的基本操作以及Thread和Runnable两种实现的比较
    线程的定义:某一时间点执行的处理,是操作系统能够进行运算调度的最小单位。一条线程是某一进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务......
  • Java如何实现数据库中表字段的下划线和驼峰式命名的Model相互转换,很方便的...
    其实通过逆向工程,然后去配置一些config,就可以实现,从Table到Model的相互转换,而且,对于下划线命名的Table字段,实现驼峰式命名的Model,有时候我们只是做个测试,或者自己基于数据......
  • 悲观锁和乐观锁
    1.悲观锁 每次操作之前都上锁,操作完之后解锁2.乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,只在更新的时候会判断一下在此期间别人有没......
  • springboot项目整合-商城项目实现删除收货地址
    删除收货地址1.持久层1.1规划sql语句1.在删除之前需要判断该数据是否存在,判断该条数据的归属是否是当前的用户,不需要重复开发2.执行删除收货地址deletefromt_addre......
  • springboot项目整合-商城项目实现热销商品功能
    商品热销排行持久层1.sql语句SELECT*FROMt_productWHEREstatus=1ORDERBYpriorityDESCLIMIT0,42.接口和方法/***查询热销商品的前四名*@re......
  • springboot项目-商城项目实现购物车功能
    购物车模块加入购物车持久层1.规划持久层的语句1.向购物车表中插入数据insertintot_cart(aid除外)values(值列表)2.当当前的商品已经在购物车中存在,则直接更新......
  • 图像清晰度评价与实现方法
    图像清晰度是衡量图像质量的一个重要指标,对于相机来说,其一般工作在无参考图像的模式下,所以在拍照时需要进行对焦的控制。对焦不准确,图像就会变得比较模糊不清晰。相机对焦时......
  • 用JavaScript实现按钮的事件委托并且区分按钮
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content......
  • ZooKeeper系列:实现分布式锁
    锁是为了在多线程的场景中保证数据安全而增加的一种手段,Java中常用的有CountdownLatch,ReentrantLock等单应用中的锁,在现在处处都是分布式的场景需求下就不能满足了,所以就出......
  • 拓端tecdat|R语言代写实现层次聚类模型
    大家好!在这篇文章中,我将向你展示如何在R中进行层次聚类。 什么是分层聚类?分层聚类是一种可供选择的方法,它可以自下而上地构建层次结构,并且不需要我们事先指定聚类的数量。......