首页 > 数据库 >关于redis锁的详解

关于redis锁的详解

时间:2024-07-04 14:19:37浏览次数:15  
标签:return redis REDIS value 详解 jedis 关于 LOCK

引用    https://www.jb51.net/article/251428.htm

 Lock lock = new ReentrantLock();
    @Autowired
    StringRedisTemplate redisTemplate;
    public static final String g01="good:01";
    public static final String REDIS_LOCK="good_lock";
    @ApiOperation("获取测试数据")
    @GetResource(name = "获取测试数据", path = "/getTestInfo", requiredPermission = false,requiredLogin = false)
    public ResponseData getTestInfo(@RequestParam ("num") int num){
        String value = UUID.randomUUID().toString().replace("-", "");
        UUID.randomUUID().toString().replace("-","");
        try {
            Boolean flag = redisTemplate.opsForValue().setIfAbsent(REDIS_LOCK, value,10, TimeUnit.SECONDS);
            if (!flag) return ResponseData.error("抢锁失败");
            log.info("抢锁成功");
            String result = redisTemplate.opsForValue().get(g01);
            int total = result==null ? 0:Integer.parseInt(result);
            if (total>0){
                total--;
                redisTemplate.opsForValue().set(g01,String.valueOf(total));
                return ResponseData.success(total);
            }
            return ResponseData.error("没有库存");
        }catch (Exception e){
            return ResponseData.error("报错");
        }finally {
//            redisTemplate.delete(REDIS_LOCK);
//            if (redisTemplate.opsForValue().get(REDIS_LOCK).equals(value)){
//                redisTemplate.delete(REDIS_LOCK);
//            }
            Jedis jedis = null;
            try {
                jedis = new Jedis("119.45.11.7", 6379);
                jedis.auth("LIKZ10101006");
                String script = "if redis.call('get',KEYS[1]) == ARGV[1] " +
                        "then " +
                        "return redis.call('del',KEYS[1]) " +
                        "else " +
                        "   return 0 " +
                        "end";
                Object eval = jedis.eval(script, Collections.singletonList(REDIS_LOCK),
                        Collections.singletonList(value));
                if("1".equals(eval.toString())){
                    log.info("-----del redis lock ok....");
                }else {
                    log.info("-----del redis lock error....");
                }
            }catch (Exception e){

            }finally {
                if (null!=jedis){
                    jedis.close();
                }
            }
        }

    }

