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