基于redis实现的锁
2016-05-26 11:45
519 查看
主要的方法有三个:
PS:支持callback and promise.
实现比较简单,100行内,有兴趣的可以在 https://github.com/navyxie/redlock-node href="https://github.com/navyxie/redlock-node" target=_blank> 查看源码
lock(加锁)
unlock(解锁)
extend(更改锁过期时间)
主要源码: 加锁:
Redlock.prototype.lock = function(resource,ttl,callback){ var self = this; var _val = _random(); return new Promise(function(resolve, reject) { var lock = new Lock(self, resource, _val); self.client.SET(resource,_val,'EX',ttl,'NX',function(err,data){ if(!err && data === 'OK'){ return resolve(lock); }else{ var err = err || 'resource: '+resource+' is locked.'; self.emit('lockError', err); return reject(err); } }) }).asCallback(callback); }
解锁:
Redlock.prototype.unlock = function(lock,callback){ var self = this; return new Promise(function(resolve, reject) { if(typeof lock !== 'object') return reject('unlockError:lock is not object.'); self.client.GET(lock.resource,function(err,data){ if(!err && data === lock.value){ self.client.DEL(lock.resource,function(err){ if(err){ self.emit('unlockError',err); return reject('unlockError:'+err); }else{ return resolve(lock); } }) }else{ self.emit('unlockError',err || 'resource:' + lock.resource + ' unable to unlock.') return reject('unlockError:' + err || ('resource:' + lock.resource + ' unable to unlock.')); } }) }).asCallback(callback); }
扩展锁:
Redlock.prototype.extend = function(lock,ttl,callback){ var self = this; return new Promise(function(resolve, reject){ if(typeof lock !== 'object') return reject('unlockError:lock is not object.'); self.client.GET(lock.resource,function(err,data){ if(!err && data === lock.value){ self.client.expire(lock.resource,ttl,function(err,data){ if(!err && data === 1){ return resolve(lock); }else{ self.emit('extendError', err); return reject('extendError:'+err); } }); }else{ self.emit('extendError', err); return reject('extendError:'+err); } }) }).asCallback(callback); }
用法
var client = require('redis').createClient('port','host'); var redlock = new RedLock(client); var lock; `callback`: //lock redlock.lock('test-resource-lock',3,function(err,lockInstance){ lock = lockInstance; done(err); }); //unlock redlock.unlock(lock,function(err,data){ done(err); }); `promise`: redlock.lock('test-resource-lock-promise',3).done( function(lock){ //todo redlock.unlock(lock); }, function(){ } )
PS:支持callback and promise.
实现比较简单,100行内,有兴趣的可以在 https://github.com/navyxie/redlock-node href="https://github.com/navyxie/redlock-node" target=_blank> 查看源码
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 如何在 Fedora 上安装 MongoDB 服务器
- PHP添加yaf xhprof mongodb 同理
- redis安装问题小结
- mongodb安装
- 如何在 Ubuntu 上安装 MongoDB
- 信息安全聚合 Sec-News 的重构之路
- 使用 Redis 和 Python 构建一个共享单车的应用程序
- Redis偶发连接失败案例实战记录
- 使用ruby部署工具mina快速部署nodejs应用教程
- Redis中实现查找某个值的范围
- win 7 安装redis服务【笔记】
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- Redis和Memcached的区别详解
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- Redis sort 排序命令详解
- 用Redis实现微博关注关系
- Redis实现信息已读未读状态提示
- redis中修改配置文件中的端口号 密码方法