Redlock
一款基于redis实现的分布式锁的nodejs包
基本实现方式
初始化
// 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);
});
});
});