优惠券秒杀 实现一人一单(自定义redis分布式锁)

优惠券秒杀 实现一人一单(自定义redis分布式锁)_第1张图片

自定义一个类SimpleRedisLock提供分布式锁  

优惠券秒杀 实现一人一单(自定义redis分布式锁)_第2张图片

获取锁:(key是前缀+userID,value是随机UUID+线程id)

@Override
    public boolean tryLock(long timeoutSec) {
        //线程标识
        String threadId=ID_PREFIX+Thread.currentThread().getId();
        Boolean success=stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX+name,threadId,timeoutSec, TimeUnit.SECONDS);

        return Boolean.TRUE.equals(success);
    }

释放锁,注意要判断释放的锁是否是当前线程的锁,并且为了保证原子性,用lua脚本来完成

脚本:

if(redis.call('get',KEYS[1])==ARGV[1]) then
    return redis.call('del',KEYS[1])
end
return 0

 unlock方法:

@Override
    public void unlock() {
        //调用lua脚本,保证原子性
        stringRedisTemplate.execute(UNLOCK_SCRIPT, Collections.singletonList(KEY_PREFIX+name),ID_PREFIX+Thread.currentThread().getId());

    }

 

你可能感兴趣的:(web,分布式,redis)