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)
    })
})