• 回复@老老保老张工:那只能证明你的智商不达标!对于计划经济的构想,咱敢说强坛没有一个人比咱考虑得更周全!伪高工排在一个筋斗云之外! 2019-04-15
  • 傍晚,听一曲温柔的天鹅湖 2019-04-15
  • 马刺头号球星申请换队并确定下家 波波维奇也不好使了 2019-04-15
  • [大笑]所以说你不仅智商低还不谦虚嘛! 2019-04-15
  • 出卖社会主义,发不了大财。 2019-04-11
  • 《侏罗纪世界2》:人类是否有能力收拾自己制造出来的烂摊子 2019-04-11
  • 《风暴舞》亮相上海电视节 或成年度期待大戏 2019-04-03
  • 一图在手 2018俄罗斯世界杯赛程全有 2019-04-03
  • 环境问题整改不到位 泸州市政府主要负责同志被约谈 2019-03-30
  • 恩施州“文化人才”建设专题培训班在杭州城研中心成功举办 2019-03-29
  • 长治县国税局打造“税收政策定制专属包” 2019-03-29
  • 视频陶然居变形记:从路边小饭馆到全国餐饮十强 2019-03-27
  • 警方出重拳 守护个人信息安全 2019-03-27
  • 吴凤鸣的扶贫实践:让农民致富梦在希望的田野上成为现实 2019-03-24
  • 病人就医不便 护士上门服务 2019-03-24
  • 排列五走势图带连线图:我的Java路上那些事儿

    快乐成长
    posts - 110, comments - 100, trackbacks - 0, articles - 7
      BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

    redis 设置分布式锁

    Posted on 2014-01-15 19:00 云云 阅读(11685) 评论(1)  编辑  收藏
    public static boolean acquireLock(String lock) {
        // 1. 通过SETNX试图获取一个lock
        boolean success = false;
        Jedis jedis = pool.getResource();      
        long value = System.currentTimeMillis() + expired + 1;    
        System.out.println(value);    
        long acquired = jedis.setnx(lock, String.valueOf(value));
        //SETNX成功,则成功获取一个锁
        if (acquired == 1)      
            success = true;
        //SETNX失败,说明锁仍然被其他对象保持,检查其是否已经超时
        else {
            long oldValue = Long.valueOf(jedis.get(lock));
     
            //超时
            if (oldValue < System.currentTimeMillis()) {
                String getValue = jedis.getSet(lock, String.valueOf(value));              
                // 获取锁成功
                if (Long.valueOf(getValue) == oldValue)
                    success = true;
                // 已被其他进程捷足先登了
                else
                    success = false;
            }
            //未超时,则直接返回失败
            else            
                success = false;
        }        
        pool.returnResource(jedis);
        return success;      
    }
     
    //释放锁
    public static void releaseLock(String lock) {
        Jedis jedis = pool.getResource();      
        long current = System.currentTimeMillis();      
        // 避免删除非自己获取得到的锁
        if (current < Long.valueOf(jedis.get(lock)))
            jedis.del(lock);      
        pool.returnResource(jedis);
    }



    //--------------------------

    public Long acquireLock(final String lockName,final long expire){
        return redisTemplate.execute(new RedisCallback<Long>() {
         public Long doInRedis(RedisConnection connection) {
            byte[] lockBytes = redisTemplate.getStringSerializer().serialize(lockName);
    boolean locked = connection.setNX(lockBytes, lockBytes);
    connection.expire(lockBytes, expire);
    if(locked){
    return 1L;
    }
                return 0L;
    }
    });
    }


    //原子操作 -----------------------

    public String getAndSet(final String key,final String value){
    return redisTemplate.execute(new RedisCallback<String>() {
    @Override
    public String doInRedis(RedisConnection connection)
    throws DataAccessException {
    byte[] result = connection.getSet(redisTemplate.getStringSerializer().serialize(key),
    redisTemplate.getStringSerializer().serialize(value));
    if(result!=null){
                                        return new String(result);
     }
    return null;
                    }
             });
    }





    评论

    # re: redis 设置分布式锁   回复  更多评论   

    2016-04-20 15:04 by 小新人
    请问expired如何设置

    只有注册用户登录后才能发表评论。


    网站导航:
     
  • 回复@老老保老张工:那只能证明你的智商不达标!对于计划经济的构想,咱敢说强坛没有一个人比咱考虑得更周全!伪高工排在一个筋斗云之外! 2019-04-15
  • 傍晚,听一曲温柔的天鹅湖 2019-04-15
  • 马刺头号球星申请换队并确定下家 波波维奇也不好使了 2019-04-15
  • [大笑]所以说你不仅智商低还不谦虚嘛! 2019-04-15
  • 出卖社会主义,发不了大财。 2019-04-11
  • 《侏罗纪世界2》:人类是否有能力收拾自己制造出来的烂摊子 2019-04-11
  • 《风暴舞》亮相上海电视节 或成年度期待大戏 2019-04-03
  • 一图在手 2018俄罗斯世界杯赛程全有 2019-04-03
  • 环境问题整改不到位 泸州市政府主要负责同志被约谈 2019-03-30
  • 恩施州“文化人才”建设专题培训班在杭州城研中心成功举办 2019-03-29
  • 长治县国税局打造“税收政策定制专属包” 2019-03-29
  • 视频陶然居变形记:从路边小饭馆到全国餐饮十强 2019-03-27
  • 警方出重拳 守护个人信息安全 2019-03-27
  • 吴凤鸣的扶贫实践:让农民致富梦在希望的田野上成为现实 2019-03-24
  • 病人就医不便 护士上门服务 2019-03-24
  • 双色球开奖结果今天的 老时时彩2011081901 智利联赛规则 新浪足彩胜负彩14场 最快14场胜负彩开奖结果 浙江体彩飞鱼彩票控 360福利彩票走势图 快乐扑克3同花遗漏 pk10牛牛技巧 2005年七乐彩走势图 北京赛车改单是真是假 桥头竞彩北单 中国体育彩票走势图 重庆幸运农场手机版 足彩进球彩12044 秒速飞艇早上多少点