autoredis是一个数据库操作的帮助类,简单的描述就是,它能将mysql的查询结果自动存入redis集群之中,在缓存过期以前都不会再次从mysql中读取
安装方式
npm install autoredis
请按照下面的步骤正确的配置你的参数
- 将config.json中的配置复制到你项目的配置文件中
- 在你项目的启动文件中,按照index.js中第一行的做法,将配置正确的设置好
- 或者你可以直接修改config.json文件中的配置
- 最终global对象中结构如下所示
global.config={
db:{
master:{...},
slave1:{...},
slave2:{...}
},
cache:{...},
mongo:{...}
}
它能做到的事情
- 使用连接池进行操作,普通增删改查不用每次都打开关闭连接
- 封装了事务操作
- 传入特定的一个参数,当前查询结果会自动缓存到redis集群中
注意事项
- 由于mysql本身的机制,连接池每隔8小时将自动断开长连接,虽然我加上了防止出错的设置,但是不保证永远不出错
- 封装的事务操作的代码是从一位国外友人的github上抄来的,时间太长了忘记出处了
- 事务操作的表,必须是inno引擎(这个龟腚自然不是我说了算的)
使用示范
普通查询
var db = require('autoredis').mysql;
//cacheKey针对每一个查询都要设置一个不同的值
//在node.js中,最简单的唯一值就是req.originalUrl
var cacheKey = "testCacheKey";
var sql = 'SELECT * FROM tb_mem_user where mobile=?';
var param = ['18575608334']
db.query(sql, param, cacheKey)
.then(function(data) {
//data包含2个属性:sql, rows
//sql为null表示命中缓存
}, function(err) {
})
事务查询
var db = require('autoredis').mysql;
var ids = [1, 2, 3, 4, 5];
var sql_list = [];
var paras = [];
for (var i = 0; i < ids.length; i++) {
sql_list.push("update tb_ad_info set isdeleted = true where id = ? and isdeleted = false");
paras.push([ids[i]]);
}
db.transaction(sql_list, paras, function(rows, err) {
if (err) {
//失败
} else {
//成功
}
});
使用示范
设置缓存
var cache = require('autoredis').cache;
//简单设置
cache.set('key', 'value')
//设置超时时间(单位:秒)
//超时时间设置0为删除缓存,设置-1为永不过期
cache.set('key', 'value', 300)
//利用回调
cache.set('key', 'value', 300, function(err, result){
//result有值就是正确,为null就是失败
})
获取缓存
var cache = require('autoredis').cache;
cache.get('key')
.then(function(v){
//不用再次判断,进入这里表示一定是拿到缓存了
}, function(err){
//err === "1" 表示不存在
//err === "0" 表示配置文件中,cache节点的enable属性设置成了false,缓存未启动
//err返回了一个错误对象,表示拿缓存的过程中,有某个步骤执行异常
})
使用示范
添加引用
var mongo = require('autoredis').mongo;
获取集合并进行增删改查
mongo.collections('media')
.then(function(list) {
list.insert({type:'manga', title: 'one piece', volumes: 612, read:521})
list.update({title: 'one piece'}, {$inc: {read:4}})
list.update({title: 'one piece'}, {$set: {genre:'sci-fi'}})
list.update({title: 'one piece'}, {$push: {author:{$each: ['griffin,peter', 'griffin,brian']}}})
list.update({title: 'one piece'}, {$push: {author:{$each: ['griffin,meg', 'griffin,louis'], $slice: -2}}})
list.update({title: 'one piece'}, {$addToSet: {author:{$each: ['griffin,peter', 'griffin,brian']}}})
list.update({title: 'one piece'}, {$pop: {author:1}})
list.update({title: 'one piece'}, {$pull: {author:'griffin,peter'}})
list.update({title: 'one piece'}, {$pullAll: {author:['griffin,louis']}})
list.find({title: 'one piece'}).toArray(function(err, r){console.log(r);})
})
.catch(function(err) {
console.error(err)
})
创建索引
mongo.ensureIndex('media', { price: 1 })
.then(function(r) {
console.log(r)
})
原子操作,查找并且更新
mongo.findOneAndUpdate(
'media',
{ title: 'one piece' },
{ genre: 'sci-fi4' },
{
sort: { title: -1 },
returnOriginal: false,
upsert: false,
maxTimeMS: 100
})
.then(function(result) {
console.log('findOneAndUpdate')
console.log(result)
})
.catch(function(err) {
console.error(err)
})
创建表关联(DBRef类型)
mongo.collections("parent")
.then(function(db) {
db.save({
title: 'parent'
}).then(function(r) {
console.log(r.ops._id)
})
})
mongo.collections("child")
.then(function(db) {
//创建关联
db.save({
title: 'child2',
ref: mongo.newDBRef('parent', '56ca863a5e33ae1046cd931c')
}).then(function(r) {
console.log(r.ops)
})
//按关联条件提取数据
db.find({
title: 'child'
}).toArray(function(err, r) {
var l = r[0].ref;
l.fetch().then(function(result) {
console.log(result)
})
})
})
Map-Reduce操作
mongo
.collections("testgroup")
.then(function(db) {
var map = function() {
var value = {
num: this.num,
count: 1
};
emit(this.name, value)
};
var reduce = function(name, val) {
reduceValue = {
num: 0,
count: 0
};
for (var i = 0; i < val.length; i++) {
reduceValue.num += val[i].num;
reduceValue.count += val[i].count;
}
return reduceValue;
};
var finalize = function(key, value) {
value.avg = parseInt(value.num / value.count);
return value;
};
var options = {
query: { num: { $gt: 500 } },
out: { inline: 1 },
verbose: true,
finalize: finalize
};
var callback = function(err, result, timeResult) {
console.log(result)
console.log(timeResult);
}
db.mapReduce(map, reduce, options, callback)
})