redis分布式锁(已经在生产上使用的,史上最全面的分布式锁)

现在网上很多文档介绍redis分布式锁使用setnx(),但是这个方法和给key设置超时时间不是原子性的,有出现死锁的风险。虽然可以在下一次获取这个锁来解开死锁,但是代码操作太多了,一旦有疏忽容易出现问题。
目前楼主使用的是redis2.6版本之后的set()方法实现的,这个在设置锁的时候,可以同时设置有限期,是原子性的。同时我也写了redis单机和集群不同模式下获取锁和释放锁,以及获取锁失败的重试机制。


package com.cjkj.common.redis.lock;

import com.cjkj.common.lock.AbstractDistributedLock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * redis分布式锁实现
 *
 * @author 
 * @date 2019-12-24 11:11:11
 */
@Slf4j
@Component
public class RedisDistributedLock extends AbstractDistributedLock {
    @Autowired
    private RedisTemplate redisTemplate;

    pri

你可能感兴趣的:(redis分布式锁(已经在生产上使用的,史上最全面的分布式锁))