2015-05-05 48 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