2016-04-24 83 views
0

我正在開發個人項目以瞭解Redis。我試圖用它作爲管理酒店的數據庫。我正試圖圍繞如何管理預訂。Redis建模保留

問題是,有多個房間,每個房間可以有多個預訂,存儲日期從和日期到。我只是不確定我能如何模擬這個模型,以便有效地找到給定時期的空房間。

目前,我一直在考慮爲每個單獨的房間保存預訂,但是這樣我就必須逐個遍歷房間,直到找到合適的房間爲止。

歡迎任何輸入。謝謝

+0

做保留有最小固定時間長度嗎?例如,任何保留必須至少有一天,從中午開始和結束? – aembke

+0

是的,這正是你描述它的方式。預訂至少24小時,開始/結束於中午。另一方面,沒有最大長度。 –

回答

1

一種方法是使用集合來表示一個日期範圍,其中每個集合代表一天,並由一個整數標識。然後一套會員將代表當天哪些房間可供預訂。由於預訂在每天的同一時間開始和結束,並且可以在整天內測量任何預訂,因此您可以將任意一天表示爲整數。例如,使用Unix紀元(1970年1月1日)爲開始時間,今天(2016年4月24日)將是16915.或者在JavaScript:

Math.floor(new Date().getTime()/(1000 * 60 * 60 * 24)); 

然後,您可以找到可用的會議室給定日期通過在輸入範圍內的日期間設置一個交集。 This gives you O(n * m) lookup time其中n是最小集合的大小,m是集合的數量。由於該集合最多包含每個房間,因此這意味着n以房間總數爲界。例如:

var _ = require("lodash"); 

var dateToInt = function(date){ 
    return Math.floor(date.getTime()/(1000 * 60 * 60 * 24)); 
}; 

var roomsInRange = function(client, start, end, callback){ 
    client.sinter(_.range(dateToInt(start), dateToInt(end)), callback); 
}; 

當用戶預約日期範圍的房間時,您將從日期範圍中的每個集合中刪除該房間號碼。

var _ = require("lodash"); 

var dateToInt = function(date){ 
    return Math.floor(date.getTime()/(1000 * 60 * 60 * 24)); 
}; 

var reserveRoom = function(client, start, end, room, callback){ 
    var trx = client.multi(); 
    _.each(_.range(dateToInt(start), dateToInt(end), function(day){ 
    trx.srem(day, room); 
    }); 
    trx.exec(callback); 
}; 

這種方法複製大量的數據,每個房間都代表多次,但大小是由房間的數量,你需要是最大的日期範圍爲界。例如,我不認爲用戶可以提前5年預訂預訂,也不允許過去預訂預訂,這意味着除了限制輸入範圍的上限之外,您還可以清理過去的條目。鑑於密鑰是整數,房間也可能以整數表示,如果這一年的預訂花費超過1或2 MB,我會感到驚訝。

+0

這是一個解決問題的非常有趣的方式,它應該適用於我正在做的事情。它也使用redis的強項。我不確定我是否理解最後一個例子中的異步行爲。你能詳細說明一下嗎? –

+0

哎呀,我在使用redis事務之前從之前的編輯中找到了它。現在刪除它。 – aembke

+0

清除它。您提供的解決方案非常清晰,思路清晰,給了我一個關於如何在使用redis時創造性思考的新視角及其功能集。感謝您花時間寫下所有這些。 –