2015-05-05 49 views
0

我来自传统的SQL背景,正在学习Redis。具体来说,我试图与node.js一起运行redis数据库从node.js中查询redis

我已经完成了redis的初始设置并尝试了几条基本命令。不过,我想创建一个数据库,其中包含一个ID,学生3分,开始日期和结束日期。

我相信我可以创建一个对象,存储特定ID的所有值(例如obj),并使用set函数保存有关该ID的详细信息。

client.set(ID, obj, function(err, reply) { 
    console.log(reply); 
}); 

如果我把client.get(ID),它将返回我在上面保存的对象。不过,我想从特定的开始日期和结束日期获取ID的值。 在SQL中它会是这样的:SELECT * FROM TABLE WHERE StartDATE>='' and endDate='' and id= ID;

什么是在redis中的替代方案?我一直无法找到node.js中redis的任何查询示例。

同时插入到数据库中,插入整个对象是最好的方式吗?

回答

2

同时在插入数据库时​​,插入整个对象是最好的方法呢?

不,不适用于您提出的示例查询。 Redis不是传统的数据库,它更多like a key value store,它不理解你的对象的结构。

如果您想查询您的建议,您可能会使用错误的工具。

在redis中,您不会存储对象,但可以存储更简单的结构,如散列。从node_redis例子偷:

client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234"); 
client.hgetall("hosts", function (err, obj) { 
    console.dir(obj); 
}); 

输出:

{ mjr: '1', another: '23', home: '1234' } 

有关详细信息,请Redis的文档在这里:http://redis.io/commands

+0

我的对象是JSON格式。我将它转换成一个字符串并输入到数据库中。你能指导我如何查询特定日期吗? – user1692342

+0

你不能。 Redis不理解你的JSON字符串。为了能够按日期进行查询,您需要将日期转换为您将映射到对象ID的字符串键,或将它们存储为排序集以进行范围查询。总之,你应该使用不同的数据库。 Postgres和MongoDB是支持存储JSON文档和查询属性的流行选项。 –

1

这个问题实际上是由两个:存储对象和索引。

您可以用许多不同的方式将对象存储在Redis中 - 诀窍是找到最适合您数据和操作的数据结构。在Redis字符串中存储JSON字符串非常简单,但请注意,任何更新都需要解析整个JSON,然后进行修改,然后重写所有内容(小技巧:如果以这种方式进行操作,请查看Redis的Lua脚本特别是学习使用cjson库 - 在这种情况下它可能是非常宝贵的)。或者,您可以将对象分解为Redis哈希 - 这稍微复杂一点,因为它需要一些手动映射,但允许字段级访问。 OTOH,如果您尝试从Hash数据类型重新组装JSON,这种方法可能会遇到挑战。

Redis没有内置索引以便通过特定属性(例如创建日期)获取数据,您需要在Redis中创建和维护索引式数据结构。使用Redis的Sorted Sets来完成您要查找的一种方法。将所有(obj)ID作为成员保留一个有序集合,并将每个成员的得分设置为其创建日期(例如,在unix时期)。然后,要获得两个给定日期之间的所有ID,请使用Redis'ZRANGEBYSCORE

更多指针:

+1

感谢您的信息和链接。真的有帮助! – user1692342

0

您可以按照给定的例子:

var redis = require('redis'); 
var port=13235;//Your Redis cloud port number 
var host='redis-13235.c14.us-east-11-12.ec4.cloud.redislabs.com';//Your redis cloud host 
var pass='password';//Redis cloud password 
var client = redis.createClient(port,host, {no_ready_check: true}); 
client.auth(pass, function (err) { 
    if (err) throw err; 
}); 
client.on('connect', function() { 
    console.log('connected......\n welcome to redis cloud !!!'); 
}); 

for(var i=0;i<10;i++){ 
client.set('TEST_TIME'+i,new Date().getTime()); 
} 
for(var i=0;i<10;i++){ 
client.get('TEST_TIME'+i, function (err, reply) { 
    console.log(reply.toString()); 
}); 
} 

检查下面的链接了解更多信息:https://www.sitepoint.com/using-redis-node-js/

+0

@chade_感谢您的建议。我已经删除了图像,并发布了代码,只需稍加修改即可。 – Alex