redis分布式锁实现n台服务器跑定时任务,确保只有一台服务器运行

26 篇文章 0 订阅

1,redis分布式锁 setnx方法实现原子操作,确保并发安全

	setnx(key,v);	//只用到key  value用key值即可
		不存在 返回 1
		存在    返回 0
		
	expire(key,seconds);seconds是过期时间 单位 秒
查询过期时间
ttl key 
	返回-1 		key未设置过期时间
	返回-2 		key已过期
	返回正数  	则是过期时间 秒

2,我使用redis分布式锁的基本思路

1 任务运行  执行setnx 如返回1后,设置key过期间,(为了确保下次正常运行),然后再执行任务!
2 各个服务器时间必须一致,确保并发安全! 根据业务需要设置过期时间!
例如定时任务(设置过期的时间>大于服务器误差时间即可)
3 为什么不用del(k);? 以防删除失败!导致任务下次无法运行

示例代码

/**
	 * redis 实现原子操作 不存在1 存在0
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public static int setnx(String key,String value) {
		Jedis jedis = null;
		try {
			jedis = ConnectionManager.getConnection();
			int j=jedis.setnx(key, value).intValue();
			//添加key成功 设置过期时间
			if(j==1){
				int seconds=59;
				jedis.expire(key, seconds);
			}else{
				//没有设置过期时间 会返回-1 del掉
				Long lt=jedis.ttl(key);
				if(lt==-1){
					jedis.del(key);
				}
				
			}
			return j;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				ConnectionManager.closeConnection(jedis);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return 0;
	}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现 Redis 分布式锁,可以使用 RedLock 算法。RedLock 是一种基于 Redis分布式锁算法,它可以确保多个 Redis 实例上安全地获取和释放锁。 以下是实现 Redis 分布式锁的步骤: 1. 安装和配置多个 Redis 实例:在不同的服务器上或者同一台服务器上启动多个 Redis 实例,并确保它们在不同的端口上监听。 2. 在应用程序中使用 Redis 客户端连接到多个 Redis 实例。 3. 获取锁:在尝试获取锁之前,生成一个唯一的标识符(例如,使用 UUID),作为锁的名称。然后,在每个 Redis 实例上使用 SETNX 命令(SET if Not eXists)尝试设置该名称的键值对。 - 如果某个实例成功设置了锁并获得了锁的拥有权,则认为获取锁成功。 - 如果多个实例同时尝试设置同一个锁,并且只有其中一个实例成功设置了该锁,则认为获取锁成功。 - 如果多个实例同时尝试设置同一个锁,并且多个实例都成功设置了该锁,则认为获取锁失败。 4. 释放锁:要释放锁,请在每个 Redis 实例上执行 DEL 命令,删除之前设置的键值对。 需要注意以下几点: - 在获取锁时,可以设置一个过期时间来防止锁被长时间占用。可以使用 SETEX 命令来设置键值对的过期时间。 - 在释放锁时,要确保使用正确的锁名称,并且只有拥有该锁的实例才能释放锁。 使用 RedLock 算法可以确保多个 Redis 实例上实现安全的分布式锁。它提供了一种可靠的方式来处理在分布式系统中的并发访问问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值