正常加锁

 String value = UUID.randomUUID().toString().replace("-","");
        try{
            // 为key加一个过期时间
            Boolean flag = template.opsForValue().setIfAbsent(REDIS_LOCK, value,10L,TimeUnit.SECONDS);
 
            // 加锁失败
            if(!flag){
                return "抢锁失败!";
            }
            System.out.println( value+ " 抢锁成功");

 谁加了锁,谁才能删锁

finally {
            // 谁加的锁,谁才能删除!!!!
            if(template.opsForValue().get(REDIS_LOCK).equals(value)){
                template.delete(REDIS_LOCK);
            }
        }

使用lua脚本,保证原子性

finally {
            // 谁加的锁,谁才能删除,使用Lua脚本,进行锁的删除
 
            Jedis jedis = null;
            try{
                jedis = RedisUtils.getJedis();
 
                String script = "if redis.call('get',KEYS[1]) == ARGV[1] " +
                        "then " +
                        "return redis.call('del',KEYS[1]) " +
                        "else " +
                        "   return 0 " +
                        "end";
 
                Object eval = jedis.eval(script, Collections.singletonList(REDIS_LOCK), Collections.singletonList(value));
                if("1".equals(eval.toString())){
                    System.out.println("-----del redis lock ok....");
                }else{
                    System.out.println("-----del redis lock error ....");
                }
            }catch (Exception e){
 
            }finally {
                if(null != jedis){
                    jedis.close();
                }
            }
        }

目前存在锁,并属于当前线程

finally {
            if(lock.isLocked() && lock.isHeldByCurrentThread()){
                lock.unlock();
            }
        }

 

标签:return,redis,REDIS,value,详解,jedis,关于,LOCK
From: https://www.cnblogs.com/jiangzishun/p/18283775

相关文章

  • 关于GPT-5的期待和思考
    IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉·穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。对此的一些期待和思考:首先,从技术角度来看,GPT-5很可能会在以下几个方面有重大突破:模型规模和参数量的进......
  • Log4Net配置详解及输出自定义消息类示例
    1.简单使用实例1.1添加log4net.dll的引用。  在NuGet程序包中搜索log4net并添加,此次我所用版本为2.0.17。如下图:1.2添加配置文件  右键项目,添加新建项,搜索选择应用程序配置文件,命名为log4net.config,步骤如下图:1.2.1log4net.config简单配置示例  下面是一个简单的......
  • Java 中的字符串替换方法详解:replace, replaceAll 和 replaceFirst
    在Java中,字符串的替换是一种常见的操作,特别是在处理文本和格式化输出时。Java提供了几种不同的方法来实现字符串替换,其中包括replace,replaceAll和replaceFirst。本文将详细讨论这些方法的用法、区别以及示例。1.replace(CharSequencetarget,CharSequencereplaceme......
  • 【Elasticsearch】Elasticsearch动态映射与静态映射详解
    文章目录......
  • IDEA Database DataGrip关于Hive连接驱动万能问题详解。。
    问题:默认下载的Hive驱动版本是3的,如果使用最新的3版本连接2版本的Hive会报错,报各种依赖问题。解决方案:需要下载对应版本的Hive驱动hive-jdbchadoop-common也需下载(版本不需要太严格,2和3版本都可)配置刚刚下载的依赖包(在弹出的finder文件位置,新建一个文件夹,文件夹的名称修改......
  • 关于古书介绍上“单鱼尾”是什么?
    在阅读一些古书时,读的往往时某些版本的综合刊定版,而介绍有关原版时,会出现这个词语“单鱼尾”或者双鱼尾,这是什么意思呢?搜索发现,原来古书也不是一页页,单页的,而是双页印刷,然后中间折叠,装订成册的。而折叠的具体位置在哪呢?就由鱼尾型标志标明,显然鱼尾最凹处就是折叠的位置。相关介绍......
  • PHP反序列化字符逃逸详解
    这段时间遇到几个关于反序列化的字符逃逸的程序,今天来分享一下经验。<?phpfunctionfilter($str){returnstr_replace('bb','ccc',$str);}classA{public$name='aaaa';public$pass='123456';}$AA=newA();$res=filter(serialize($AA));$c=unserial......
  • 关于conftest和fixtures
    一、conftest.py文件作用:存放case的前提条件和后置条件配置函数;一般该类函数都会使用fixture装饰(fixture该篇第二点会介绍);使用conftest里面的函数时不需要导入conftest.py这个文件。只需将函数名作为变量传入test_case即可调用;使用conftest.py的规则:特点:conftest......
  • 关于搭建可商用AI平台的小感想
    前言AI时代已经到来,从智能客服到图像识别,再到语音识别,AI应用已经无处不在,而且AI绘图聊天等创新应用的市场需求也在不断增长。作为开发者,学习搭建自己的AI平台已经成为必然趋势,不仅能提升我们自己的技能,还能为我们带来更多职业和商业机会,不仅局限于科技行业,它在医疗、金融、教育等......
  • 机器学习原理之 -- 最近邻算法分类:由来及原理详解
            最近邻算法(k-NearestNeighbors,k-NN)是一种简单且直观的分类算法,广泛应用于分类和回归问题。由于其易于理解和实现,k-NN在数据挖掘、模式识别和机器学习领域中占据重要地位。本文将详细介绍最近邻算法的由来、基本原理、构建过程及其优缺点。二、最近邻算法的由......