Redlock 分布式锁

Redlock

一款基于redis实现的分布式锁的nodejs包

Github地址

基本实现方式

初始化

// redlock支持node redis, ioredis 或者 其他的redis包
var client1 = require('redis').createClient(6379, 'redis1.example.com');
var client2 = require('redis').createClient(6379, 'redis2.example.com');
var client3 = require('redis').createClient(6379, 'redis3.example.com');
var Redlock = require('redlock');

var redlock = new Redlock(
	// 支持单机或集群
	[client1, client2, client3],
	{
    
    
		// 预期的偏移时间
		// see http://redis.io/topics/distlock
		driftFactor: 0.01, // time in ms

		// 尝试获取锁的次数,之后报错
		retryCount:  10,

		// 尝试获取锁的时间间隔,单位ms
		retryDelay:  200,

		retryJitter:  200 // time in ms
	}
);

获取锁和释放锁

// 锁id
var resource = 'locks:account:322456';

// 持有锁的最大时长,也可以使用extend函数延时
var ttl = 1000;
// 获取锁
redlock.lock(resource, ttl).then(function(lock) {
    
    

	// 业务代码

	// 释放锁
	return lock.unlock()
	.catch(function(err) {
    
    
		// 当连接不到redis时,持有的锁会过期,并且报错
		console.error(err);
	});
});

延时处理

redlock.lock('locks:account:322456', 1000).then(function(lock) {
    
    

	// 业务代码

	// 如果还需要处理其他业务逻辑,可以使用extend函数延长锁的持有时间,并且可以一直循环延时
	return lock.extend(1000).then(function(lock){
    
    

		// 业务代码

		// 释放锁
		return lock.unlock()
		.catch(function(err) {
    
    
			// 当连接不到redis时,持有的锁会过期,并且报错
			console.error(err);
		});
	});
});

猜你喜欢

转载自blog.csdn.net/BDawn/article/details/108026145