redis lua

1
2
3
4
5
6
7
8
--getAndUpdateRpcConfig.lua
local test = {
aa=1,
bb='bb'
}

-- redis.call('set','keykey','myval')
return cjson.encode(test);

使用

1
2
3
4
5
var redisluasha = new RedisLuaSha(this.rpcredis);
//redisluasha >自己封装的
redisluasha.evalsha('getAndUpdateRpcConfig',0,function(err,res){
console.log(err,res);
});
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;

redis lua 介绍
http://redis.io/commands/eval

感谢您的阅读,本文由 smallwhite's Blog 版权所有。如若转载,请注明出处:smallwhite's Blog(https://smallwhite.ml/pub/uncategorized/redis-lua-and-nodejs.html
游戏中学会写代码:这些编程学习网站不容错过
一个 while 实现 C 翻转单向链表