redis以及zk分布式锁的实现

redis分布式锁

/**
 * @author yujianjian  2019-08-28 17:28
 * redis分布式锁实现
 */
@Slf4j
@Service
public class RedisLock {
   

    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private DefaultRedisScript<Long> redisScript;

    private static final Long SUCCESS = 1L;


    /**
     * 尝试获取锁,只获取一次
     *
     * @param lockKey    key
     * @param value      value
     * @param expireTime 过期时间-秒
     * @return 获取锁的结果
     */
    public boolean tryLock(String lockKey, String value, int expireTime) {
   
        try {
   
            return redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS);
            // String script = "if redis.call('setNx',KEYS[1],ARGV[1]) then if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end end";
        } catch (Exception e) {
   
            log.error("RedisLock|tryLock fail lockKey={}|value={}|expireTime={}", lockKey, value, expireTime, e);
        }
        return false;
    }

    /**
     * 加锁(指定最大尝试次数)
     *
     * @param lockKey     key
     * @param value       value
     * @param expireTime  过期时间-秒
     * @param tryTimes    最大尝试次数
     * @param sleepMillis 每两次尝试之间的休眠时间(毫秒)
     * @return 获取锁的结果
     */
    public boolean getLock(String lockKey, String value, int expireTime, int tryTimes, long sleepMillis) {
   
        boolean result = false;
        int count = 0;
        while (!result && count <= tryTimes) {
   
            count++;
            result = tryLock(lockKey, value, expireTime);
            try {
   
                TimeUnit.MILLISECONDS.sleep(sleepMillis);
            } catch (InterruptedException e) {
   
                log.error("getLock fail", e);
            }
        }
        return result;
    }


    /**
     * 释放锁
     *
     * @param lockKey key
     * @param value   value
     * @return 释放锁的结果
     */
    public boolean releaseLock(String lockKey, String value) {
   
        try {
   
            String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

            Long result = redisTemplate.execute(redisScr
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值