`
supben
  • 浏览: 331284 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于redis setnx命令的分布式锁

阅读更多
public class SoaLockSupport {

	private Logger logger = Logger.getLogger(SoaLockSupport.class);
        
        //你的redis实现类
	private RedisAAA redis;

	// 超时时间
	private long timeout = 3000;
	
	/**
	 * 获得锁,如果没拿到,会在超时时间内一直等待
	 */
	public boolean lock(final String key) {
		FutureTask<Boolean> future = new FutureTask<Boolean>(new Callable<Boolean>() {
			public Boolean call() {
				boolean nx = false;
				for (;;) {
					nx = setnx(key);
					if(nx){
						break;
					}
					try {
						// 获取不到暂停2ms
						Thread.sleep(2);
					} catch (InterruptedException e) {
						//
					}
				}
				return nx;
			}
		});
		try {
			return future.get(timeout, TimeUnit.MILLISECONDS);
		} catch (Exception e) {
			logger.error("try lock error,key = "+key, e);
		}
		
		return false;
	}

	/**
	 * 尝试获得锁,如果没拿到,直接返回失败
	 */
	public boolean trylock(String key) {
		if (setnx(key)) {
			return true;
		}

		// 做这一步是防止key一直不被Delete,导致锁一直得不到释放的问题
		String oldTime = redis.getString(key);
		if (oldTime != null && !oldTime.equals("")) {
			long time = Long.valueOf(oldTime) + timeout;
			long now  = System.currentTimeMillis();
			
			if (time < now) {
				logger.info("time = "+time + ",and now="+now);
				redis.delete(key);
				return setnx(key);
			}
		}
		return false;
	}

	/**
	 * 释放锁
	 */
	public void unlock(String key) {
		redis.delete(key);
	}

	private boolean setnx(String key) {
		if (redis.setnx(key, System.currentTimeMillis() + "") == 1) {
			return true;
		}
		return false;
	}

 

0
0
分享到:
评论

相关推荐

    Java基于redis实现分布式锁代码实例

    Java基于Redis实现分布式锁代码实例 分布式锁的必要性 在多线程环境中,资源竞争是一个常见的问题。例如,在一个简单的用户操作中,一个线程修改用户状态,首先在内存中读取用户状态,然后在内存中进行修改,然后...

    基于Redis方式实现分布式锁

    ### 基于Redis方式实现分布式锁 #### 分布式锁概述 分布式锁是一种常见的分布式系统协调机制,用于控制分布式环境下的多个进程或线程之间的访问顺序,防止多个客户端同时修改共享资源,从而保证数据的一致性和完整...

    redis实现分布式锁,自旋式加锁,lua原子性解锁

    Redis中的分布式锁实现通常基于`SETNX`命令或`SET`命令的`nx`与`ex`组合。`SETNX`命令用于设置键值,但如果键已经存在,则不执行任何操作,这可以确保锁的互斥性。`SET key value EX timeout NX`则同时设置了超时...

    springboot基于redis分布式锁

    本教程将深入探讨如何在SpringBoot应用中实现基于Redis的分布式锁。 首先,Redis之所以常被用作分布式锁的实现,是因为其具有以下优点: 1. **高可用性**:Redis支持主从复制,可以确保在单点故障时仍有服务可用。...

    基于redis的分布式锁

    标题"基于redis的分布式锁"指出了我们将探讨如何使用Redis来构建分布式锁。Redis提供了多种方式来实现这一功能,其中最常用的是使用`SETNX`(Set if Not Exist)命令和`EXPIRE`命令组合,以及`lua`脚本来确保原子...

    Redis高可用的分布式锁

    本篇主要讨论的是如何基于SpringBoot框架,利用Redis实现高可用的分布式锁,并通过注解的方式简化代码。 首先,分布式锁的核心目的是在多节点环境下保证同一资源在同一时刻只能被一个客户端独占。Redis因其高性能、...

    redis分布式锁及会出现的问题解决

    Redis 分布式锁是分布式系统中用于解决并发问题的重要工具,尤其在高并发场景下,如秒杀活动、限流控制等。它基于单机的 Redis 数据存储来实现跨节点的锁服务。以下是对Redis分布式锁及其可能出现的问题的详细解释:...

    基于redis的分布式锁实现

    ### 基于Redis的分布式锁实现 #### 分布式锁背景及概念 在现代分布式系统中,确保数据一致性和防止资源竞争变得至关重要。尤其是在涉及多个进程或节点间通信的场景下,传统的单进程锁机制(如Java中的`...

    003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁

    实现基于Redis的分布式锁,可以通过`SETNX`命令来设置键(key)并检查是否已存在,如果不存在则设置成功,表示获取锁。为了防止死锁,通常会为锁设置一个超时时间,利用`EXPIRE`命令进行设置。此外,解锁时需使用`...

    基于Redis实现分布式锁以及任务队列

    1. Redis分布式锁的核心是`setnx()`命令,它用于设置键值对,但如果键已存在,则返回失败。在分布式锁的实现中,通常会为锁设置一个超时时间,以防锁意外丢失。例如,使用`Lock:order`作为锁的标识名,通过`setnx()`...

    redis和zookeeper实现分布式锁的区别

    Redis分布式锁主要基于`SETNX`命令或者RedLock算法。`SETNX`命令在键不存在时设置键值,但如果存在则返回失败,这可以用来简单地实现锁。然而,单实例的Redis分布式锁存在一定的风险,如主节点故障可能导致锁无法...

    redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程.zip

    该工具包基于Redis的`SETNX`(设置如果不存在)命令和`EXPIRE`(设置过期时间)命令来创建和释放锁,确保了锁的互斥性和自动解锁功能。通过这种方式,多个服务实例可以在同一时间安全地访问共享资源,避免了并发冲突...

    分布式锁实现(基于redis-mysql)1

    本文主要探讨了三种常见的分布式锁实现方式,包括基于Redis、MySQL以及Zookeeper的实现方法。 **基于Redis实现分布式锁** Redis是一个内存数据库,其命令执行是单线程的,这使得它非常适合用来实现分布式锁。Redis...

    一个应用于springboot项目的,基于redis的分布式锁 可用于多节点项目防重复业务调用

    在Redis中,分布式锁通常通过`SETNX`(设置并返回是否成功)命令实现,当键不存在时设置键的值。为了防止锁的死锁,还需要配合`EXPIRE`命令设置超时时间。 这个项目中,开发者创建了一个自定义注解,例如`@...

    redis和redisson实现分布式锁

    Redis作为一款高性能的键值存储系统,常被用作实现分布式锁的工具,而Redisson是基于Redis的Java客户端,提供了丰富的数据结构和服务功能,包括对分布式锁的支持。本文将深入探讨如何使用Redis和Redisson来构建...

    基于redis和lua脚本的分布式锁的实现

    “基于Redis和Lua脚本的分布式锁的实现” 基于Redis和Lua脚本的分布式锁的实现是使用Redis和Lua脚本来实现分布式锁的技术。分布式锁是指在分布式系统中,多个节点之间需要协调和同步的机制,以避免同时访问共享资源...

    基于go和redis实现分布式锁

    总结,基于Go和Redis实现的分布式锁结合看门狗和红锁策略,能够在保证高可用性的同时,解决分布式环境中的并发控制问题。在实际应用中,还需要关注性能优化、错误处理和监控等方面,确保系统的稳定运行。

    redis面试题之分布式锁.zip

    Redis实现分布式锁通常基于两个命令:`SETNX`(Set if Not Exist)和`EXPIRE`。`SETNX`命令用于在键不存在时设置键的值,返回值为1表示成功,0则表示键已存在。`EXPIRE`命令用于为键设置过期时间,防止锁因意外情况...

    基于Redis实现分布式锁的使用方法详解.docx

    总结起来,基于 Redis 实现的分布式锁主要依赖 Redis 的原子操作,如 SETNX 和 Lua 脚本,确保加锁、解锁的互斥性。同时,通过设置过期时间和锁续约机制来防止死锁。在实际应用中,还需要考虑锁的可重入性、公平性、...

    基于Spring Boot框架的分布式锁服务.zip

    Redis分布式锁利用Redis的SETNX命令实现分布式锁,确保在分布式环境下对资源的互斥访问。 Redisson分布式锁使用Redisson库提供的分布式锁实现,提供更高级的功能,如锁的自动续期和可重入锁。 2. 锁的续期和释放...

Global site tag (gtag.js) - Google Analytics