Redblade 是一个Redis数据库对象关系映射(ORM)和索引工具
redis是目前最快的键值对内存数据库,一般用在需要应对超大规则并发应用和高速缓存的场合。 但其无索引、无外键、无约束,查询不便,多数情况下和其它数据库搭配使用。redblade可以帮助你自动实现索引和数据查询;
安装
你可以通过NPM安装, 同时它需要搭配node_redis驱动npm install redis
npm install redblade
初始化
你需要先安装redis驱动
var client = require('redis').createClient();
//选一个空数据库
client.select(4);
var redblade = require('redblade');
//schema: 存放schema定义文件的路径,可以不填,并稍后加载
redblade.init({ schema:'/path/to/your/schema/folder', client: client }, function(err) {
})
定义schema
这里定义了一个名为article的schema,并指定poster为索引字段(索引为无序集合),keywords为关键字字段(索引为有序集合,有两个参数,第二个参数为权重)
redblade.schema('article', {
"_id" : "id"
, "poster" : "index('user_article')"
, "keywords" : "keywords('articlekeys', return +new Date() / 60000 | 0)"
, "title" : "minlen(4)"
, "content" : "maxlen(6000)"
})
插入一条article数据
其中多余字段未在schema中定义,会被自动删除
redblade.insert('article', {
_id : '1234567890'
, poster : 'airjd'
, keywords : '信息技术,JavaScript,NoSQL'
, title : '测试用的SLIDE 标题'
, content : '测试用的SLIDE 内容'
, '多余字段' : '测试'
}, function(err) {
})
查询数据
根据schema中的索引查询此article: 注意,只有在schema中定义了 index 或 keywords索引的字段才能被查询,多个查询条件可以一起使用
redblade.select('article', { poster:'airjd' }, function(err, articles) {
console.log(articles[0])
})
//or
redblade.select('article', { keywords: 'NoSQL' }, function(err, articles) {
console.log(articles[0])
})
原理是什么
index:会自动根据插入的数据创建一个user_article:*的无序集合(因为无权重参数), 为1:N的关系,如需1:1可在schema中使用 unique('user_article')修饰
/*
set: "poster" : "index('user_article')" => user_article:[poster value]
*/
redblade.client.smembers('user_article:airjd', function (err, articleIDs) {
console.log(articlesIDs)
})
keywords:会自动根据数据创建articleskeys无序集合和 articlekeys:* 的有序集合
/*
sorted set: "keywords" : "keywords('articlekeys', return +new Date() / 60000 | 0)"
*/
redblade.client.smembers('articlekeys', function(err, keys) {
console.log(keys)
//['信息技术','JavaScript','NoSQL']
})
redblade.client.zrange('articlekeys:NoSQL', 0, 100, function(err, articleIDs) {
console.log(articleIDs)
//["1234567890"]
})
更新
注意此函数被设计成当数据不存在时会在redis新建一条
redblade.update('article', {
_id : '1234567890'
, content : '更新了测试用的SLIDE 内容'
}, function(err) {
})
删除
你可以使用多个条件进行查询或删除
redblade.remove('article', { poster: 'airjd', keywords: 'SQL' }, function(err, num) {
console.log(num)
redblade.client.zrange('articlekeys:NoSQL', 0, 100, function(err, members) {
//should be []
console.log(members)
})
})