1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| //redis_lua.js /** * Created by mac on 16/4/20. */
var fs = require('fs'); var path = require('path');
module.exports = function (redis) { return new RedisLuaSha(redis); }; /** * luasha map * @type {{}} */ var redisLuashaMap = {}; var luadir = path.join(__dirname,'redislua/');
/** * 传入redis client. 全局缓存 相同redis client的 sha map * @param redis * @constructor */ var RedisLuaSha = function(redis){ this.redis = redis; if(!redisLuashaMap[redis]){ redisLuashaMap[redis] = {}; }
};
var prot = RedisLuaSha.prototype;
/** * 文件名后缀可有可无 * @param fname * @param cb */ prot.getShaByFileName = function(fname,cb){ var self = this; var ret = redisLuashaMap[self.redis][fname]; if(!ret){ console.log('begin load luafile:'+fname); if(!/\.lua$/.test(fname)){ fname = fname+'.lua'; } fs.readFile(path.join(luadir,fname),function(err,buf){ if(err){ throw err; } var str = buf.toString(); // console.log('load file end:'+fname,'\n',buf); self.redis.script('load',str,function(err,sha){ if(err){ cb(err); throw err; } redisLuashaMap[self.redis][fname] = sha; cb(null,sha); }); });
}else{ cb(null,ret); } };
/** * 语法糖 功能同 redis.evalsha 只是 第一个参数是 lua文件名.而不是 sha 文件名后缀可有可无 */ prot.evalsha = function(luafilename){ var argu = arguments; var fname = argu[0]; var self= this; var cb = argu[argu.length-1]; if(typeof(cb)=='function'){ cb = null; } self.getShaByFileName(fname,function(err,sha){ if(err){ if(cb){ cb(err); } console.error('get sha by filename err:',fname); return; } argu[0] = sha; self.redis.evalsha.apply(self.redis,argu); }); };
module.exports = RedisLuaSha;
|