redis分布式锁机制

redis采用单线程,在一些处理上速度快,效率高.

在一些购物平台上,比如秒杀某个物品,都是需要锁来进行资源的锁定,某个用户秒杀到了,就得确保别的用户不能抢,至于用户付款还是取消那就是别的事情了.

既然我们用redis,那就看看一些基本
Redis命令介绍
使用Redis实现分布式锁,有两个重要函数需要介绍

SETNX命令(SET if Not eXists)
语法:
SETNX key value
功能:
当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。

GETSET命令
语法:
GETSET key value
功能:
将给定 key 的值设为 value ,并返回 key 的旧值 (old value),当 key 存在但不是字符串类型时,返回一个错误,当key不存在时,返回nil。

GET命令
语法:
GET key
功能:
返回 key 所关联的字符串值,如果 key 不存在那么返回特殊值 nil 。

DEL命令
语法:
DEL key [KEY …]
功能:
删除给定的一个或多个 key ,不存在的 key 会被忽略。

最好是设置一个超时的key 避免不必要的浪费嘛 下面我就贴代码了

public boolean acquireLock(String lock) {
        boolean success = false;
        Jedis jedis = jedisPool.getResource();       
        long value = System.currentTimeMillis() + getExpire() + 1;     
        System.out.println(value);    
        long acquired = jedis.setnx(lock, String.valueOf(value));
        //SETNX成功,则成功获取一个锁
        if (acquired == 1){  
            jedis.expire(lock, 5*60);
            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;
        }        
        jedisPool.returnResource(jedis);
        return success;           
    }

在秒杀的时候 我们枷锁最好是个数量 或者某个商品编号 最后我们在
try 的finally中unlock

public static void unLock(String key) {
        Jedis jedis = jedisPool.getResource();
        jedis.del(key);
        jedisPool.returnResource(jedis);
    }

至此就结束了.
有问题可以联系

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值