在./server/config/%ENV%/setting.js里,model.redis节点配置了Redis的连接设置:
/* ./server/config/%ENV%/setting.js */
module.exports = {
...
model: {
//mongodb connection config
db: { ... },
//redis connection config
redis: {
host:"127.0.0.1",
port:6379,
//prefix defines the prefix string of redis key
prefix:{
"*": "weroll_app_", //default prefix
common: "weroll_common_" //another prefix
},
ttl:24 * 60 * 60, //sec,
pass:"123456", //password for redis connection
maxLockTime:2 * 60, //sec
releaseLockWhenStart: true
}
},
...
}
对于weroll应用来说,Redis连接并不是必须的,如果你不需要连接Redis,可以将setting.js中的model.redis节点注释。
weroll使用的是redis库连接和操作Redis:
npm主页:https://www.npmjs.com/package/redis
github主页:https://github.com/NodeRedis/node_redis
Redis命令参考:http://redisdoc.com/
在weroll应用中,通常使用Model对象进行MongoDB和Redis连接,示例代码如下:
// ./main.js
const App = require("weroll/App");
const app = new App();
const Setting = global.SETTING;
app.addTask((cb) => {
const Model = require("weroll/model/Model");
Model.init(Setting.model, (err) => {
if (!err) {
//now, mongodb & redis connection are both setup.
}
cb(err);
});
});
//more init codes...
app.run();
weroll对redis库进行了简单的封装了,你可以使用 weroll/model/Redis 对象进行操作:
const Redis = require("weroll/model/Redis");
//callback
Redis.set("name", "Jay", (err, res) => {
console.log(arguments);
});
//promise
Redis.set("name", "Jay").then(res => {
console.log(res); //echo "OK"
});
//async & await
async () => {
const result = await Redis.set("name", "Jay");
console.log(result); //echo "OK"
}
weroll/model/Redis 对象仅仅封装了一些常用的redis命令,如set, get, del和Hash操作等,如果你想使用更多的redis命令,可以使用Redis.do方法:
async () => {
//Redis.do(COMMAND, [ key, arguments1, arguments2, ... ], [callBack]);
const result = await Redis.do("set", [ Redis.join("name"), "Jay" ]);
console.log(result); //echo "OK"
}
示例代码:
const tasks = [
[ "set", Redis.join("name"), "JayX", (err, res) => {
console.loe(res); //echo "OK"
} ],
[ "get", Redis.join("name"), (err, res) => {
console.loe(res); //echo "JayX"
} ]
];
Redis.multi(tasks, err => {
err && console.error(err);
});
在weroll应用中,redis的key通常是这样的规则:
/** 在./server/config/%ENV%/setting.js中:
model: {
redis: {
...
prefix:{
"*": "weroll_test_", //default prefix
common: "weroll_common_" //another prefix
site: "weroll_site_" //another prefix
}
}
} */
//your code
Redis.set("name", "JayX");
//actually ---> key: "weroll_test_name", value: "JayX"
//use 'common' prefix
Redis.set("@common->name", "JayX");
//actually ---> key: "weroll_common_name", value: "JayX"
//use 'site' prefix
Redis.set("@site->name", "JayX");
//actually ---> key: "weroll_site_name", value: "JayX"
对于Redis.do和Redis.multi操作,需要直接传递完整的key值,使用Redis.join可以得到完整的key值,示例代码如下:
const Redis = require("weroll/model/Redis");
const fullKey = Redis.join("name");
console.log(fullKey); //echo "weroll_test_name"
Redis.do("set", [ fullKey, "Jay" ]);
const tasks = [
[ "get", Redis.join("name"), (err, res) => {
console.loe(res); //echo "JayX"
},
[ "get", "name", (err, res) => {
console.loe(res); //echo undefined
} ]
];
Redis.multi(tasks, err => {
err && console.error(err);
});
使用 Redis.createClient 方法能够创建新的redis连接实例,返回RedisClient对象,示例代码如下:
const Redis = require("weroll/model/Redis");
//使用新的连接配置
const client1 = Redis.createClient({ host:"127.0.0.1", port:6379, pass:"12346" });
//使用setting.js中的连接配置
const client2 = Redis.createClient();
//侦听connect事件
const client3 = Redis.createClient(null, client => {
console.log(client3 === client); //echo true
//do something after connection setup
});
//Or
const client4 = Redis.createClient();
client4.on("connect", () => {
//do something after connection setup
});
Redis消息推送和消息接收由2个不同的reids连接实例来实现,详细请参考Redis命令参考-发布与订阅
示例代码如下:
const Redis = require("weroll/model/Redis");
const config = { host:"127.0.0.1", port:6379, pass:"12346" };
Redis.createClient(config, (sub) => {
sub.on("message", (channel, message) => {
console.log(channel); //echo "talk"
console.log(message); //echo "hi"
});
sub.subscribe("talk", (err) => {
if (err) return console.error(err);
Redis.publish("talk", "hi");
});
});
需要注意的是,请不要使用weroll/model/Redis对象来订阅消息,请使用新的连接实例进行消息订阅。