简单基本的 redis 锁

 这个比较简单的实现,不过也可以用的

之后考虑用lua脚本实现

/**
 * 尝试获取简单锁
 * 这里简单的锁 不考虑并发
 * 待扩展为 单条redis执行原子锁 SETNX + EXPIRE
 * @author Hank
 * @param lockKey 锁key
 * @param expireSeconds 超期时间 秒
 * @return 是否获取成功
 */
public boolean tryGetDistributedLock(String lockKey, long expireSeconds) {
    if(StringUtils.isNotBlank(redisTemplate.opsForValue().get(lockKey))){
        return false;
    }
    redisTemplate.opsForValue().set(lockKey, "1", expireSeconds, TimeUnit.SECONDS);
    return true;
}

用法,手机发送短信锁60秒 

	/**
	 * 获得锁
	 * 锁60秒
	 *
	 * 这里之后考虑 同时进行 ip 加锁
	 * @author Hank
	 * @param phone 手机号
	 * @param smsCodeTypeKey 类型key
	 * @return
	 */
	public static boolean tryGetDistributedLock(String phone, String smsCodeTypeKey){
		DataCache dataCache = (DataCache)SpringContextUtil.getBean("dataCache");
		return dataCache.tryGetDistributedLock(RedisKeyConst.CACHE_SMS_CODE_LOCK_PREFIX+smsCodeTypeKey+phone, 60);
	}

 

补充下更完善的 redis分布式锁:

    单实例的锁

        加锁 : SET resource_name my_random_value NX PX 30000

        解锁: if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end

    更加可靠的多实例redis分布式锁 RedLock:

        Redis把分布式锁的算法称之为红锁,Redis + Lock = RedLock。红锁需要N个(>=3)Redis独立节点,这些节点相互之间不需要有信息交流,保持独立即可。红锁基本的思路是:客户端在每个Redis实例上获得锁(就是上面讲过的指令),只要大多数实例(大于1半)上成功获得锁就算加锁成功。红锁的算法已经有很多实现版本,JAVA对应的实现版本是Redisson,我们可以在业务中直接引入并使用。

springboot下使用Redisson(redlock, redis锁, 分布式锁)

 

 

你可能感兴趣的:(java,spring,boot,spring)